You are on page 1of 15

Розділ 3. Мікроконтролери.

Підсистеми і основні робочі модулі у


МК
Тема 3.6. Таймери/лічильники. Режими роботи таймерів.
Переддільники таймерів

12.1. Таймери/лічильники. Загальні відомості


Будь-який МК серії AVR містить декілька вбудованих таймерів, які за
призначенням можна розділити на дві категорії: таймери загального
призначення та сторожовий таймер. Таймери загального призначення
(ТЗП) використовуються для формування різних інтервалів часу і
прямокутних імпульсів заданої частоти. Окрім того, ТЗП можуть працювати
як в режимі лічильника (підраховувати тактові імпульси заданої частоти,
вимірюючи тим самим тривалість зовнішніх сигналів), так і при необхідності
підраховувати кількість будь-яких зовнішніх імпульсів. Саме тому ТЗП також
називаються «таймерами/лічильниками».
Таймер/лічильник (T/Л) – це один з модулів мікроконтролера, за
допомогою якого зручно здійснювати підрахунок часу і вхідних імпульсів у
системі МК, організовувати переривання або генерувати ШІМ-сигнал.
Таймер, як складова частина мікропроцесорної системи, здатен генерувати
сигнал у конкретний момент часу, який задається користувачем. Коли цей
момент настає, у таймері викликається відповідне переривання, яке фактично
нагадує йому про необхідність виконати певне завдання або конкретний
фрагмент робочого коду.
Залежно від конкретної моделі мікроконтролера кількість T/Л у
мікропроцесорній системі може відрізнятись, а різні таймери можуть мати
різний функціонал та розрядність. У мікросхемах AVR застосовуються як
восьмирозрядні, так і шістнадцяти розрядні таймери/лічильники. Їх кількість
для різних мікроконтролерів може варіюватися. Адже, наприклад,
мікроконтролер Atmega8 містить три таймери: два 8-ми розрядних і один
16-ти розрядний, а у МК серії Atmega640х – міститься шість
таймерів/лічильників (два з розрядністю 8 біт та чотири з розрядністю 16 біт).
При цьому, номер таймеру позначається числами (наприклад, від 0 до 6).
Таймер Т0 міститься у будь-якому AVR мікроконтролері та є 8-ми розрядним.
Водночас, таймери Т1, Т2 і Т3, тощо - опціонально присутні в мікросхемах
різних AVR контролерів, залежно від їх потужності та можливостей МПС.
Варто зазначити, що для всіх МК AVR таймери Т0 і Т2 є 8-ми розрядними, а
таймери T1 і T3 - шістнадцяти розрядними.
Фактично, таймер – це пристрій, який виконує постійний підрахунок
до певного заданого числа або величини, що дорівнює розрядності таймеру.
Цей процес відбувається за рахунок послідовного збільшення величини
змінної, яка називається рахунковим регістром (РР). Таймер збільшує
значення свого лічильника доти, доки не буде досягнута максимальна
величина, яка може бути записана у рахунковий регістр. У цій точці
лічильник переповнюється, а таймер «скидається» у нульове значення.
Кожен восьмирозрядний таймер являє собою один восьмирозрядний РР,
який для мікроконтролера є регістром вводу-виводу інформації. При цьому,
16-ти розрядні таймери мають 16-ти розрядний РР, відповідно. Кожен РР має
власне ім'я. Рахунковий регістр восьмиразрядного таймера іменується як
TCNTx, де «х» - це номер таймера. Для таймера Т0 регістр матиме назву
TCNT0, для таймера T2 - TCNT2, тощо.
Шістнадцяти розрядні регістри іменуються схожим чином, однак кожен
16-ти розрядний РР мікроконтролера являє собою два регістри вводу - виводу
інформації. Один з них призначений для зберігання старших бітів числа, а
другий - для зберігання молодших бітів. При їх позначенні, до імені регістру
старших розрядів додається літера Н, а до регістру молодших розрядів -
літера L. Наприклад, для РР таймера Т1 - два регістри вводу-виводу
інформації, матимуть назви: TCNT1H і TCNT1L.
Особливість роботи з рахунковими регістрами полягає у тому, що:
мікроконтролер може записати в будь-який рахунковий регістр будь-яке число
у будь-який момент часу, а також будь-коли прочитати вміст РР. Коли таймер
вмикається у режим підрахунку, то на його вхід починають надходити так
звані лічильні імпульси. Після надходження кожного такого імпульсу вміст
рахункового збільшується на одиницю. При переповненні РР його вміст
обнуляється і рахунок починається спочатку.
Для того, щоб користувач мав змогу відслідкувати момент «скидання»
таймеру, після переповнення рахункового регістру, Т/Л встановлює певний
біт у так званий «прапор переривань». Варто зазначити, що у випадку 8-ми
розрядного (8-ми бітного) таймеру рахунковий регістр може зберігати число
до 255, а у випадку 16-ти розрядного регістру - максимальне значення
складатиме 65535. Для того щоб значення лічильника у таймері
збільшувалось через однакові інтервали часу, його також підключають до
тактового джерела, що генерує постійно повторюваний сигнал. Кожного
разу, коли на T/Л надходить тактовий сигнал, таймер збільшує значення
лічильника на одиницю.
Як тактове джерело для таймеру може використовуватись зовнішнє ТД
(у такому випадку говорять про «асинхронний» режим роботи, а ТД
підключається до спеціальних входів мікросхеми), але у більшості випадків
використовується внутрішнє джерело самого чіпу (внутрішній тактовий
генератор). Також, таймер/лічильник може здійснювати підрахунок імпульсів
які надходять на спеціальні «рахункові входи». У такому випадку, після
відповідних налаштувань, він буде підраховувати або передній (перепад з
логічного 0 в 1) або задній (перепад логічної 1 в 0) фронт імпульсів, які
надійшли на ці входи. Важливо, щоб при цьому частота вхідних імпульсів не
перевищувала тактову частоту мікропроцесора, інакше він не встигне
обробити повний набір вхідних імпульсів.
Для того щоб використовувати таймери у МК серії AVR існує набір
спеціальних регістрів налаштувань. Такі регістри є 8-ми розрядними і
мають свою структуру (рис. 12.1).

