Широтно-Импульсная Модуляция (ШИМ, PWM) микроконтроллеров AVR

Просмотров: 64003Комментарии: 1
Электроника. СхемотехникаAVR.Начинающим

При рассмотрении работы таймера/счетчика 1 (см. Таймер счетчик МК AVR) пропустил описание ШИМа, но, думаю, статья о ТС1 будет не полной без описания режима ШИМ. Наиболее часто, наверное, в интернете можно встретить применение ШИМ для регулировки яркости светодиодов и скорости оборотов двигателя. Как же это работает? А очень просто, мы регулируем скважность импульсов и тем самым изменяем эквивалентное напряжение. Скважность это отношение длительности периода к длительности импульса. Чтобы получить из цифрового сигнала постоянный аналоговый можно воспользоваться интегрирующей RC цепочкой.
Таким образом на выходе получим напряжение соответствующее площади под импульсами. Отсюда следует вывод, что меняя скважность можем менять эквивалентное напряжение на выходе. Например, на выходе у нас 50%  высокий уровень, а 50% низкий, тогда эквивалентное напряжение будет равно половине от общего напряжения (если это выход МК и максимальная амплитуда импульса 5В, тогда напряжение будет равно 2.5В).
В микроконтроллере AVR ШИМ реализован аппаратно. Хотя, при желании его можно сделать на любом таймере используя прерывания. Как всегда рассмотрим биты регистров отвечающие за настройку режима ШИМ на примере МК mega8, а потом приведу простой пример для настройки какого-нибудь режима.

TCCR1A
Биты 7:4 COM1A1:COM1A0:COM1B1:COM1B0: определяют поведение выходов OC1A и OC1B (см. Таблицу 2 и 3).
Биты 1:0 WGM11:0: определяют режим работы ТС1 (см. Таблицу 1).

TCCR1B
Биты 4:3 WGM13:2: определяют режим работы ТС1 (см. Таблицу 1).
Небольшие комментарии к таблице:
  • Timer/Counter Mode of Operation - режим работы таймера/счетчика.
  • Top - значение TCNT1 при котором происходит переключение значения вывода OC1A/OC1B.
  • TOV1 Flag Set on - при каких значениях устанавливается бит регистра GIFR
Тут кратко хотелось бы описать режимы ШИМа.
  1. СТС (сброс при совпадении) - TC1 работает также как в обычном режиме, но TCNT1 сбрасывается при совпадении с регистром OCR1A или ICR1.
  2. Fast PWM (быстрый ШИМ) - режим позволяет генерировать сигнал ШИМ. В этом режиме ТС1 считает до определенного значения в зависимости от режима, сбрасывается в нуль и начинает считать заново.
  3. Phase Correct PWM (ШИМ с точной фазой) - в этом режиме ТС1 считает от нуля до определенного значения в зависимости от режима, а потом считает в обратном направлении до нуля.
Значения настраиваемые битами COM1A1:0 и COM1B1:0 при различных режимах ШИМ показаны в таблицах ниже
Теперь рассмотрим простой пример с комментариями. Чтобы воспользоваться этим примером, копируете его в новый проект WinAVR, компилируете и проверяете в Proteus'e, подключив к ножкам OC1A и OC1B осциллограф. Не забывайте про файл Makefile при создании нового проекта (см. Подключение библиотеки символьного LCD).

#include <iom8.h>
#include <avr/io.h>
#include <util/delay.h>
//TCCR1A
#define WGM11 1
#define WGM10 0
#define COM1A1 7
#define COM1A0 6
#define COM1B1 5
#define COM1B0 4
//TCCR1B
#define WGM13 4
#define WGM12 3
#define CS0 0
#define CS1 1
#define CS2 2
int main()
{
//устанавливаем на выход все ножки МК
DDRB=0xFF;
//заносим значения в регистры сравения
OCR1A=0x0080;
OCR1B=0x00EF;
//устанавливаем нужные биты регистров
//Fast PWM 8-bit
//OC1A устанавливается в 1 при совпадении (COM1A1=1, COM1A0=1)
//OC1B сбрасывается в 0 при совпадениии (COM1B1=1, COM1B0=0)
TCCR1A=(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<WGM10);
TCCR1B=(1<<CS0)|(1<<WGM12);
while(1);
}

Можно конечно подробно расписывать о каждом режиме ШИМ, но, надеюсь, для понимания достаточно и этого, а дальше каждый сможет настроить ШИМ так как ему будет нужно.

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

1 baigor 06-04-2013 19:47

Fast PWM в WINAVR не конфигурирутся. WINAVR пишет что 4 бит wgm13 регистра TCCR1B зарезервирован, хотя AtMega8 поддерживает этот режим.Есть ли какие обновления для этого режима?

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

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Вы можете войти под своим логином или зарегистрироваться на сайте.

(обязательно)