вівторок, 11 лютого 2014 р.

Таймери в мікроконтролерах AVR. Теорія


     Щось я останнім часом підзабив на блог. Вже давно обіцяв статтю про таймери, але щось ніяк руки не доходили до неї. Пора виправлятися.
     Отже, що таке таймери в мікроконтролерах AVR. Коротко кажучи, таймер - це апаратний вузол МК, призначений для відрахунку відрізків часу.

       Таймер в загальному випадку складається з задаючого генератора імпульсів і лічильника, який змінює своє значення (інкрементує чи декрементує) з кожним імпульсом що надходить.  По аналогії з механічним секундоміром, де генератором імпульсів служить маятник, а лічильник - система шестернь, що переміщує стрілку. Тому таймери AVR позначаються як таймер/лічильник (Timer/counter). Проте в такому випадку таймер ніяк не зв'язаний з "навколишнім середовищем", тому в реальному МК до нього ще прив'язані додаткові елементи і керуючі регістри. Наприклад лічильник пов'язаний з рахунковим регістром, з якого можна зчитувати поточне значення або записувати початкове значення для відрахунку (при потребі рахувати не від 0).  Також часто таймери мають регістри порівнянь - значення рахункового регістру порівнюється зі значеннями в регістрах порівнянь і при рівності значень подаються сигнали.
     Обов'язковим елементом таймерів в МК є механізм виклику переривання за певних обставин (переповнення лічильника, досягення рівності значень лічильника і регістрів порівнянь та ін). Це дозволяє реалізувати відрахунки часових інтервалів незалежно від виконання основної програми МК, а це і є одна з головних причин використання таймерів. Тепер можна досягти і точності (яка абсолютно не залежатиме від виконання програми, а лише від точності задаючого генератора таймера) і звільнити головну програму від програмних затримок часу, що сповільнюють її роботу.
        В залежності від лічильника/рахункового регістру таймери можуть бути 8-ми або          16-ти розрядними. 
     Для мікроконтролерів AVR сімейства Tiny характерна наявність одного або двох таймерів. Позначаються вони Timer0 і Timer1. Зазвичай один з таймерів має спрощений набір функцій (Timer0), а другий - розширений(Timer1). Якщо в МК лише один таймер, то він у більшості випадків має розширений набір функцій.

Timer 0 

     Розглянемо спочатку  Timer0 нашого МК ATtiny 26. Тут він має мінімальний набір функцій:
1. Відрахунок часових інтервалів
2. Підрахунок кількості зовнішніх подій.
3. Генерація переривання по переповненню лічильника
 Спрощена блок/схема цього вузла показана на рисунку:

     
     Отже, тактова частота f osc (від тактового генератора МК) подається на вхід подільника частоти, який формує сигнали з частотю меншою в 8, 64, 256 і 1024 рази від тактової. Далі ці сигнали подаються на входи мультиплексора (фактично керований перемикач). Також на входи мультиплексора подається прямий тактовий сигнал і прямий та інвертований сигнали із зовнішнього входу Т0. Вхід Т0 виведений на один з виводів МК.
     В залежності від значень керуючих регістрів мультиплексор переключає один із своїх входів на вихід, до якого приєднаний лічильник (8-ми розрядний) з рахунковим регістром. Лічильник має вихід переповнення, який подається на блок генерації переривання Timer0overflow. Ввімкнення генерації переривання також залежить від стану керуючих регістрів.
     Отже лічильник, в залежності від налаштування керування мультиплексором, може рахувати тактові імпульси з різною частотою від тактового генератора (відрахунок часових інтервалів), а також зростаючі або спадаючі фронти імпульсів, поданих на вхід Т0 (лічильник зовнішніх подій). Лічильник тут сумуючий, тобто значення рахункового регістру інкрементується при надходженні кожного наступного імпульсу. При переповненні лічильника (при попередньому значенні регістра 255 і надходженні імпульса) ініціюється переривання Timer0OVF (якщо звичайно воно дозволене налаштуваннями керуючих регістрів), рахунковий регістр обнулюється, рахунок продовжується з нульового значення..
    Конкретні налаштування керуючих регістрів та принципи керування таймером ми розглянемо у практичній частині. 

Timer1

    Цей таймер оснащений розширеним набором функцій. У мікроконтролері ATtiny 26 він 8-ми розрядний, як і Timer0. Список функцій, які може виконувати даний вузол:

1.  Відрахунок часових інтервалів
2.  Генерація переривання по переповненню лічильника.
3.  Апаратна генерація сигалів з широтно-імпульсною модуляцією (ШИМ) (2 канали).
4. Виконання порівняння значення лічильника з попередньо заданими значеннями регістрів OCR1A, OCR1B і генерація відповідних переривань при співпадінні.
5.  Можливість тактування як від системного тактового генератора (fc)(синхронний режим), так і від внутрішньої схеми ФАПЧ з частотою 64 Мгц (fpck). (асинхронний режим). 



Як бачимо, структура цього таймера складніша від Timer 0. Слід відмітити значно ширші налаштування тактової частоти таймера, наявність блоків порівняння значення рахункового регістру з регістрами порівняння, блок керування апаратними виходами і ШИМ модулятор.

     На відміну від таймера Timer 0 цей таймер має два режими роботи, які можна змінювати за допомогою значень в керуючих регістрах.
    1. Режим таймера (стандартний режим). Лічильник працює як сумуючий, при переповненні відрахунок починається з 0 і формується сигнал на переривання Timer1OVF. В цьому режимі також працюватимуть функції порівняння значення рахункового регістру (TCNT1) з значеннями регістрів порівняння OCR1A  та  OCR1B. У випадку співпадіння значень формується запит на переривання Timer1CompA  і  Timer1CompB відповідно. Якщо дані переривання дозволені в налаштуваннях керуючих регістрів то вони відбуваються. При цьому рахунок в лічильнику продовжується далі.
    Також у цьому режимі можуть працювати апаратні виходи OC1A, OC1B та відповідні інверсні OC1A, OC1B . Ці виводи змінюють свої рівні при співпадінні рахункового регістра з OCR1A  та  OCR1B. Зміна рівнів залежить від  налаштувань керуючих регістрів і буде розглянута пізніше (у практичних експериментах). Також можна примусово змінювати рівні на виводах за допомогою керуючих регістрів.
   У складі Timer 1 є також третій регістр порівняння - OCR1С. Він дозволяє задати максимальне значення лічильника (верхню межу відліку). При певних налаштуваннях керуючих регістрів лічильник буде збільшувати своє значення, поки не досягне значення, записаного в регістрі OCR1С, при наступному такті він почне відрахунок з 0.

  2. Режим Широтно Імпульсного Модулятора (ШИМ, PWM).
Широтно імпульсна модуляція (Pulse Width Modulation, PWM) - це один з найбільш широко застосовуваних в наш час метод керування силовими колами. За допомогою ШИМ часто регулюється напруга у імпульсних блоках живлення, змінюється частота обертання електродвигунів постійного струму, регулюється яскравість  освітлювальних приладів. У випадку, коли керування ШИМ здійснюється мікроконтролером, можна розглядати ШИМ як метод ЦИФРО-АНАЛОГОВОГО ПЕРЕТВОРЕННЯ.


Що таке ШИМ

  Широтно імпульсно модульований сигнал являє собою послідовність імпульсів з постійним періодом (і відповідно частотою), але з різним співвідношенням ширини імпульса до ширини паузи. Це співвідношення в одному періоді називають  СКВАЖНІСТЮ імпульсу, а в сумарному шим-сигналі - КОЕФІЦІЄНТОМ ЗАПОВНЕННЯ.
