Регулируем скорость вращения двигателя с помощью ШИМ(PWM)
Попробуем сварганить ШИМ, который меньше загружает процессор - это аппаратный ШИМ.
Tiny13 может аппаратно генерировать ШИМ на 2-х ногах PB0 и PB1, для чего
необходимо сконфигурировать имеющийся единственный таймер
соответствующим образом.
Для экспериментов над лампочками нам подойдет "быстрый ШИМ" (Fast
PWM) это когда таймер считает (регистр TCNT0) от 0x00 до 0xFF (режим №3)
или от 0x00 до значения в регистре OCR0A (режим №7).
Самый простой режим - №3, его и выберем. В этом режиме в момент счета
таймера от 0 до ORC0A на выводе PB0 присутствует "0", а от OCR0A до
0xFF - "1" - это если выбран "неинвертирующий" (non-inverted) режим.
Для "инвертирующего" (inverted) режима - наоборот, сначала "1", а
потом "0". Для вывода PB1 все тоже самое, только вместо OCR0A - регистр
OCR0B.
Таким образом имеем картину, представленную на рисунке (взято из
Datasheet):
То есть занося в регистры OCR0A и OCR0B разные значения мы получаем
различную скважность импульсов. Собственно такая картина соответствует
практически всем AVR контроллерам.
Позднее я планирую написать отдельную статью с примерами, которая
расскажет о всех режимах функционирования ШИМ в МК AVR.
А пока будем использовать вот такую схему:
Здесь я присобачил интегрирующие цепочки R1C1 и R2C2, что бы показать
как из ШИМ можно получить аналоговый сигнал, уровень которого будет
пропорционален текущей скважности импульсов.
Ескость C1 в 10 раз больше C2, что прождает более гладкую кривую
нарастания напряжения (красная линия).
Вот увеличенный кусочек, полученный по результатам симуляции (зеленая
- R2C2):
Итак, как и в прошлый раз
составим программу таким образом, что бы при подаче питания, или после
нажатия и отпускания кнопки на выходе PB0 процент заполнения импульсов
плавно увеличился от 0 до 100%.
Для этого в процедуре прерывания таймера 0 ( interrupt [TIM0_OVF] void timer0_ovf_isr(void)
) необходимо увеличивать значение регистра OCR0A на 1 до тех пор, пока
оно не достигнет 0xFE.
Значение 0xFF использовать нельзя, т.к. в этом случае на выходе PB0
установится "0", что собственно говоря и происходит приудерживании
кнопки.
Скорость нарастания яркости в данном случае регулируется константой, с
которой сравнивается переменнас
cnt в строке №37.