AVR131 використання високошвидкісного ШІМ, avr, programming
В апноутіAVR131 розглядаються питання генерації сигналу за допомогоюPWM, високошвидкісні режими тактування лічильника таймера з використанням прескалера. Абревіатура PWM означає Pulse Width Modulation (Широтно-Імпульсна Модуляція,ШІМ ). Такий апаратний модулятор є в деяких мікроконтролерах AVR. Надано приклади коду на асемблері, що показують використання швидкої ШІМ (fast PWM, high-speed PWM) на мікроконтролері ATtiny26. У маленькому мікроконтролері ATtiny15 також є таймер з можливістю PWM.
Режим fast PWM використовується для генерації імпульсної послідовності зі змінною шпаруватістю на ніжці мікроконтролера OC1A (вихідний порт PB1). Для згладжування імпульсів і отримання сигналу, що огинає, може використовуватися аналоговий фільтр (ФНЧ). Таким способом можна генерувати звуки, наприклад, синусоїдальної форми.
Гідність high-speed PWM полягає у збільшеній смузі генерованого вихідного аналогового сигналу, і спрощенні ФНЧ за рахунок високої частоти PWM - можна застосувати опори та конденсатори ФНЧ меншого номіналу та меншого розміру.
[Трохи теорії: як це працює ]
PWM у комбінації з аналоговим фільтром може використовуватися для отримання синтезованих аналогових вихідних сигналів, тобто в результаті виходить цифро-аналоговий перетворювач (Digital-Analog Converter, DAC). Сигнал у вигляді цифрових імпульсів 0 та 1 генерується на базі фіксованої частоти та змінної шпаруватості (тобто співвідношення тривалості 0 та 1 змінюється). Якщо необхідно збільшити рівень аналогового сигналу на виході, то тривалість балка. 1 збільшується, а тривалість балка. 0 зменшується, і навпаки.
Усереднення цифрового сигналу за період (з використанням ФНЧ) генерує аналоговий сигнал.Наприклад, шпаруватість 50% (коли тривалість 0 дорівнює тривалості 1) дає аналоговий вихідний сигнал з напругою половину напруги живлення, шпаруватість 75% дає сигнал з напругою 75% від напруги живлення. Приклади вихідних фільтрованих сигналів показані в кінці цього документа.
Аналоговий ФНЧ, наприклад, можна побудувати з урахуванням пасивного RC-фильтра. Фільтр видаляє високу базову частоти та залишає на виході аналоговий сигнал. Частота зрізу фільтра повинна бути обрана досить високою, щоб не впливати на аналоговий сигнал, що цікавить. У той же час частота зрізу повинна бути максимально низькою, щоб мінімізувати пульсації від базової частоти PWM.
Мал. 1. Найпростіший ФНЧ першого порядку.
Якщо аналоговий сигнал повинен приходити на низькоомне навантаження, він повинен бути посилений буферним підсилювачем з високим вхідним опором, включеним між виходом фільтра і споживачем сигналу. Це запобігає падінню рівня сигналу та покращить роботу фільтра.
Приклад осцилограми реального сигналу PWM, у якого змінюється шпаруватість, показано на рис. 2.

Мал. 2. Вихідний сигнал PWM із змінною шпаруватістю.
AVR таймери/лічильники використовуються для генерації сигналів PWM. Щоб змінити базову частоту PWM, змінюють частоту тактування таймера та верхнє значення для лічильника. Чим вище частота тактування, та/або менше верхнє значення для рахунку, тим вище базова частота PWM, або частота подій переповнення таймера. З повною роздільною здатністю (верхнє значення лічильника 255) максимальна базова частота PWM становитиме 250 кГц. Збільшення базової частоти вище цього значення може відбуватися за рахунок зменшення роздільної здатності, оскільки виходить грубіший крок в діапазоні від 0% до 100% шпаруватості.Зміна значення регістрів порівняння (Output Compare Registers, OCR) змінює шпару сигналу PWM.
Збільшення значення OCR збільшує шпаруватість. Вихід PWM дорівнює 1, поки лічильник не досяг значення OCR, і дорівнює 0, коли лічильник перевалив за значення OCR і продовжує вважати до верхнього значення. Цей режим генерації ШІМ називається Fast-PWM mode (швидкий режим PWM), або high-speed PWM (швидкісний PWM).