Рисунок 12.1. Приклад структури регістру налаштувань Timer 2 у МК AVR

Зокрема, регістр налаштувань містить 8 біт, а кожен біт має свою назву
та установчу (конфігураційну) змінну. Наприклад, для налаштування роботи
T/Л1 на деякій тактовій частоті використовуються два регістри управління із
назвою TCCR кожен з яких має власні конфігураційні змінні. Розглянемо
детальніше призначення основних регістрів, що використовуються при
налаштуванні таймеру в МК серії AVR.
● ASSR – регістр статусу асинхронного режиму.
● TCCR – регістр управління (швидкості та режимів рахунку). Три
біта регістру (CS12, CS11 і CS10) визначають тактову частоту
таймера, а обираючи різні їх комбінації, можна отримати і різну
швидкість роботи таймеру та задавати параметри переддільника.
● TCNT – регістр підрахунку імпульсів.
● OCR – регістр порівняння.

Варто зазначити, що рахунок у таймері відбувається з однією


постійною швидкістю, яка дорівнює тактовій частоті мікроконтролера (адже
таймер працює на тій же частоті, що і мікроконтролер). Однак, іноді така
швидкість роботи таймеру може бути занадто високою, тому використовують
так звані «переддільники», які зменшують кількість імпульсів для підрахунку
в таймері на 8/64/256/1024 разів (див. Підрозділ 12.3). Увімкнення
переддільника для таймеру МК відбувається програмно, шляхом
налаштування відповідних бітів регістру TCCR.
Таймери, як і зовнішні переривання, працюють незалежно від основної
програми, тому будь-який таймер МК AVR тісно зв’язаний із системою
переривань. За необхідності, T/Л можна налаштувати таким чином, щоб
замість виконання основного циклу робочої програми він паралельно
виконував власний функціонал, який буде прописано програмістом у
відповідному фрагменті робочого коду. Визвати переривання по таймеру
може цілий набір подій, які пов’язані з його роботою. Наприклад:
переривання по переповненню таймера, по моменту спрацьовування
спеціальної схеми співпадіння, переривання по сторожовому таймеру, тощо.

