воскресенье, 4 октября 2020 г.

Аппаратный ШИМ на ассемблере для ATtiny2313

Широтно импульсная модуляция (ШИМ) напряжения имеет множество применений. В электроприводах постоянного тока она используется для регулировки оборотов электродвигателя, в асинхронных электроприводах и инверторах такой модуляцией делаются синусоидальные напряжения, в источниках питания и DC-DC конвертерах для стабилизации и изменения напряжения, также этот тип модуляции может применяться для регулировки освещения электрическими лампами, температуры создаваемой электрическими нагревателями и использоваться во многих других случаях с электроприборами для которых подходит такой способ модуляции. В общем этот тип модуляции очень важен и поэтому во многих микроконтроллерах делают аппаратную поддержку ШИМа. ATtiny2313 - не исключение и в этом микроконтроллере есть 4 канала аппаратного ШИМа. Такой ШИМ можно получить с 4х специальных пинов:

Рисунок 1 - Пины аппаратного ШИМа микроконтроллера ATtiny2313

Для создания ШИМа используются таймеры счетчики которых в ATtiny2313 две штуки. На каждом из них есть два канала. Настроить аппаратный ШИМ на этом микроконтроллере не сложно. Сперва нужно настроить соответствующие выводы (см. рисунок 1) на выход (о том как это делать см. предыдущие статьи по ассемблеру). После чего есть два регистра TCCR0A и TCCR0B для 8ми битного таймера и два регистра TCCR1A и TCCR1B для 16ти битного таймера. Для настройки 8 ми битного таймера в режим FAST PWM (быстрый ШИМ) в нулевой и первый биты регистра TCCR0A записываются единицы. Для того чтобы ШИМ работал так:
В начале периода идет высокий уровень а по прошествии некоторого количества тактов он заменяется низким:


 И чтобы так было на обоих каналах. Нужно в 5й и 7ой биты регистра TCCR0A записать единицы.
в итоге должно получиться примерно так:

LDI R16, 0b10100011
OUT TCCR0A, R16

Также нужно запустить таймер чтобы ШИМ начался. (об этом см. статью про таймер https://electe.blogspot.com/2020/08/attiny2313.html). Запускать надо естественно без предделителя чтобы режим действительно был FAST. В итоге должно получиться что то вроде этого:
 
LDI R16, 0b00000001 
OUT TCCR0B, R16 

Чтобы устанавливать какое либо напряжение на нужном пине есть регистры OCR0A и OCR0В для 8 ми битного таймера и OCR1A и OCR1В для 16ти битного таймера. Записывать в них можно от 0 до 255 (т.к. регистр 8ми битный) а напряжения на соответствующих выводах (см. рисунок 1) будет меняться пропорционально записанному числу. Например установить половину напряжения питания на пине 14 ( он же PB2 или OC0A или PCINT2) можно командами:

LDI R16, 127
OUT OCR0A, R16

На основе аппаратных ШИМов можно сделать например не обычную светодиодную мигалку а например псевдоплавную. Код такой мигалки приведен в поле:

Светодиоды с резисторами необходимо подключит к выводам 9 и 14 микроконтроллера ATtiny2313. К данной статье прилагается видео:
В котором также рассказано о подпрограммах на ассемблере для микроконтроллеров AVR.