Таймеры и счётчики
В AVR микроконтроллерах, ШИМ реализован аппаратно, остаётся только расставить нужные биты и он готов к работе.
В общем у таймера есть регистр сравнения OCR** и когда значение в таймере совпадает со значением регистра сравнения OCR** может произойти 2 вещи:
- Прерывание
- Изменение состояния внешнего вывода сравнения OC**
Выводы OC** это специальные ножки микроконтроллера
Теперь мы можем настроить ШИМ когда счётчик досчитает до значения OCR** напряжение на выбранной нами ножке OC** измениться от 5 до 0. Когда таймер досчитает до конца и начнёт считать сначала изменим напряжения с 0 до 5, на выходе у нас будут прямоугольные импульсы
Есть 3 режима работы ШИМ
СТС (сброс при совпадении) - Это можно назвать ЧИМ частотно-импульсно моделированный сигнал, когда таймер досчитает до значения OCR** он сбрасывается и меняет значение OC** на противоположное. Таким образом скважность ШИМ всегда одинаковая.
Это используют когда нужно отсчитывать точные периоды, или генерировать прерывания через определённое время.
Fast PWM (быстрый ШИМ) - счётчик считает от 0 до 255, после чего сбрасывается в 0.
Phase Correct PWM (ШИМ с точной фазой) - в этом режиме счётчик считает от 0 до 255, а потом считает в обратном направлении до нуля. При первом совпадении с OCR** вывод сбрасывается в 0, при 2 совпадении (когда счётчик идёт обратно), ставиться 1.
Если мы хотим работать с выводом OC1A ставим биты в COM1A1 COM1A0
Вообще "/" означает ИЛИ. TCNT1 = OCR1A для ШИМ на выводе OC1A
Timer/Counter Mode of Operation - режим работы таймера/счетчика.
Top - значение TCNT1 при котором происходит переключение значения вывода OC**.
TOV1 Flag Set on - при каких значениях устанавливается бит регистра GIFR
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
Top - значение TCNT1 при котором происходит переключение значения вывода OC**.
TOV1 Flag Set on - при каких значениях устанавливается бит регистра GIFR
Выбираем из последней таблицы тот режим который нам нужен, не смотрим на Top. Из 2 таблицы выбираем любой из 2 последних вариантов. Остаётся только расставить нужные биты в регистрах.
и выставили режим 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/
#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/
Комментариев нет :
Отправить комментарий