Мал. 3. Значення лічильника та вихідний сигнал PWM.
Коли для генерації аналогових сигналів використовується high-speed PWM, розмір кроку між аналоговими рівнями залежить від роздільної здатності PWM. Чим вище базова частота, тим її простіше відфільтрувати на виході і отримати сигнал з меншими пульсаціями. Вибір між роздільною здатністю та базовою частотою є компромісом при створенні програми.
[Альтернативне використання ]
Високошвидкісний таймер може також використовуватися для генерації високочастотних цифрових сигналів, які можуть використовуватися для тактування цифрових вузлів у додатку. Якщо встановити верхню межу рахунку лічильника в мале значення, доступна генерація великих частот.
Найбільша можлива частота тактування для високошвидкісного таймера ATtiny26 становить 64 МГц (при відключеному пресклері). З базовою частотою PWM 16 МГц PWM (верхнє значення рахунку 3) значення OCR може бути встановлене в 0, 1 (шпаровість 25%), 2 (шпаровість 50%, див. A на рис. 4) або 3 (шпаровість 100%). Це показує, що зниження верхньої межі рахунку збільшує базову частоту PWM, але знижує також роздільну здатність PWM.
Щоб досягти максимальної вихідної частоти, що отримується від таймера, він повинен бути запущений не в режимі PWM. Обидві величини, і OCR, і верхня межарахунки мають бути встановлені в 0. Тоді лічильник застрягне на значенні 0. Установка дії Output Compare Match на перемикання виходу (toggle output) зробить частоту перемикання таймера з кожним тиком тактів, в результаті вийде сигнал із частотою 32 МГц (B на рис. 4) .

Мал. 4. Високочастотний цифровий вихід.
На рис. 5 показано, як генерується синусоїдальний сигнал виходу high-speed PWM.
Код складається з 3 частин: ініціалізація, обробник переривання переповнення Timer1 (overflow ISR) цикл із відходом у режим сну. Реалізація передбачає наявність тактової частоти системи 8 МГц.

Мал. 5. Головний цикл прикладу коду генератора синусоїдального сигналу.
Ініціалізація. Щоб отримати вихід від PWM, ніжка Output Compare Timer1 (OC1A) повинна бути налаштована як вихідний порт.
Далі потрібно налаштувати таймер: готується джерело тактування таймера – запускається PLL, і встановлюється системна частота (це потрібно роботи). Для стабілізації PLL потрібно приблизно 100 мс, тому перед запуском основного коду відбувається очікування закінчення стабілізації PLL із опитуванням прапора захоплення PLL (PLL lock flag). Як тільки відбулося захоплення PLL, вибирається потрібна тактова частота для таймера.
Потім вибирається режим PWM, щоб висновок OC1A перемикався при події порівняння (compare match) і верхнє значення рахунку таймера встановлюється в 0xFF. Верхнє значення рахунку впливає на роздільну здатність (точність) PWM і на її верхню частоту – чим вище значення рахунку, тим вище точність (роздільна здатність), але менше базова частота PWM. У цьому прикладі встановлено максимальну величину для верхнього значення рахунку.
Тепер таймер готовий до роботи, і встановлення коефіцієнта поділу прескалеразапускає таймер. Останнім кроком дозволяється робота переривання з переповнення (Overflow interrupt).

Мал. 6. Підпрограма Init, ініціалізація виходу та Timer1 для роботи в режимі Fast PWM.
Обробник переривання (Interrupt Service Routine, ISR). Коли лічильник таймера досягає своєї встановленої верхньої межі в регістрі OCR1C (0xFF), запускається обробник переривання переповнення (Timer1 Overflow ISR). Це відбувається через постійні проміжки часу, тому що OCR1C не змінюється. Цей інтервал є базовою частотою вихідного сигналу fast PWM.
Виконання коду обробника переривання займає 13 циклів тактових ядра. Виклик та повернення додають додатковий час, виходить лише 21 такт системної частоти ядра. Оскільки 8-розрядний Timer1, переривання таймера відбувається кожен 256/(PWM_clock/system_clock) цикл. Приклад розрахований працювати від частоти 8 МГц внутрішнього RC-генератора. Якщо вибрати максимальну частоту тактування PWM 64 МГц, то переривання Timer1 Overflow відбуватиметься кожні 32 цикли ядра.
Хоча можна запустити PWM з максимальною частотою 64 МГц, у цьому додатку вибрано тактову частоту PWM, поділена прескалером на 4, тобто 16 МГц - для ілюстрації використання прескалера.

Мал. 7. Обробник переривання переповнення Timer1.
Очікування (Idle). Режим сну (sleep mode) Idle використовується для переведення пристрою в режим зниженого енергоспоживання, коли очікується виникнення наступного переривання. Після переривання пристрій знову переходить у режим сну.
Осцилограми. На скріншотах осцилограм нижче показані приклади формування синусоїдального сигналу, що формується PWM на ATtiny26. Осцилограми показують вихіднийсигнал виведення OC1A, який виробляє широтно-імпульсний модульований сигнал і разом з ним відфільтрований сигнал PWM. Використовується простий RC-фільтр для згладжування сигналу PWM та перетворення його на синусоїдальний сигнал – аналоговий сигнал, у якого амплітуда залежить від шпаруватості вихідного сигналу PWM. У RC-фільтри стоять номінали R = 10 кОм C = 100 nF, у результаті частота зрізу фільтра виходить 1 кГц, що дозволяє низькій частоті синусоїдального сигналу проходити через фільтр, при цьому успішно пригнічується висока базова частота PWM.

Мал. 8. Вихід OC1A – фільтрований та без фільтра.

Мал. 9. Вихід OC1A – фільтрований та без фільтра (з розтяжкою по осі часу).