Rambler's Top100

Таймеры и ШИМ


Общие положения
Сторожевой таймер
Регистры TIMSK и TIFR
Таймер-счётчик 0
Таймер-счётчик 2
Таймер-счётчик 1
Функции сравнения
ШИМ
Автор

Общие положения

В архитектуре AVR предусмотрены следующие типы таймеров-счётчиков:

   1. Сторожевой таймер.
   2. 8-разрядный таймер-счётчик T/C0.
   3. 16-разрядный таймер-счётчик T/C1.
   4. 8-разрядный таймер-счётчик T/C2.

В каждой модели присутствуют сторожевой таймер и T/C0. T/C1 реализован начиная с AT90S2313, а T/C2 - в ATMega. Собственно, общих слов достаточно, можно переходить к делу.

Оглавление Оглавление

Сторожевой таймер

Если кому неизвестно, что значит "watchdog", то это в буквальном переводе - "сторожевая собака". Назван этот таймер так, потому что его основная функция - предохранять контроллер от "зависания" программы. Это вовсе не упрёк программистам, как может показаться. Дело в том, что нельзя сконструировать абсолютно надёжные цепи питания с идеальной стабилизацией и лишённые помех, а любая помеха по цепи питания может стать причиной остановки основного тактового генератора. Вот тут то и вылезает из конуры наша маленькая "собачка".
Тактируется сторожевой таймер от отдельного RC-генератора, нечувствительного к нестабильности питания. Если он (таймер) включен, то программе необходимо в определённые промежутки времени сбрасывать его командой wdr (Watchdog Reset). Если сброса таймера не происходит, то он сам сбрасывает контроллер через промежуток времени, определённый его предделителем.
Зачем такие сложности? А вот зачем. Контроллер никогда не занят игрой, допустим, в "DOOM" или "QUAKE", как какой-нибудь "Pentium-III". Он занят серьёзной работой, например производственным процессом. А теперь представьте, что сбой произошел как раз в тот момент, когда ему надо среагировать на аварийную ситуацию... А "Ctrl+Alt+Del" или "RESET" нажать то некому!.. Лучше среагировать на полсекунды позже, чем вообще не среагировать!!!
Теперь посмотрим, как же управляется наша "собачка".

Регистр WDTCR - регистр управления сторожевым таймером

- - - WDTOE WDE WDP2 WDP1 WDP0

WDTOE - разрешение выключения сторожевого таймера. Чтобы сбросить WDE, необходимо сначала установить этот бит. Аппаратно сбрасывается через 4 цикла тактового генератора.
WDE - если установлен в "1", сторожевой таймер включен и наоборот
WDP0...WDP2 - установка периода сторожевого таймера.

WDP2 WDP1 WDP0 Период в циклах RC-генератора
0 0 0 16 K
0 0 1 32 K
0 1 0 64 K
0 1 1 128 K
1 0 0 256 K
1 0 1 512 K
1 1 0 1024 K
1 1 1 2048 K

Частота RC-генератора зависит от напряжения питания и находится в пределах от 300 кГц при 2,7 В до 1 МГц при 5 В.

Примечание:

В модели AT90S1200 бит WDTOE отсутствует.

Оглавление Оглавление

Регистры TIMSK и TIFR

Регистры TIMSK и TIFR управляют системой прерываний таймеров 0...2. Я привожу конфигурацию этих регистров для модели ATMega, где в наличии все типы таймеров и все их функции. Для других моделей расположение управляющих битов может быть другим.

Регистр TIMSK - регистр масок прерываний таймеров

OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE1

OCIE0, OCIE2 - разрешение прерывания по сравнению T/C0 и T/C2 соответственно. Что такое преывание по сравнению, см. ниже.
TICIE1 - разрешение прерывания по событию на входе IC1.
TOIE0, TOIE1, TOIE2 - разрешение прерывания по переполнонию T/C0, T/C1 и T/C2 соответственно. Что такое преывание по переполнеию, объяснять, надеюсь, не надо.
OCIE1A, OCIE1B - разрешение прерывания по сравнению T/C1 с регистрами OCR1A и OCR1B соответственно ( см. ниже ).

Регистр TIFR - регистр флагов прерываний таймеров

OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOV0

В этом регистре определены флаги прерываний таймеров. Как работают регистры флагов пррываний, см. в разделе "Система прерываний".

Оглавление Оглавление

Таймер-счётчик 0

Итак, повторим - Таймер-счётчик 0 - это 8-разрядный счетчик с прерыванием по переполнению, предделителем, асинхронным тактированием, функцией сравнения и ШИМ. Напомню, что все функции реализованы только в ATMega.
Начнем, пожалуй, с асинхронного режима. Этот режим управляется регистром ASSR:

- - - - AS0 TCN0UB OCR0UB TCR0UB

AS0 - разрешение асинхронного режима. Если установлен, T/C0 тактируется с отдельного входа TOSC1. Если сброшен, T/C0 работает как обычный 8-разрядный таймер с тактированием от генератора контроллера.
TCN0UB - флаг ожидания обновления TCNT0 в асинхронном режиме.
OCR0UB - флаг ожидания обновления OCR0 в асинхронном режиме.
TCR0UB - флаг ожидания обновления TCCR0 в асинхронном режиме.
Флаги ожидания устанавливаются при попытке записи в соответствующий регистр в асинхронном режиме. После команды записи out значение заносится во временный регистр, после чего устанавливается флаг. Сбрасавается он аппаратно после того, как контроллер обновляет регистр. Если попытаться записать регистр при установленном флаге ожидания, записываемое значение теряется.
Также при чтении OCR0 и TCCR0 контроллер выдаёт значение временного регистра.

