Принципы программной реализации выходных ШИМ-сигналов
Несмотря на то, что в микроконтроллерах семейства MCS-51 отсутствуют встроенные аппаратные ШИМ-генераторы, сформировать ШИМ-сигнал на выводе МК достаточно просто. Для этих целей удобно использовать таймер в режиме автоперезагрузки стартового числа. Используемая разрядность таймера NT соответствует разрядности счетчика NC из примера согласно п.23.1.
Возможные состояния таймера лежат в пределах от 0 до . Если значение периода ШИМ-импульсов определить как , где TG–в данном случае период импульсов от внутреннего ГТИ, подсчитываемых таймером, то в каждом таком периоде активной фазе ШИМ-импульса будет соответствовать некоторое количество N1 периодов TG, а неактивной (нулевой) фазе – количество N0.
Важно, что всегда (N1 + N0) × TG = TШИМ , или . Следовательно, в двоичной арифметике значения N1 и N0являются обратными и могут быть получены друг из друга логической инверсией.
Таким образом, при использовании таймера в режиме автоперезагрузки необходимо поочередно загружать в счетный регистр значение стартового числа для отработки таймером N1 или N0 периодов TG. По прерыванию текущее содержимое регистра перезагрузки будет перемещаться в счетный регистр. В обработчике прерывания от таймера нужно изменять содержимое регистра перезагрузки на противоположное, а также изменять значение выходного ШИМ-импульса. Заметим, что стартовые числа для фаз и .
Все указанные действия будут производиться автоматически или в обработчике, поэтому основная программа должна только рассчитать очередное значение управления и поместить в регистр перезагрузки. Важно, что период работы основной программы может быть значительно больше периода генерации ШИМ.
init_T0 equ 00000010b ; Таймер Т0 используем для генерации ШИМ
; в режиме автоперезагрузки (NT=8)
init_IE equ 10000010b ; Разрешено прерывание от Т0
dataPWM equ 40h ; Ячейка РПД, в которую основная программа
; помещает рассчитанную длительность
; активной фазы ШИМ-импульса
Pulse bit P1.0 ; ШИМ-импульс будем выдавать по линии Р1.0
org 0
jmp main_prog ; Переход на основную программу
org 000Bh ; Обработчик прерывания от таймера Т0
cpl TH0 ; Формирование длительности следующей фазы
cpl Pulse ; Изменение фазы ШИМ-импульса
reti ; Возврат в основную программу
org XXXX
main_prog: ; Основная программа
mov TMOD,#init_T0 ; Настройка таймеров и прерываний
mov IE,#init_IE
mov TL0,#254 ; Начальное стартовое число для фазы 1 (min)
mov TH0,#1 ; Начальное стартовое число для фазы 0 (max)
setb Pulse ; Установка начального значения импульса
setb TR0 ; Включение таймера Т0
main_calc: ; Вычисления по алгоритмам,
. . . ; выполняемые с нужным периодом дискретности
. . .
. . .
clr TR0 ; Останов таймера Т0
mov TL0, dataPWM ; Формирование нового стартового числа
xrl TL0, #0FFh ; для фазы «1»
mov TH0, dataPWM ; Новое стартовое число для фазы «0»
setb Pulse ; Установка начального значения импульса
setb TR0 ; Включение таймера Т0
. . .
jmp main_calc
Останов таймера для установки новых стартовых чисел занимает всего 8 машинных циклов (3% периода TШИМ) и за счет инерционности исполнительных устройств не повлияет на равномерность работы оборудования.
|