Микропроцессоры и микроконтроллеры

 
 
 
«A program that has not been tested does not work.»
Bjarne Stroustrup
Русский | Українська


Микропроцессоры и микроконтроллеры :: Каналы ввода-вывода на основе МК51 :: Принципы программной реализации выходных ШИМ-сигналов

Принципы программной реализации выходных ШИМ-сигналов

Несмотря на то, что в микроконтроллерах семейства 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ШИМ) и за счет инерционности исполнительных устройств не повлияет на равномерность работы оборудования.