Генерація аналогових сигналів мікроконтролером
У пристроях мікроконтролерів іноді потрібно генерувати аналоговий сигнал. Залежно від частоти аналогового сигналу, необхідного дозволу і типу мікроконтролера, що використовується, виконати це можна декількома способами. А саме: за допомогою широтно-імпульсної модуляції, використовуючи функціонал апаратних таймерів або програмну реалізацію, за допомогою вбудованого цифроаналогового перетворювача (ЦАП`а), за допомогою зовнішніх схем цифроаналогових перетворювачів на дискретних елементах або за допомогою зовнішніх мікросхем цифроаналогових.
ШИМ сигнал є цифровий сигнал, у якого період повторення постійний, а тривалість змінюється. Відношення тривалості ШІМ сигналу до його періоду називається коефіцієнтом заповнення. Пропустивши такий сигнал через низькочастотний фільтр, що, по суті, рівносильно інтегруванню, ми отримаємо на виході фільтра рівень напруги пропорційний коефіцієнту заповнення.

Таким чином, мені цей коефіцієнт, можна генерувати аналогові сигнали довільної форми. Причому як змінні, наприклад, синусоїда, пила чи людська мова, так і постійні (довільний рівень напруги).
1.1 Характеристики сигналу
Максимальна амплітуда вихідного аналогового сигналу визначатиметься амплітудою логічної одиниці цифрового ШІМ сигналу. Якщо мікроконтролер живиться від +5, то грубо кажучи, амплітуда вихідного аналогового сигналу буде від 0 до 5 В.
Мінімальний крок зміни аналогового сигналу (дозвіл) визначатиметься виразом:
де Umax максимальна амплітуда аналогового сигналу (В), а n - розрядність лічильника, що реалізує ШІМ.
Наприклад, ШІМсигнал формується за допомогою програмного 8-розрядного лічильника. Кількість градацій ШІМ сигналу, які можна отримати за допомогою цього лічильника, дорівнює 2^8 = 256. Тоді роздільна здатність аналогового сигналу при Umax = 5 В буде рівна
dUa = 5/256 = 0,0195 ст.
Частота ШИМ сигналу визначатиме так:
де Fcpu - тактова частота мікроконтролера (Гц), K - коефіцієнт предделителя лічильника, n - розрядність лічильника.
Наприклад, тактова частота мікроконтролера 8 МГц, коефіцієнт предделителя дорівнює 8, розрядність лічильника 8 біт. Тоді частота вихідного ШІМ сигналу дорівнюватиме:
Частота вихідного аналогового сигналу визначатиметься виразом:
Fa = Fpwm/Ns = Fcpu/(K*2^n*Ns),
де Fpwm - частота ЩИМ сигналу, а Ns - кількість відліків аналогового сигналу. Наприклад, ШІМ сигнал реалізується на 8-розрядному лічильнику з коефіцієнтом предделителя рівним 8 і тактовою частотою мікроконтролера 8 МГц. У пам'яті мікроконтролера записано 32 відліки синусоїдального сигналу, які є один його період. Тоді частота вихідної синусоїди дорівнюватиме:
Fa = 8000000 / (8 * 2 ^ 8 * 32) =
Розрядність ЦАП`a зробленого на основі ШІМ еквівалентна розрядності використовуваного лічильника.
1.2 Апаратна реалізація ШІМ
Усі сучасні мікроконтролери мають у своєму складі таймери/лічильники. Один або кілька режимів цих таймерів призначені для генерації ШІМ сигналу. Як правило, цей сигнал генерується на спеціальних висновках. Наприклад, у мікроконтролера mega16 фірми Atmel 8-розрядний таймер/лічильник Т0 має два режими генерації ШІМ сигналу (швидкий ШІМ і ШІМ з точною фазою), а для виведення сигналу використовується пін порту B - OC0 (PINB3).
Гідність апаратноїРеалізація ШІМ сигналу - це низьке завантаження мікроконтролера (переривання викликається один раз у період ШІМ сигналу), простота використання та точність (якщо в системі мало переривань). З недоліків можна відзначити - обмежена роздільна здатність лічильників, невисока частота, обмежена кількість каналів, на яких можна генерувати ШІМ сигнали. Хоча існують спеціальні мікроконтролери спеціально "заточені" для генерації великої кількості ШІМ сигналів.
1.3 Програмна реалізація ШІМ
Також можна генерувати ШІМ сигнал програмно. Для цього потрібно просто створити програмний лічильник і за сигналом апаратного таймера інкрементувати його значення та відслідковувати досягнення крайніх значень лічильника, в яких ШІМ сигнал змінює стан.
Перевага програмної реалізації - простота, необмежену кількість каналів, необмежений дозвіл. Звичайно, умовно необмежена, з урахуванням доступної пам'яті. Недоліки програмної реалізації – високе завантаження мікроконтролера. Переривання повинні викликатися на кожен інкремент лічильника і щоразу потрібно перевіряти, чи не досяг він одного з крайніх значень. Також програмна реалізація має меншу точність (більше тремтіння фронтів сигналу) та ще меншу частоту (через перший недолік).
Однак, незважаючи на це, програмна реалізація ШІМу теж має місце, якщо потрібно генерувати постійний аналоговий сигнал або змінний, але з невисокою частотою.
Нижче наведено приклад коду, який виконує функцію генерацію аналогового сигналу за допомогою апаратної та програмної широтно-імпульсної модуляції. Код написаний для мікроконтролера atmega16, тактова частота 8 МГц, компілятор IAR. На виходах PB2 та PB3 генеруються дві синусоїди (різної частоти) з 32 двох відліків.
1.4 Фільтр для ШІМ
Частота зрізу фільтра повинна бути між максимальною частотою аналогових сигналів, що генеруються, і частотою ШІМ сигналу. Якщо частота зрізу фільтра буде обрана близько до межі смуги аналогового сигналу, це призведе до його ослаблення. А якщо частота зрізу фільтра буде близько до частоти ШІМ сигналу, аналоговий сигнал просто не "виділиться". Чим вище частота ШІМ сигналу, тим простіше реалізувати вихідний фільтр.
Розглянемо приклад. ШИМ сигнал генерується апаратним 8-ми розрядним лічильником з коефіцієнтом предделителя рівним 8 тактова частота мікроконтролера 8МГц, кількість відліків аналогового сигналу - 32.
Частота ШИМ сигналу дорівнюватиме:
Fpwm = Fcpu/(K*2^n) = 8000000/(8*256) =
Частота аналогового сигналу дорівнюватиме:
Fa = Fpwm/Ns = 3906/32 = 122 Гц
Виберемо частоту зрізу рівну 200 Гц і розрахуємо номінали пасивного низькочастотного RC фільтра. Частота зрізу такого фільтра визначається виразом:
де R - номінал резистора (Ом), а C -ємність конденсатора (Ф).
Задавшись номіналом одного з компонентів, можна обчислити номінал другого. Для резистора номіналом 1 кОм, ємність конденсатора дорівнюватиме:
C = 1/(2*Pi*Fc*R) = 1/(6.28 * 1000*200) =
Вибираємо найближче значення з ряду E12 – 0.82 мкФ. За таких номіналів фільтра ми отримаємо вже схожий аналоговий сигнал.
Однак, як правило, однієї ланки пасивного фільтра буде замало. Тому що після нього аналоговий сигнал все ще міститиме велику кількість гармонік.