12.2. Режими роботи таймерів


Таймери МК AVR можуть працювати в декількох режимах, при цьому
різні мікроконтролери мають і різні набори режимів для своїх таймерів. Для
вибору режимів Т/Л використовують регістри управління таймерами. Для
простих таймерів використовується один регістр управління. Для більш
складних - два регістри. Наприклад, для таймера Т0 використовується один
регістр з назвою TCCR0. Для управління таймером Т1 використовуються вже
два регістри: TCCR1A і ТССR1В. За допомогою управління регістрами
виконується не лише вибір відповідного режиму, але і більш детальне
налаштування роботи таймеру. Розглянемо основні режими роботи таймера
та їх детальний опис.
Режим Normal
Це найпростіший режим роботи Т/Л. У цьому режимі таймер виконує
підрахунок імпульсів, що приходять на його вхід (від тактового генератора
або зовнішнього пристрою) і викликає переривання по поповненню. Варто
також зазначити, що Normal - це єдиний режим роботи для восьмирозрядних
таймерів більшості мікроконтролерів сімейства “Tiny” і для деякої частини
мікроконтролерів сімейства “Mega”. Для решти восьмирозрядних (і всіх
шістнадцяти розрядних) таймерів - це лише один з можливих режимів
роботи.

Режим "Захоплення"
Суть цього Capture-режиму полягає в збереженні вмісту рахункового
регістра таймера у певний момент часу. При роботі у такому режимі,
запам'ятовування відбувається або за сигналом, що надходить через
спеціальний вхід мікроконтролера, або за сигналом з виходу вбудованого
компаратора МК. Цей режим зручний для використання у випадках, коли
потрібно виміряти тривалість будь-якого зовнішнього процесу. Наприклад
час, протягом якого напруга на конденсаторі досягає певного значення. У
цьому випадку напруга з конденсатора може подаватись на один із входів
компаратора, в той час як на другий його вхід - подаватиметься опорна
напруга. Мікроконтролер повинен одночасно запустити два ці процеси:
подати напругу на конденсатор і запустити таймер у режимі Capture. Тоді, як
тільки конденсатор починає заряджатися, напруга на ньому буде плавно
зростати. Одночасно лічильник таймера буде відраховувати тактові імпульси
заданої частоти, а у момент коли рівень напруги на конденсаторі зрівняється з
опорною напругою - логічний рівень на виході компаратора зміниться на
протилежний. За цим сигналом поточне значення рахункового регістру
запишеться у спеціальному регістрі захоплення, що має назву ICRx (для
Т/Л0 - це буде регістр ICR0, для T1 - ICR1, тощо) та одночасно згенерується
запит на переривання.
Режим "Скидання при співпадінні"
Для роботи у цьому режимі використовується спеціальний регістр
порівняння. Якщо мікроконтролер містить кілька таймерів, то для кожного з
них існує свій окремий регістр порівняння. Для восьмирозрядних таймерів
регістр - це один восьмирозрядний регістр, а для шістнадцяти розрядних - два
восьми розрядні регістри (які мають позначення H i L, відповідно. Тут H -
старший розряд регістру, L - молодший розряд регістру).
Регістри порівняння також мають свої імена. Наприклад, для таймера
Т1 це регістри OCR1A та OCR1B. Якщо регістр збігу шістнадцяти розрядний,
то фізично він складається з двох регістрів вводу-виводу інформації.
Наприклад, два регістри збігу таймера Т1 мікросхеми АTMega8 фізично
являють собою чотири регістри вводу-виводу з іменами OCR1AL, OCR1AH,
OCR1BL, OCR1BH.
Регістри порівняння включаються у роботу лише тоді, коли
користувачем обрано режим СТС (скидання при співпадінні). У цьому
режимі, як і у режимі захоплення, таймер здійснює підрахунок кількості
вхідних імпульсів. Поточне значення таймера з його лічильного регістра
постійно порівнюється з вмістом регістру порівняння. Якщо ж таймер має два
регістри порівняння, то для кожного з них проводиться окреме порівняння.
Коли вміст рахункового регістру збігатиметься з вмістом одного з регістрів
порівняння - системою здійснюється виклик відповідного переривання.
Окрім виклику переривання, в момент співпадіння може відбуватися також
одна з наступних подій:
● скидання таймера (характерно лише для регістрів порівння OCR1 та
OCRIA);
● зміна стану одного з виводів мікроконтролера (характерно для всіх
регістрів таймеру);
Варто зазаначити, що дозвіл на події, які можуть відбуватись після
виклику переривання задається користувачем при налаштуванні параметрів
таймера.

