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

 
 
 
«Низкоуровневый язык — это когда требуется внимание к вещам, которые никак не связаны с программами на этом языке.»
Alan J. Perlis.
Русский | Українська


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

Програмна реалізація вимірювання тривалості шим-імпульсів

При виборі принципів вимірювання тривалості шим-імпульсів має сенс враховувати такі фактори:

rn

- можливість сприйняття шим-імпульсів апаратними засобами мікроконтролера (переривання, таймери);

rn

- мінімізація програмних дій по обробці шим-імпульсів.

rn

Можна запропонувати кілька варіантів прийому та вимірювання тривалості вхідних шим-імпульсів, які будуть розглянуті нижче. У будь-якому з варіантів потрібно вимірювати тривалість імпульсу в деяких одиницях часу - Ti - періоді підраховуємо імпульсів від ГТВ, тому апаратним засобом вимірювання є таймер (мал. 22.х).

rn

rn

Рис. 22.х

rn

Програмно-кероване вимірювання тривалості шим-імпульсів

rn

Даний підхід заснований на програмному опитуванні рівня сигналу на вхідний лінії мікроконтролера, на яку надходять шим-імпульси. Коли програмно фіксується високий (активний) рівень шим-сигналу, включається засіб вимірювання - таймер. При програмної фіксації низького рівня - завершення активної фази імпульсу - таймер вимикається і накопичене в таймер значення висловлює тривалість імпульсу в одиницях Ti .

rn

вимірювана послідовність шим-імпульсів може подаватися на будь-який вхід мікроконтролера, який можна програмно перевірити - наприклад, Р1.0. Вимірювання виробляються циклічно. Оскільки зазвичай крім вимірювання тривалості імпульсів необхідно проводити деякі обчислення, то повернення до чергового виміру може потрапити на середину активної фази поточного імпульсу. Тому в програмі потрібно забезпечити включення таймера саме з початку активної фази імпульсу:

rn

; Програмно-кероване вимірювання тривалості шим

rn

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

rn

dataH equ 41h

rn

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

rn

init_IE equ 0; Всі переривання заборонені

rn

org XXXX

rn

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

rn

mov IE, # init_IE

rn

. . .

rn

PWM: mov TL0, # 0; Цикл вимірювань - обнуління таймера

rn

mov TH0, # 0

rn

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

rn

jnb P1.0, $; Очікування початку нового імпульсу

rn

setb TR0; Початок виміру - включення таймера

rn

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

rn

clr TR0; Закінчення виміру - вимкнення таймера

rn

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

rn

mov dataH, TH0

rn

. . . ; Необхідний обробка даних

rn

jmp PWM; Повернення до початку циклу вимірювань

rn

Примітка: символ $ означає перехід на адресу поточної команди - тобто зацікліваніе

rn

Очевидное перевага такого підходу - простота програмної реалізації за рахунок лінійність програми і суворої послідовності перевірок.

rn

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

rn

Вимірювання тривалості шим-імпульсів з автоматичним запуском таймера

rn

У мікроконтролерах сімейства MCS-51 є можливість керувати запуском таймер з допомогою рівня зовнішнього сигналу, що подається на вхід INTx. Ця можливість активна при встановленні біта GATE = 1 в регістрі TMOD. При цьому таймер слід включити програмно один раз в блоці ініціалізації, а поточні запуски і зупинив будуть здійснюватися у відповідності з фазою вхідного шим-імпульсу (ріс.22.х)

rn

Оскільки вимірювані імпульси подаються на вхід запиту переривання, можна автоматизувати і реагування на завершення активної фази імпульсу по зріз сигналу - як обробку відповідного переривання. У обробник зовнішнього переривання можна виконати фіксацію значення таймера, нескладну обробку інформації. В основній програмі реалізується необхідний період дискретності системи та обчислення по алгоритмам. Результати вимірювань оновлюються паралельно з основними обчисленнями.

rn

; Вимірювання тривалості шим з автоматичним запуском таймера

rn

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

rn

dataH equ 41h

rn

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

rn

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

rn

init_IE equ 10000001b; Дозволено переривання INT0

rn

org 0

rn

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

rn

org 0003h; Оброблювач переривання INT0

rn

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

rn

mov dataH, TH0

rn

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

rn

mov TH0, # 0

rn

reti; Повернення в основну програму

rn

org XXXX

rn

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

rn

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

rn

mov IE, # init_IE

rn

setb IT0; Переривання INT0 будемо приймати по зріз

rn

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

rn

mov TH0, # 0

rn

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

rn

setb TR0; Включення таймера - але він ще не працює

rn

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

rn

. . . ; Виконувані з потрібним періодом дискретності

rn

. . .

rn

. . .

rn

jmp main_calc

rn

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

rn

Оброблювач переривання INT0 в даному прикладі реалізовано безпосередньо на векторі переривання (адреса 0003h). У складних програмах з необхідністю обробки інших переривань може знадобитися перенесення обробника в інше місце в пам'яті програм.

rn

Важливо відзначити, що період шим-імпульсів, як правило, набагато менше, ніж період дискретності алгоритмів керування. Тому пропонований підхід суттєво звільняє ресурси процесора, т.к. не вимагає програмного очікування зміни фаз шим-імпульсів. Обробник переривання у мінімальній реалізації займає всього 12 машинних циклів (з урахуванням його дзвінка).

rn

Таймер Т2 не має можливості запуску від зовнішнього сигналу, тому його краще використовувати для формування періоду дискретності роботи системи або для синхронізації послідовного порту, якщо таймер Т1 потрібно використовувати для вимірювання періоду шим-імпульсів.

rn


rn

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

rn

Іноді інформація про деяке параметр може надходити в мікроконтроллер у вигляді послідовності імпульсів змінюється частоти. У цьому випадку завданням мікроконтролера є вимірювання інтервалу часу між двома послідовними зовнішніми імпульсами (вимірювання періоду імпульсів).

rn

Якщо цю задачу вирішувати на основі таймерів Т0 і Т1, то необхідно їх спільне використання (один таймер реалізує цикл вимірювань - еталонний інтервал ТЕ , а на іншому підраховується кількість зовнішніх імпульсів N < /em> за цей інтервал). Ще один можливий варіант - сприймати зовнішні імпульси за допомогою зовнішнього переривання (INT0 або INT1), в обробник якого брати поточне значення таймера Т0 або Т1 і перезапускає його з нуля.

rn

У мікроконтролерах 80х52 є можливість більшій автоматизації вимірювань частоти імпульсів за рахунок використання спеціального режиму захоплення поточного значення для таймера Т2.

rn

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

rn

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

rn

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

rn

FІ = 1 /( N