Например, для организации низкочастотной ШИМ при управлении мощностью в нагрузке с помощью тиристора или транзистора удобнее всего управлять ШИМ по прерыванию от таймера TIMER0, получая виртуальную «пилу» увеличением переменной 1 на 1 при каждом прерывании и сбрасывая ее в 0 при достижении максимального значения, и сравнивать значение «пилы» с переменной 2, выключая энергию при равенстве значений.
Все это работает прекрасно, но если в системе используются датчики DS18S20, требуется регулярно запрещать прерывания на время работы с датчиком, что нарушает работу ШИМ и других устройств,работающих по временному прерыванию.
Для того, чтобы убрать этот дефект, можно использовать возможность прямого управления регистрами МК.Например, для использования TIMER2 в качестве аппаратного ШИМ, Марк Альбертс предлагает следующее.Чип ATmega8535.
1)Задаем режимы регистра управления TCCR2 для режима FAST PWM, например:
FOC2=0 ‘8 разряд
WGM20=1 ‘fast PWM
COM21=1 ‘выход уст. в ноль
COM20=0 ‘выход уст. в ноль
WGM21=1 ‘fast PWM
CS22=1 ‘делитель (на 256)
CS21=0 ‘то же
CS20=0 ‘то же
2)В регистр управления OCR2 периодически записываем переменную для регулирования скважности A , величину которой регулируем от 0 до 255(например, нажатием кнопок).
&clock = 16000000
Dim A As Byte
Config Timer 2 = Timer
Preskale = 256
TCCR2 = 124 ‘(0+64+32+0+8+4+0+0)
Begin:
………………………………………………………………….
(меняем А в цикле)
OCR2=A ‘ШИМ с частотой 1 кГц
………………………………………………………………….
Disable interrupts ‘ШИМ непрерывен на выходе Timer 2!
(работа с 18S20)
Enable interrupts
………………………………………………………………….
Goto Begin
Возможно, эта информация от Марка Альбертса кому-то будет полезной.

