Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 9. Программирование таймеров 259 получить искомые 1 0 миллисекунд (полпериода частоты 50 Гц) : 1 0 - 2 · 3 1 250 = = 3 1 2,5 . Если округлим до целого 3 1 2, то получим частоту 50,08 Гц, что укладыва ется в требования ГОСТ (50 ±0,2 + ±0,4 Гц) . Теперь посмотрим, как все сказанное реализовать программно. ЗАМЕТКИ НА ПОЛЯХ Кстати , а как сделан ШИМ-сигнал в Ardu iпo? Если вы заглянете в описание функции analogwrite ( ) на любом из официальных Аrduiпо-сайтов, то узнаете, что в современ ных версиях, где стоит контроллер ATmega328 , ШИМ-сигнал работает на цифровых выводах 3 , 5 , 6 , 9 , 1 О и 1 1 , а на первой версии , где еще применялся ATmega8, он ра ботал только на выводах 9 , 1 О и 1 1 . Теперь посмотрим на картинку соответствия вы водов Arduiпo и контроллера ATmega328 , ссылка на которую имеется на всех странич ках с описанием, например, Aгduiпo Uпо . Из этой картинки мы узнаем, что выводы 9, 1 0 и 1 1 соответствуют выводам ОС1 А (РВ 1 ) , ОС1 В (РВ2) и ОС2А (РВ3, в ATmega8 зто просто ОС2) . То есть здесь применяются те же функции Timer1 , которые используем и мы , а также и соответствующая функция Timer2 (которая у ATmega8 в единственном числе) . А выводы Arduiпo 3 , 5 , 6 соответствуют аналогичным выводам ОСОА и ОСОВ для TimerO, а также ОС2В для Timer2 , т. е. функциям, отсутствующим у ATmega8, но введенным в ATmega1 68/328 . Отсюда, кстати , становится понятно, почему к функции tone ( ) сделано примечание, что она будет «влиять на ШИМ-сигнал на выводах 3 и 1 1 » (на русскоязычных сайтах вы встретите «может влиять» , что просто неверный перевод английского «Wi l l iпter fere») . Функция задействует Timer2 для генерации частоты , и по идее analogwrite ( ) на этих выводах вообще не должна включаться одновременно с tone ( ) . Но при одновре менном обращении она все-таки как-то включается , и обе функции при этом, понятно, работать перестают. Разберемся также с частотой и разрешением ШИМ, которые в Arduiпo для упрощения фиксированные и равны «approximately 490 Hz» (а на выводах 5 и 6 - «approximately 980 Hz») и числу градаций 255. Очевидно , мы имеем дело с 8-битовым разрешени ем - для удобства установки значения и унификации , т. к. TimerO и Timer2, в отличие от Timer1 , иначе не умеют. Для Timer2 и Timer1 это режим Phase Corгect PWM, а для TimerO - обычный Fast РWМ с коэффициентом предделителя таймеров, равным 64. Соответственно, точные значения частот ШИМ равны при «ардуиновских» 16 мегагер цах 976,5625 Гц для выводов 5 и 6 и 488 ,28 1 25 Гц для остальных. П рограммная реализация ШИМ Нам осталось решить по сути только одну задачу - в какой момент менять содер жимое регистра сравнения? Большая часть примеров ШИМ в Сети делает это с по мощью программных задержек, никак не синхронизированных с работой ШИМ. Так можно получить низкие частоты смены сигнала ШИМ- порядка долей или единиц герц, причем по какому-нибудь простому закону, потому что с увеличением частоты и сложности закона изменения вместо искомого вы рискуете получить не весть что. Поэтому здесь мы просто будем загружать новое значение по прерыва нию сравнения - оно будет происходить каждый период сигнала ШИМ (см. диа грамму на рис . 9 . 8), причем до начала нового отсчета, т. е. к нему оно уже будет подготовлено. Отсчитав 3 1 2 таких сравнений, мы переключаемся на другой вывод, и все повторяем сначала. Иными словами, нам нужно реализовать следующий алгоритм:
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==