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

 
 
 
Л. Якокка : «Компьютер выдает только то, что в него ввели. Секрет успеха - не информация, но люди»
Русский | Українська


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

Программная реализация измерения длительности ШИМ-импульсов

При выборе принципов измерения длительности ШИМ-импульсов имеет смысл учитывать такие факторы:

–       возможность восприятия ШИМ-импульсов аппаратными средствами микроконтроллера (прерывания, таймеры);

–       минимизация программных действий по обработке ШИМ-импульсов.

Можно предложить несколько вариантов приема и измерения длительности входных ШИМ-импульсов, которые будут рассмотрены ниже. В любом из вариантов требуется измерять длительность импульса в некоторых единицах времени – Ti– периоде подсчитываемых импульсов от ГТИ, поэтому аппаратным средством измерения является таймер (рис. 22.х).

Рис. 22.х

Программно-управляемое измерение длительности ШИМ-импульсов

Данный подход основан на программном опросе уровня сигнала на входной линии микроконтроллера, на которую поступают ШИМ-импульсы. Когда программно фиксируется высокий (активный) уровень ШИМ-сигнала, включается средство измерения – таймер. При программной фиксации низкого уровня – завершении активной фазы импульса – таймер выключается и накопленное в таймере значение выражает длительность импульса в единицах Ti.

Измеряемая последовательность ШИМ-импульсов может подаваться на любой вход микроконтроллера, который можно программно проверить – например, Р1.0. Измерения производятся циклически. Поскольку обычно кроме измерения длительности импульсов необходимо производить некоторые вычисления, то возврат к очередному измерению может попасть на середину активной фазы текущего импульса. Поэтому в программе нужно обеспечить включение таймера именно по началу активной фазы импульса:

; Программно-управляемое измерение длительности ШИМ

dataL equ 40h ; Результаты измерения (2 байта)

dataH equ 41h

init_T0 equ 00000001b ; Таймер Т0 – в конфигурации 16 бит

init_IE equ 0 ; Все прерывания запрещены

org XXXX

mov TMOD,#init_T0 ; Настройка таймеров и прерываний

mov IE,#init_IE

. . .

PWM: mov TL0,#0 ; Цикл измерений – обнуление таймера

mov TH0,#0

jb P1.0,$ ; Ожидание завершения предыдущего импульса

jnb P1.0,$ ; Ожидание начала нового импульса

setb TR0 ; Начало измерения – включение таймера

jb P1.0,$ ; Ожидание завершения текущего импульса

clr TR0 ; Окончание измерения – выключение таймера

mov dataL,TL0 ; Фиксация результата измерений в памяти

mov dataH,TH0

. . . ; Необходимая обработка данных

jmp PWM ; Возврат к началу цикла измерений

Примечание: символ $ означает переход на адрес текущей команды – т.е. зацикливание

Очевидное достоинство такого подхода – простота программной реализации за счет линейности программы и строгой последовательности проверок.

Серьезный недостаток – непроизводительное ожидание смены фаз импульса, причем длительность ожидания непостоянна, зависит от ширины импульса.

Измерение длительности ШИМ-импульсов с автоматическим запуском таймера

В микроконтроллерах семейства MCS-51 имеется возможность управлять запуском таймера с помощью уровня внешнего сигнала, подаваемого на вход INTx. Эта возможность активна при установке бита GATE=1 в регистре TMOD. При этом таймер следует включить программно один раз в блоке инициализации, а текущие запуски и остановы будут производиться в соответствии с фазой входного ШИМ-импульса (рис.22.х)

Поскольку измеряемые импульсы подаются на вход запроса прерывания, можно автоматизировать и реагирование на завершение активной фазы импульса по срезу сигнала – как обработку соответствующего прерывания. В обработчике внешнего прерывания можно выполнить фиксацию значения таймера, несложную обработку информации. В основной программе реализуется необходимый период дискретности системы и вычисления по алгоритмам. Результаты измерений обновляются параллельно с основными вычислениями.

; Измерение длительности ШИМ с автоматическим запуском таймера

dataL equ 40h ; Результаты измерения (2 байта)

dataH equ 41h

init_T0 equ 00001001b ; Таймер Т0 – в конфигурации 16 бит

; и запуска по внешнему сигналу INT0

init_IE equ 10000001b ; Разрешено прерывание INT0

org 0

jmp main_prog ; Переход на основную программу

org 0003h ; Обработчик прерывания INT0

mov dataL,TL0 ; Фиксация результата измерений в памяти

mov dataH,TH0

mov TL0,#0 ; Обнуление таймера для следующего цикла

mov TH0,#0

reti ; Возврат в основную программу

org XXXX

main_prog: ; Основная программа

mov TMOD,#init_T0 ; Настройка таймеров и прерываний

mov IE,#init_IE