Режим «Швидкодіючого ШІМ» (Fast PWM)


Абревіатура ШІМ розшифровується як Широтно-Імпульсна Модуляція,
що англійською звучить як "Pulse Width Modulation" (PWM). Сигнал
отриманий внаслідок ШІМ часто використовується у різноманітних
пристроях управління і може бути застосований, наприклад, для регулювання
швидкості обертання електродвигуна постійного струму.
Для цього замість постійної напруги на двигун подається прямокутна
імпульсна напруга. Завдяки інерції двигуна імпульси ШІМ-сигналу
згладжуються, а двигун обертається рівномірно. Змінюючи скважність ШІМ
імпульсів (тобто відношення періоду імпульсів до їх тривалості), можна
змінювати і середню напругу, що прикладена до двигуна і, тим самим -
змінювати швидкість його обертання. Аналогічно за допомогою ШІМ можна
керувати й іншими пристроями (наприклад, нагрівальними елементами,
освітлювальними приладами тощо). Перевагою імпульсного керування є і
високий ККД. Адже імпульсні керуючі елементи розсіюють набагато менше
паразитної потужності, ніж керуючі елементи, що працюють у аналоговому
режимі.
Для формування сигналу ШІМ за допомогою таймеру
використовуються ті ж регістри порівняння, які працюють і в режимі СТС, а
формування сигналу ШІМ може здійснюватися кількома різними способами.
Приклад роботи таймера у режимі Fast PWM проілюстровано на рис. 12.2.
Сигнал із ШІМ формується на спеціальному виході мікроконтролера, а на
вхід таймера при цьому подаються імпульси системного генератора. При
роботі у режимі ШІМ, таймер фактично перебуває у стані безперервного
рахунку. При переповненні таймера - його вміст скидається в нуль, і рахунок
починається спочатку. Однак, на відміну від СТС, у режимі ШІМ
переповнення таймера не викликає переривань.

Рисунок 12.2. Візуалізація роботи таймеру в режимі Fast PWM

Як видно з рис. 12.2 пилкоподібна крива TCNT ілюструє залежність


вмісту рахункового регістру від часу. Вміст рахункового регістру безперервно
порівнюється з вмістом регістру порівняння. Допоки число в регістрі OCR
більше, ніж число в лічильному регістрі таймера (TCNT), напруга на виході
ШІМ дорівнює логічній одиниці. Коли ж, у процесі рахунку, вміст
рахункового регістра TCNT стає більшим за вміст OCRn - на виході ШІМ
встановлюється нульовий потенціал (рівень лог. 0). В результаті, на виході
PWM користувач може отримати набір прямокутних імпульсів заданої
тривалості (Uвих на рис. 12.2).
Скважність таких імпульсів буде залежати від вмісту регістру OCRn.
Чим меншим буде число записане у OCRn, тим вищою буде скважність
вихідних імпульсів. Зокрема, на рис. 12.2 показано скважність імпульсів для
двох різних значень регістра OCRn. Якщо ж вміст OCRn досягне свого
максимального значення - то імпульси на виході ШІМ зникнуть і там
постійно буде присутнім рівень лог. 1.
При зменшенні числа OCRn на Uвих з'являться імпульси малої
скважності (тривалість яких буде майже рівна періоду сигналу). Якщо плавно
зменшувати число в OCRn, то скважність сигналу при цьому також буде
плавно зменшуватися. Коли вміст OCR досягне нуля, імпульси на виході
ШІМ також зникнуть і там встановиться рівень лог.0

Режим "ШІМ з точною фазою"


