Урок 13. Аппаратная ШИМ на микроконтроллере

В этом уроке мы научимся реализовывать ШИМ сигнал на микроконтроллере AVR с помощью BASCOM-AVR. В микроконтроллерах AVR, ШИМ можно реализовать посредством таймеров, для этой цели в микроконтроллере есть ШИМ выходы на порты вводавывода. Например, в микроконтроллере Attiny13 есть один таймер (Timer0) и два канала вывода ШИМ Pwm0a и Pwm0b, которые находиться на портах PB.0 и PB.1. В документации на микроконтроллер ШИМ каналы подписываются так: OC0A – ШИМ канал A на таймере 0, OC0B – ШИМ канал B на таймере 0, OC1A – ШИМ канал A на таймере 1, OC1B – ШИМ канал B на таймере 1 и т.д.

Работа с ШИМ в микроконтроллере
Для начала работы нужно сконфигурировать таймер на работу ШИМ для этого есть команда:
Config Timer1 = Pwm, Pwm = Разрядность, Compare A Pwm = Состояние канала A, Compare B Pwm = Состояние канала B, Prescale = Частота ШИМ
Разрядность можно задать 8, тогда будет скважность ШИМ от 0 до 255. Для Timer1 разрядность можно задать 9 или 10. Состояние канала A или B можно задать Clear Up – скважность при 0 = логической 1 и Clear Down – скважность при 0 = логической 0. Частоту ШИМ можно задать: 1, 8, 64, 256 и 1024.
Пример команды конфигурирования: Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8
После конфигурирования таймера нужно сконфигурировать порты ШИМ на вывод командой Config порт = Output, например: Config Portb.0 = Output
Потом нужно запустить таймер командой Start таймер, например: Start Timer0.
Теперь можно записать скважность в ШИМ канал для канала A таймера 0 это можно сделать так: Pwm0a = скважность, например: Pwm0a = 150

Практический пример

Теперь давайте попробуем поработать с ШИМ на практике, сделаем простую моргалку которая будет плавно зажигать и тушить светодиоды. За основу возьмём микроконтроллер Attiny13 и два светодиода, соберём простую схему:

Распиновка разъема клавиатуры PS2

Теперь напишем простую программку на BASCOM-AVR, применяя полученные знания:

 $regfile = "attiny13.dat" $crystal = 9600000 Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8 Config Portb.0 = Output Config Portb.1 = Output Start Timer0 Do Incr Pwm0a Decr Pwm0b Waitms 5 Loop End 

Откомпилируем её, прошьём микроконтроллер и установим фьюз биты микроконтроллера на тактирование от внутреннего тактового генератора на 9.6 МГц без делителя на 8. Пример установки фьюз битов в программе SinaProg:

Фьюз биты

Я использовал свою отладочную плату и вот что получилось:

Плата

Скачать файлы для урока (проект в Proteus, исходник, прошивка) вы можете ниже

Урок 14. Программный UART в BASCOM-AVR

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
U1 МК AVR 8-бит ATtiny13 1
R1, R2 Резистор 150 Ом 2
R3 Резистор 10 кОм 1
D1, D2 Светодиод 2