Программный ШИМ на arduino NANO часть 2. Самоубийство
Доброго всем времени суток!
В связи с оглушительным успехом первой части аппаратного ШИМа, я решил, что не стоит останавливаться, и хочу поделиться еще одним вариантом реализации данного действа, но чуть более издевательского. А читая комментарии к первой части, я сделал для вывод, что не стоит пытаться реализовать код универсально, кому надо - тот сам все сделает под свои цели. Ну что же, так и поступим.
Да простит меня сообщество, - не вижу смысла заливать код куда либо, если там несколько строк:

Итак, котэ работает на 2 прерываниях, одно прерывание срабатывает при совпадении, другое при переполнении. Т.е. когда сработало прерывание по переполнению, а значит таймер обнулился, - на пин подается высокий уровень. Когда таймер досчитал до значения регистра сравнения - вызывается прерывание по совпадению, в котором на пин подается низкий уровень. И таймер продолжает считать дольше, пока не вызовет прерывание по переполнению. И так по кругу.
Пройдемся по алгоритму:
Допустим, хотим ШИМ на D13, смотрим табличку вначале... D13 - это первая таблица, она относится к PORTB и регистр настроек DDRB, В самой верхней шапке - управляющие биты, ПИНу D13 соответствует байт 32 (если так можно сказать), разложив его в бинарный код, будет 00100000 , это 6 бит,.. но нам надо записать в переменную bit число 32.
Далее, прописываем нужные порты и регистры.. т.е. в блоке setup - DDRB и в прерываниях таймеров прописываем порты PORTB.
Соответственно, если порты и регистры будут не B, а например на аналоговых пинах - это С, то пишем вместо DDRB - DDRC, вместо PORTB - PORTC.
Для более простой настройки, конечно же можно это все переопределить в define.
Для установления значения скважности, нужно значение скважности записать в регистр сравнения, в данном примере используется таймер 2, канал B, значит записываем OCR2B = 0-255. Максимально 255, т.к. таймер 2 - 8 битный. Нужно ли вызывать перед записью значений запрет прерываний cli(); и их разрешение sei(); после - каждый решает сам, от требований поставленной задачи.
Вот и всё.
Комментарии