11.2 Принципы программной реализации выходных ШМ-сигналов
Несмотря на то, что в микроконтроллерах семейства MCS-51 отсутствуют встроенные аппаратные ШИМ-генераторы, сформировать ШМ-сигнал на выводе МК достаточно просто. Для этих целей удобно использовать таймер в режиме автоперезагрузки стартового числа. Используемая разрядность таймера NT соответствует разрядности счетчика NC из примера согласно п.3.1.
Возможные состояния таймера лежат в пределах от 0 до . Если значение периода ШМ-импульсов определить как , где TG–в данном случае период импульсов от внутреннего ГТИ, подсчитываемых таймером, то в каждом таком периоде активной фазе ШИМ-импульса будет соответствовать некоторое количество N1 периодов TG, а неактивной (нулевой) фазе – количество N0.
Важно, что всегда (N1 + N0) × TG = TШИМ , или . Следовательно, в двоичной арифметике значения N1 и N0являются обратными и могут быть получены друг из друга логической инверсией.
Таким образом, при использовании таймера в режиме автоперезагрузки необходимо поочередно загружать в счетный регистр значение стартового числа для отработки таймером N1 или N0 периодов TG. По прерыванию текущее содержимое регистра перезагрузки будет перемещаться в счетный регистр. В обработчике прерывания от таймера нужно изменять содержимое регистра перезагрузки на противоположное, а также изменять значение выходного ШИМ-импульса. Заметим, что стартовые числа для фаз и .
Все указанные действия будут происходить автоматически или в обработчике, поэтому основная программа должна только рассчитать очередное значение управления и поместить в регистр перезагрузки.
init_T0 equ 00000010b ; Таймер Т0 используем для генерации ШИМ
; в режиме автоперезагрузки (NT=8)
init_IEequ 10000010b ; Разрешено прерывание от таймера Т0
dataPWMequ 40h ; Ячейка РПД, в которую основная программа
; помещает рассчитанную длительность
; активной фазы ШМ-импульса
PulsebitP1.0 ; ШМ-импульс будем выдавать по линии Р1.0
org 0
jmpmain_prog ; Переход на основную программу
org 000Bh ; Обработчик прерывания от таймера Т0
xrlTH0,#0FFh ; Формирование длительности следующей фазы
cplPulse ; Изменение фазы ШМ-импульса
reti ; Возврат в основную программу
orgXXXX
main_prog: ; Основная программа
movTMOD,#init_T0 ; Настройка таймеров и прерываний
movIE,#init_IE
movTL0,#246 ; Начальное стартовое число для фазы 1 (min)
movTH0,#10 ; Начальное стартовое число для фазы 0 (max)
setbPulse ; Установка начального значения импульса
setbTR0 ; Включение таймера Т0
main_calc: ; Вычисления по алгоритмам,
. . . ; выполняемые с нужным периодом дискретности
. . . ; Расчет управляющего воздействия
. . .
clrTR0 ; Останов таймера Т0
movTL0, dataPWM ;Формирование нового стартового числа
xrlTL0, #0FFh ; для фазы «1»
movTH0, dataPWM ; Новое стартовое число для фазы «0»
setbPulse ; Установка начального значения импульса
setbTR0 ; Включение таймера Т0
. . .
jmpmain_calc
Останов таймера в основной программе для задания новых стартовых чисел занимает всего 8 машинных циклов (3% текущего периода TШИМ) и за счет инерционности исполнительных устройств не повлияет на равномерность работы оборудования. Этот останов происходит не каждый период ШИМ, а только один раз за периодов.
Важно, что период работы основной программы должен быть значительно больше периода генерации выходного ШМ-сигнала: .
Например, в системе УУМС период аппаратного выходного ШИМ составляет TШИМ = 0.0005 с, тогда как периоды дискретности обычно составляют 0,1 … 0,5 с.
|