setb IT0 ; Прерывание INT0 будем принимать по срезу

mov TL0,#0 ; Начальное обнуление таймера

mov TH0,#0

jb P1.0,$ ; Ожидание завершения предыдущего импульса

setb TR0 ; Включение таймера – но он еще не работает

main_calc: ; Вычисления по алгоритмам,

. . . ; выполняемые с нужным периодом дискретности

. . .

. . .

jmp main_calc

Для синхронизации обновления результатов измерений с основной программой в обработчике прерывания INT0 можно предусмотреть установку битового признака, который будет проверяться основной программой.

Обработчик прерывания INT0 в данном примере реализован непосредственно на векторе прерывания (адрес 0003h). В сложных программах с необходимостью обработки других прерываний может потребоваться перенос обработчика в другое место в памяти программ.

Важно отметить, что период ШИМ-импульсов, как правило, гораздо меньше, чем период дискретности алгоритмов управления. Поэтому предлагаемый подход существенно освобождает ресурсы процессора, т.к. не требует программного ожидания изменения фаз ШИМ-импульсов. Обработчик прерывания в минимальной реализации занимает всего 12 машинных циклов (с учетом его вызова).

Таймер Т2 не имеет возможности запуска от внешнего сигнала, поэтому его предпочтительнее использовать для формирования периода дискретности работы системы или для синхронизации последовательного порта, если таймер Т1 нужно использовать для измерения периода ШИМ-импульсов.


Автоматическое измерение частоты импульсов с захватом значения таймера

Иногда информация о некотором параметре может поступать в микроконтроллер в виде последовательности импульсов изменяющейся частоты. В этом случае задачей микроконтроллера является измерение интервала времени между двумя последовательными внешними импульсами (измерение периода импульсов).

Если эту задачу решать на основе таймеров Т0 и Т1, то необходимо их совместное использование (один таймер реализует цикл измерений – эталонный интервал ТЭ, а на другом подсчитывается количество внешних импульсов N за этот интервал). Еще один возможный вариант – воспринимать внешние импульсы с помощью внешнего прерывания (INT0 или INT1), в обработчике которого брать текущее значение таймера Т0 или Т1 и перезапускать его с нуля.

В микроконтроллерах 80х52 имеется возможность большей автоматизации измерений частоты импульсов за счет использования специального режима захвата текущего значения для таймера Т2.

В этом случае входные импульсы следует подавать на вход T2EX
(линия Р1.1), который управляет захватом – копированием текущего состояния таймера Т2 в регистры RCAP2H, RCAP2L (см. ранее).

При настройке таймера Т2 с помощью регистра T2CON нужно активировать биты EXEN2 (разрешение восприятия сигнала по входу T2EX) и CP/RL2# (задание режима захвата). Байт для настройки таймера Т2 будет иметь вид: 00001001b.

Период эталонных импульсов от ГТИ, поступающих на таймер, известен – ТГТИ = 12/FT. Тогда измеряемая частота внешних импульсов может быть выражена через количество подсчитанных импульсов N как:

FИ = 1 / (N×ТГТИ).

Минимальное значение измеряемой частоты составляет FИ min = 1 / (Nmax×ТГТИ), а максимальное – FИ max = 1 / ТГТИ , где Nmax = 65535 для 16-битного таймера Т2.

Программная реализация указанного способа может быть следующей:

; Измерение частоты (периода) импульсов на основе таймера Т2

FdataL equ 40h ; Результаты измерения (2 байта)

FdataH equ 41h

init_T2 equ 00001001b ; Конфигурация таймера Т2 – 16 бит

; и запуск по внешнему сигналу T2EX

init_IE equ 10100001b ; Разрешено прерывание от Т2 и T2EX

org 0

jmp main_prog ; Переход на основную программу

org 002Bh ; Обработчик прерывания от входа T2EX

mov FdataL,RCAP2L ; Копирование значений из регистров захвата

mov FdataH,RCAP2H

mov TL2,#0 ; Обнуление таймера Т2 для следующего цикла

mov TH2,#0 ; измерения периода импульсов

clr EXF2 ; Сброс флага прерывания EXF2

reti ; Возврат в основную программу

org XXXX

main_prog: ; Основная программа

mov TMOD,#init_T2 ; Настройка таймеров и прерываний

mov IE,#init_IE

mov TL2,#0 ; Начальное обнуление таймера

mov TH2,#0

setb TR2 ; Включение таймера Т2

main_calc: ; Вычисления по алгоритмам,

. . . ; выполняемые с нужным периодом дискретности

. . .

. . .

jmp main_calc

Важно, что в приведенном примере использован только таймер Т2. Фактическая максимальная измеряемая частота ограничена временем выполнения обработчика прерывания (14 машинных циклов с учетом вызова) и составляет:

FИФ max = 1 / (14 ТГТИ)