реклама на сайте
подробности

 
 
> Генератор прямоугольных импульсов на AVR
PhX
сообщение Nov 11 2008, 04:21
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249



Добрый день, необходимо управлять скоростью вращения шагового двигателя, для этого на плату управления двигателем нужно подавать прямоугольные импульсы с платы микроконтроллера.
Для начала написал это:
Код
#include <avr/io.h>
#include <avr/interrupt.h>

#define Frq 20 //Частота импульсов Гц


// Конфигурирование Timer1
void Timer1_init(void)
{
  TCCR1B |= 0x04; //Частота счета таймера Sclk/256
  TCCR1B |= 0x08; //Вкл CTC
  TCCR1A |= 0x40; //Активировать выход OC1A
  OCR1A = F_CPU/(256*Frq); //Определяем соответствующее значение для Frq
}

void Inter_init(void)
{
  TIMSK = 0x00; //Запрещаем все прерывания
  GIMSK = 0x00; //Запрет внешних прерываний
  cli(); //Общее запрещение прерываний;
}  

// Конфигурирование портов В/В
void Ports_init(void)
{
  DDRB = 0x0F; // PB1 Выход
}

int main (void)
{
  Ports_init();
  Timer1_init();
  Inter_init();
  while(1) {}  
  return 1;
}

Это работает нормально.
Теперь хочу плавно регулировать частоту:
Код
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define Frq 20 //Частота импульсов Гц

//Функция задания частоты
void SetSpeed(const unsigned int w)
{
  OCR1A = (F_CPU/w)>>8;
}

// Конфигурирование Timer1
void Timer1_init(void)
{
  TCCR1B |= 0x04; //Частота счета таймера Sclk/256
  TCCR1B |= 0x08; //Вкл CTC
  TCCR1A |= 0x40; //Активировать выход OC1A
  OCR1A = F_CPU/(256*Frq); //Определяем соответствующее значение для Frq
}

void Inter_init(void)
{
  TIMSK = 0x00; //Запрещаем все прерывания
  GIMSK = 0x00; //Запрет внешних прерываний
  cli(); //Общее запрещение прерываний;
}  

// Конфигурирование портов В/В
void Ports_init(void)
{
  DDRB = 0x0F; // PB1 Выход
}

int main (void)
{
  unsigned int i;
  Ports_init();
  Timer1_init();
  Inter_init();
  while(1)
  {
    while (i<5000)
    {
        SetSpeed(i); i++;
        _delay_ms(10);
    }
    _delay_ms(1000);
    while (i>2)
    {
        SetSpeed(i); i--;
        _delay_ms(10);
    }
  }  
  return 1;
}

Это работает весьма странно... Иногда нормально, а иногда импульсы прекращаются и на ноге OC1A устанавливается 0 или 1. 07.gif Прерывания вроде бы отключены.


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ARV
сообщение Nov 11 2008, 05:41
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



...

Сообщение отредактировал ARV - Nov 11 2008, 05:43


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016