Генератор часов реального времени рассчитан на применение кварца 32 768 Гц без внешних элементов. В режиме Power Save T/C0, установленный в асинхронный режим, продолжает функционировать.

Оглавление Оглавление

Таймер-счётчик 2

Таймер-счётчик 2 полностью аналогичен T/C0 в синхронном режиме. В моделях, не содержащих асинхронного таймера, он называется Таймер-счётчик 0, поэтому всё сказанное в этой главе относится к асинхронному таймеру в синхронном режиме.
Регистр TCCRx (x=0 или 2 в зависимости от таймера) управляет режимами таймера

- PWMx COMx1 COMx0 CTCx CSx2 CSx1 CSx0

PWMx - разрешение режима ШИМ ( см. ниже ).

Значения комбинаций COMxx определяют реакцию вывода OCx/PWMx в режиме сравнения с регистром OCRx.

ISCx1 ISCx0 Выход OCx/PWMx
0 0 Выключен
0 1 Переключение уровня на противоположный
1 0 0
1 1 1

CTCx - разрешение очистки по событию сравнения с OCRx.
Значения комбинаций CSxx определяют величину делителя частоты ( F - основная тактовая частота ):

CSx2 CSx1 CSx0 Тактирование таймера
T/C0 T/C2
0 0 0 Выключен Выключен
0 0 1 F F
0 1 0 F/8 F/8
0 1 1 F/32 F/64
1 0 0 F/64 F/256
1 0 1 F/128 F/1024
1 1 0 F/256 Вход T2, обратный фронт
1 1 1 F/1024 Вход T2, прямой фронт

Напомню, для моделей без асинхронного таймера всё сказанное для T/C2 справедливо для T/C0.

Оглавление Оглавление

Таймер-счётчик 1

Кажется, что я непоследователен в изложении материала. Но это не совсем так. T/C1 16-разрядный таймер с двумя выходами сравнения и регулируемым ШИМ, а также снабжённый подавителем дребезга при регистрации внешних событий в паре с компаратором. Как видим, это достаточно сложное устройство.
А начнём мы его изучение с регистров управления.

Регистр TCCR1A :

COM1A1 COM1A0 COM1B1 COM1B0 - - PWM11 PWM10

COM1Ax - функция сравнения по каналу OC1A.
COM1Bx - функция сравнения по каналу OC1B.
Определяет состояние выхода OC1x по событию сравнения по каналу A или B.

COM1x1 COM1x0 Выход OC1x
0 0 Выключен
0 1 Переключение уровня на противоположный
1 0 0
1 1 1

PWMx - режим ШИМ.

PWM1 PWM0 Режим ШИМ
0 0 Выключен
0 1 8-разрядный ШИМ
1 0 9-разрядный ШИМ
1 1 10-разрядный ШИМ

Регистр TCCR1B :

ICNC1 ICES1 - - CTC1 CS12 CS11 CS10

ICNC1 - подавитель дребезга. Если установлен, то определение события на входе IC1 происходит с задержкой на 4 машинных цикла. Напомню, что такое определение входного события - если установлен бит разрешения TICIE1 в TIMSK, то по событию на входе IC1 содержимое регистра TCNT1 заносится в регистр ICR1.
ICES1 - если установлен, то прерывание по входному событию вызывается прямым фронтом, если сброшен - обратным.
CTC1 - если установлен, то после вызова прерывания по сравнению по каналу A регистр TCNT1 сбрасывается в 0.
CS10...CS12 - определение режима и частоты тактирования T/C1.

CSx2 CSx1 CSx0 Тактирование таймера
0 0 0 Выключен
0 0 1 F
0 1 0 F/8
0 1 1 F/64
1 0 0 F/256
1 0 1 F/1024
1 1 0 Вход T1, обратный фронт
1 1 1 Вход T1, прямой фронт
Оглавление Оглавление

Функции сравнения

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

Таймер Регистры сравнения Выход сравнения
TCNT0 OCR0 OC0
TCNT1 OCR1A OC1A
OCR1B OC1B
TCNT2 OCR2 OC2

Прерывание по сравнению, если оно присутствует в используемой вами модели, предпочтительнее прерывания по переполнению. Во-первых, просто с числом легче работать, чем с его дополнением до 2, а вы загружаете в регистр сравнения именно число, с которым хотите сравнить таймер. Во-вторых, нет необходимости каждый раз загружать в таймер делитель при выходе из прерывания - это может сделать контроллер при установленном бите CTCx - просто сбросит таймер. И в-третьих, есть выход, который может тоже сгенерировать событие без участия программы.

Оглавление Оглавление

ШИМ

ШИМ, или PWM - это широтно-имрульсная модуляция сигнала.

Продолжение следует...

Оглавление Оглавление

© Берёзкин С.Е., 2001 г.

stlab@rambler.ru



Оглавление

Главная

Микроконтроллеры



Рейтинг@Mail.ru bigmir)net TOP 100 Rambler's Top100 AllBest.Ru Яндекс цитирования