Описаний вище режим ШІМ має один недолік: при зміні тривалості
імпульсів змінюється і їх його фаза. Тобто, центр кожного імпульсу ніби
“зсувається у часі”. При керуванні деякими типами електричних пристроїв
(зокрема і електродвигунами така поведінка фази є небажаною). Тому, в
мікроконтролерах AVR передбачено ще один режим ШІМ - це так званий
режим ШІМ “із точною фазою” (Phase Correct PWM). Принцип роботи
таймера у цьому режимі зображено на рис. 12.3.

Рисунок 12.3. Візуалізація роботи таймеру в режимі Phase Correct PWM

Відмінність режиму "Phase Correct PWM" від режиму "Fast PWM"


полягає у режимі роботи самого лічильника. Спочатку лічильник рахує
аналогічно, як і в попередньому режимі (від кожного вхідного імпульсу його
значення збільшується на одиницю). Однак, досягнувши свого
максимального значення, тут лічильник не скидається в нуль, а перемикається
в режим реверсивного рахунку.
Тобто, після ввімкнення реверсивного рахунку, при кожному вхідному
імпульсі вміст лічильника зменшується на одиницю. В результаті
пилкоподібна крива, що відображає вміст лічильного регістра TCNT, стає
симетричною, як показано на рис. 12.3. Система співпадіння у “Phase Correct
PWM” працює так само, як і у режимі “Fast PWM”.
Завдяки симетричності сигналу на таймері фаза вихідних імпульсів у
процесі регулювання скважності не змінюється, адже середина кожного
імпульсу чітко прив'язана до точки зміни напряму рахунку таймера. Однак,
недоліком режиму “Phase Correct PWM” можна вважати вдвічі меншу частоту
його вихідного сигналу, що суттєво зменшує динамічність регулювання за
допомогою апаратного ШІМ мікроконтролера.

Асинхронний режим
У деяких моделях мікроконтролерів таймер може працювати і в
асинхронному режимі роботи. У цьому режимі на вхід Т/Л подається або
частота від внутрішнього кварцового генератора, або від зовнішнього
генератора сигналів. В такому випадку лічильник не генеруватиме жодних
переривань чи додаткових сигналів, а працюватиме як годинник реального
часу. При роботі у асинхронному режимі МК може попередньо
встановлювати вміст рахункового регістру. А вже потім, у будь-який момент
часу, зчитувати цей вміст, отримуючи таким чином поточне значення
реального часу.

12.3. Переддільники таймерів


Як було зазначено раніше, кожен таймер мікроконтролера може
працювати від двох різних джерел тактових імпульсів. Яке б джерело
сигналів не обиралось для забезпечення роботи Т/Л, перед тим як потрапити
на відповідний вхід таймера, тактовий сигнал проходить схему попереднього
дільника. Попередній дільник (або переддільник) призначений для того, щоб
розширити діапазон формуємих частот і тривалості лічильного циклу
таймерів. Кожна мікросхема AVR має власну структуру попереднього
дільника для таймерів/лічильників. Спрощена схема одного з варіантів
реалізації попереднього дільника показана на рис. 12.4.
Як видно з рис. 12.4, частота внутрішнього тактового генератора CLK
надходить на спеціальний десятирозрядний дільник. З виходів дільника
знімаються сигнали CLK/8, CLK/32, CLK/64, CLK/128, CLK/256 та
CLK/1024. Усі ці сигнали в подальшому надсилаються на входи даних
мультиплексора. В той же час, на адресні входи мультиплексора надходять
сигнали від трьох розрядів регістру керування таймером (TCCRn).
Таким чином, записуючи в розряди CSn0, CSn1, CSn2 різні значення
можна вибрати один з восьми режимів роботи переддільника. Залежно від
обраного режиму, на вихід схеми можуть надходити сигнали від одного з
виходів 10-ти розрядного дільника, прямий сигнал з тактового генератора
або нульовий логічний рівень (вхід D0).

Рисунок 12.4. Переддільник для таймеру МК


