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

 
 
 
«Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.»
Brian W. Kernighan.
Русский | Українська


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