1 марта 2014 г.

Как настроить ШИМ на AVR

Что такое ШИМ
Таймеры и счётчики

В AVR микроконтроллерах, ШИМ реализован аппаратно, остаётся только расставить нужные биты и он готов к работе.



В общем у таймера есть регистр сравнения OCR** и когда значение в таймере совпадает со значением регистра сравнения OCR** может произойти 2 вещи:

  • Прерывание
  • Изменение состояния внешнего вывода сравнения OC**
Выводы OC** это специальные ножки микроконтроллера
Теперь мы можем настроить ШИМ когда счётчик досчитает до значения OCR** напряжение на выбранной нами ножке OC** измениться от 5 до 0. Когда таймер досчитает до конца и начнёт считать сначала изменим напряжения с 0 до 5, на выходе у нас будут прямоугольные импульсы

Есть 3 режима работы ШИМ 

СТС (сброс при совпадении) - Это можно назвать ЧИМ частотно-импульсно моделированный сигнал, когда таймер досчитает до значения OCR** он сбрасывается и меняет значение OC** на противоположное. Таким образом скважность ШИМ всегда одинаковая.

Это используют когда нужно отсчитывать точные периоды, или генерировать прерывания через определённое время.

Fast PWM (быстрый ШИМ) - счётчик считает от 0 до 255, после чего сбрасывается в 0.
Когда значение таймера совпадает с OCR** соответствующий вывод сбрасывается в 0, при обнулении ставиться 1.

Чаще всего используется как обычный ШИМ.

Phase Correct PWM (ШИМ с точной фазой) - в этом режиме счётчик считает от 0 до 255, а потом считает в обратном направлении до нуля. При первом совпадении с OCR** вывод сбрасывается в 0, при 2 совпадении (когда счётчик идёт обратно), ставиться 1.

Используют для того чтобы не сбивалась фаза при изменении скважности.


Ок, самые главные здесь это регистры TCCR1A и TCCR1B. 







Если мы хотим работать с выводом OC1A ставим биты в COM1A1 COM1A0 
Вообще "/" означает ИЛИ. TCNT1 = OCR1A для ШИМ на выводе OC1A


Timer/Counter Mode of Operation - режим работы таймера/счетчика.

Top - значение TCNT1 при котором происходит переключение значения вывода OC**.

TOV1 Flag Set on - при каких значениях устанавливается бит регистра GIFR

Выбираем из последней таблицы тот режим который нам нужен, не смотрим на Top. Из 2 таблицы выбираем любой из 2 последних вариантов. Остаётся только расставить нужные биты в регистрах.


#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>

int main()
{
 DDRD = 0xFF;
 OCR1A=0xC0;   // Сравниваем с этим значением
 OCR1B=0x40;

 //Настройка ШИМ и таймера
 TCCR1A|=(1<<COM1B1)|(0<<COM1B0)|(1<<WGM10)|(0<<WGM11)|(1<<COM1A1)|(0<<COM1A0);
 TCCR1B|=(1<<WGM12)|(0<<WGM13)|(1<<CS10);

 while(1);
}

Здесь мы настроили работу счётчика (в бит CS10 выставили 1, он считает с частотой МК про то как настроить частоту таймера здесь )
и выставили режим Fast PWM 8 Bit устанавливая в выводах OC1A и OC1B 0 при совпадении.


OCR1A=0xC0;   Синий сигнал
OCR1B=0x40;  Желтый сигнал

Как видно с показаний осциллографа, у синего сигнала скважность больше, т.к  когда счётчик досчитывает до 255 он сбрасывает своё значение в 0 и по нашим настройкам устанавливает на выводе OC1A 0, но когда значение счётчика совпадает с OCR1A устанавливает 1.
0xC0 >0x40 поэтому  на OC1A быстрее ставиться 1.

Источники:
easyelectronics.ru
samou4ka.net
roboforum.ru/wiki/

Комментариев нет :

Отправить комментарий