В останньому випадку сигнал на вході таймера буде відсутній і його
робота зупиниться. Схема наведена на рис. 12.4, не є стандартом для всіх
мікроконтролерів серії AVR. Вона відображає лише загальний принцип
побудови попередніх дільників частоти. У різних моделях МК її
схемотехнічна реалізація може відрізнятись. Зокрема, на рис. 12.5 показано
ще одну схему переддільника. Ця схема, на відміну від попередньої,
передбачає подачу на входи таймерів тактового сигналу від зовнішнього
джерела. Для цього кількість сигналів, що знімаються з 10-ти розрядного
дільника зменшується до чотирьох (виводи CLK/32 та CLK/128 вимкнено).
Натомість, у схемі додаються ланцюги, якими на вхід таймера можуть
надсилатись зовнішні імпульси (які подаються на вхід Tn).

Рисунок 12.5. Переддільник для таймеру МК

З цього входу імпульси надходять на формувач, який здійснює їхню


попередню обробку (наближає форму імпульсів до прямокутної), а вже потім
імпульси надходять на вхід D7 дешифратора. В свою чергу, на вхід D6
надходять такі ж імпульси, але в інвертованому вигляді. В результаті, для
схеми, що показана на рис. 12.5, отримуються такі режими роботи:
• режим 0 – відсутність імпульсів;
• режим 1 – прямий сигнал від внутрішнього генератора;
• режими 2...5 – один із сигналів з дільника;
• режим 6 – інверсний сигнал із зовнішнього входу;
• режим 7 – прямий зовнішній сигнал.

12.4. Watchdog (сторожовий) таймер


Сторожовий таймер мікроконтролера призначений для автоматичного
перезапуску МПС у випадку «зависання» її робочої програми (зациклення
процесу виконання в результаті помилки, допущеної програмістом або в
результаті дії зовнішніх завад). Фактично, Watchdog – це таймер, який
здійснює підрахунок імпульсів незалежно від основної програми та
призначений для відслідковування моменту її «зависання». Для кожної
мікросхеми міконтролеру достатньо лише одного сторожового таймеру, а її
наявність передбачена виробником у всіх МК серії AVR.
Суть роботи watchdog полягає у наступному: якщо сторожовий таймер
увімкнено і основна програма працює стабільно, то через певні проміжки
часу в ній повинен виконуватись код, який “скидає” цей таймер. Якщо таймер
постійно скидається, то це означає, що мікропроцесорна система працює
стабільно. Однак, якщо у певний момент часу спеціальний код скидання не
надійде до Watchdog-таймеру, це означатиме що частина основної програми
не виконалась і МК припинив свою стабільну роботу.
У такому випадку сторожовий таймер дорахує до певного значення і
повністю перезапустить роботу мікроконтролера (як наслідок, основна
програма записана у МК починає виконуватися з початку). Тобто, Watchdog
через певні проміжки часу (при настанні спеціальної події, яка має назву
Time-Out) примусово перезавантажує роботу основної програми. Для того
щоб уникати постійного перезавантаження робочогої програми, нормально
працююча МПС повинна постійно обнуляти сторожовий таймер через
проміжки часу, які є меншими ніж Time-Out період цього таймеру. Скидання
Watchdog відбувається спеціальною командою: #asm («wdr»), а якщо
увімкнути сторожовий таймер за допомогою Fuse-бітів МК, то він буде
задіяний у роботі постійно, без можливості повторно відключити його
програмним шляхом.
Варто зазначити, що у технічній документації до мікроконтролерів AVR
вказано, що Watchdog тактується від окремого вбудованого генератора,
частота якого складає 1 МГц при напрузі живлення номіналом у 5 В. Однак,
необхідно також враховувати, що робоча частота сторожового таймеру може
змінюватись при не стабільному живленні МК (табл. 12.1).

Таблиця 12.1. Значення параметру Time-Out залежно від переддільника Watchdog

Кількість циклів Типове значення Типове значення Time-Out при


Watchdog генератора Time-Out при

16K 17.1 мс 16.3 мс


32K 34.3 мс 32.5 мс
64K 68.5 мс 65 мс
128K 0.14 с 0.13 с
256K 0.27 с 0.26 с
512K 0.55 с 0.52 с
1024K 1.1 с 1.0 с
2048K 2.2 с 2.1 с

Наприклад, для переддільника «16 К» при 3 В Time-Out складає


17.1 мс, а при 5 В – вже 16.3 мс, тощо.

You might also like