Графік типового ШИМ сигналу показаний на рисунку.
   Як бачимо, імпульси ідуть з однаковою частотю, проте ширина імпульсів різна. Як же такий сигнал може керувати скажімо, яскравістю свічення світлодіода? Адже він буде просто блимати відповідно до імпульсів, що поступатимуть на нього.  Справа в тому, що ШИМ модуляція зазвичай відбувається з великою частотою, наприклад більше 1 кГц. В такому випадку саме блимання буде не помітно оком, а от кількість енергії, що випромінюється за одиницю часу буде змінюватись відповідно до співвідношення ширини імпульса і паузи, що і сприйматиметься як зміна яскравості. Можливе також регулювання саме напруги або струму через навантаження цим методом, для цього після модулятора вмикають фільтр на основі індуктивності і конденсаторів (LC фільтр). В такому випадку напруга на виході такого пристрою, або струм через навантаження пропорційні до коефіцієнту заповнення ШИМ сигналу (це використовується в імпульсних блоках живлення). Для регулювання частоти оборотів двигуна постійного струму фільтр фактично не потрібен - обмотки двигуна самі виконують роль індуктивного фільтра.

    Формування ШИМ сигналу за допомогою таймера МК.

     Як же пов'язаний таймер/лічильник МК з ШИМ сигналом? Справа в тому, що так як таймер здійснює відрахунок часових відрізків, з допомогою нього легко можна сформувати імпульси з певним періодом і довжиною. Розглянемо найпростіший метод - лічильник рахує у звичайному режимі - циклічно через переповнення. Задіяне також переривання по порівнянню, припустимо з регістром OCR1A. В перериванні по переповненню ми будемо вмикати вихід OUT, подаючи на нього лог.1. В перериванні порівняння Timer1CompA будемо вимикати вихід, подаючи на нього лог.0.
   
     Отже, ми матимемо послідовність імпульсів, які ідуть з однаковим періодом (рівним періоду переповнення лічильника, який можна вирахувати як 256/fт), де fт - частота тактування таймера. Довжина імпульсу буде пропорційна до значення в регістрі OCR1A, чим більше значення, тим пізніше вимкнеться вихід, тим довшим буде імпульс і менша пауза.

      Насправді описаний метод це фактично програмне формування ШИМ, Timer1 же містить апаратний ШИМ модулятор, який сам вмикає і вимикає виходи за описаних умов. Сигнали на переривання також формуються, але зазвичай при роботі в ШИМ режимі переривання від таймера не використовуються і забороняються в налаштуваннях керуючих регістрів.

      Для включення апаратного ШИМ модулятора існує відповідний флаг в керуючих регістрах. При переході в ШИМ режим робота таймера дещо відрізняється від стандартного режиму. Тут по замовчуванні таймер рахує не до переповнення, а до значення, що записане в регістрі OCR1С. При досягненні рівності значень TCNT1 і OCR1C лічильник скидається в 0. Це дозволяє точніше встановлювати частоту імпульсів, вона тут залежить не лише від частоти тактування, а і від значення OCR1C.
     Наявність двох регістрів порівняння OCR1A  та  OCR1B дозволяє отримати два канали ШИМ модулятора, (але з однаковою частотою). Тобто можна легко керувати двома однотипними навантаженнями, наприклад незалежно змінювати яскравість двох світлодіодних ламп. 
     Слід зауважити, що значення регістрів OCR1A  та  OCR1B можуть лежати в діапазоні від 0 до значення OCR1C. Звичайно, ніхто не забороняє записати туди значення що перевищує регістр OCR1C але в такому випадку ми матимемо на виході сигнал з постійним рівнем а не імпульсну послідовність, так як значення TCNT1 ніколи не досягне умови рівності з регістром порівняння, відповідно сигнал на виході не буде змінюватись.

  ШИМ модулятор в МК ATTiny 26 має як прямі виходи OC1AOC1B так і інверсні OC1AOC1B   Притому рівні на інверсних виходах в ШИМ режимі змінюються не одночасно з зміною рівнів прямих виходів. Перехід з 0 в 1 інверсного імпульса відбувається на один період тактової частоти таймера пізніше, ніж перехід з 1 в 0 на прямому виході, а зворотній перехід з 1 в 0 на інверсному виході відбувається навпаки раніше на період ніж перехід з 0 в 1 на прямому.  Включення прямих і інверсних виходів, а також порядок зміни сигналу на них можна змінювати за допомогою керуючих регістрів.  Стандартне формування ШИМ сигналу таймером  ATTiny 26 показане на рисунку:  Слід зазначити, що значення в регістрах OCR1A  та  OCR1B змінюються в момент обнулення лічильника. Це реалізовано апаратно за допомогою так званих буферних регістрів, тобто програма може змінити значення в будь який момент часу, але запис його в регістри порівняння відбудеться в момент переходу лічильника через 0, до цього моменту вони зберігаються у буфері.
    

      У практичних експериментах я покажу як налаштовуються ті чи інші функції таймерів за допомогою круючих регістрів, а з теоретичною частиною поки що все. Звичайно, в інших МК набір додаткових функцій таймерів може відрізнятися, для кожного конкретного МК опис можна знайти в даташиті на МК або у книгах Евстіфеева.

1 коментар:

  1. доброго дня , ви не хочете викласти свої матеріали в цьому сервісі?)
    http://codeguida.com/

    ВідповістиВидалити