Генериране на аналогови сигнали от микроконтролер
В устройства, базирани на микроконтролери, понякога е необходимо да се генерира аналогов сигнал. В зависимост от честотата на аналоговия сигнал, необходимата разделителна способност и вида на използвания микроконтролер има няколко начина да направите това. А именно: използване на широчинно-импулсна модулация, използване на функционалността на хардуерни таймери или софтуерна реализация, използване на вградения цифрово-аналогов преобразувател (DAC), използване на външни схеми за цифрово-аналогов преобразувател на дискретни елементи или използване на външни чипове за цифрово-аналогов преобразувател.
ШИМ сигналът е цифров сигнал, чийто период на повторение е постоянен, а продължителността варира. Съотношението на продължителността на ШИМ сигнала към неговия период се нарича работен цикъл. След като прекараме такъв сигнал през нискочестотен филтър, което по същество е еквивалентно на интегрирането, ще получим ниво на напрежение, пропорционално на работния цикъл на изхода на филтъра.

Така че, като промените това съотношение, можете да генерирате аналогови произволни вълнови форми. Освен това, както променливи, например синусоида, трион или човешка реч, така и константи (произволно ниво на напрежение).
1.1 Характеристики на сигнала
Максималната аналогова изходна амплитуда ще се определя от амплитудата логическа единица на цифровия PWM сигнал. Ако микроконтролерът се захранва от +5 V, тогава грубо казано, амплитудата на аналоговия изходен сигнал ще бъде от 0 до 5 V.
Минималната стъпка на промяна на аналоговия сигнал (резолюция) ще се определя от израза:
където Umax е максималната амплитуда на аналоговия сигнал (V), а n е ширината на брояча, прилагащ ШИМ.
Например ШИМсигналът се формира с помощта на софтуерен 8-битов брояч. Броят на градациите на PWM сигнала, които могат да бъдат получени с помощта на този брояч, е 2 ^ 8 = 256. Тогава разделителната способност на аналоговия сигнал при Umax = 5 V ще бъде равна на
dUa = 5/256 = 0,0195 V.
Честотата на PWM сигнала ще се определи както следва:
където Fcpu е тактовата честота на микроконтролера (Hz), K е коефициентът на предразпределителя на брояча, n е капацитетът на брояча.
Например, тактовата честота на микроконтролера е 8 MHz, коефициентът на предразпределителя е 8, броячът е с ширина 8 бита. Тогава честотата на изходния PWM сигнал ще бъде равна на:
Аналоговата изходна честота ще се определя от:
Fa = Fpwm/Ns = Fcpu/(K*2^n*Ns),
където Fpwm е честотата на PWM сигнала, а Ns е броят на пробите на аналоговия сигнал. Например, PWM сигнал се реализира на 8-разряден брояч с коефициент на предварителен мащаб 8 и тактова честота на микроконтролера 8 MHz. Паметта на микроконтролера съдържа 32 показания на синусоидалния сигнал, които представляват един от неговите периоди. Тогава честотата на изходната синусоида ще бъде равна на:
Fa = 8000000/(8*2^8 * 32) =
Разрядността на ЦАП, направен на базата на ШИМ, е еквивалентна на разрядността на използвания брояч.
1.2 Хардуерна реализация на ШИМ
Всички съвременни микроконтролери включват таймери/броячи. Един или повече режима на тези таймери са проектирани да генерират ШИМ сигнал. Като правило, този сигнал се генерира на специални щифтове. Например, микроконтролерът Atmel mega16 има 8-битов таймер / брояч T0, който има два режима на генериране на PWM сигнал (бърз PWM и PWM с точна фаза), а щифтът на порт B - OC0 (PINB3) се използва за извеждане на сигнала.
Предимството на хардуераРеализациите на PWM сигнал са ниско натоварване на микроконтролера (прекъсване се извиква веднъж за период на PWM сигнал), лекота на използване и точност (ако има малко прекъсвания в системата). Сред недостатъците може да се отбележи ограничената разделителна способност на броячите, ниската честота, ограниченият брой канали, на които могат да се генерират PWM сигнали. Въпреки че има специални микроконтролери, специално "заточени" за генериране на голям брой PWM сигнали.
1.3 Софтуерна реализация на ШИМ
Възможно е също така да генерирате PWM сигнал в софтуера. За да направите това, просто създайте софтуерен брояч и увеличете стойността му чрез сигнал на хардуерен таймер и проследете достигането на крайните стойности на брояча, при които PWM сигналът променя състоянието.
Софтуерното внедряване има предимството на простота, неограничени канали, неограничена резолюция. Разбира се, условно неограничен, като се вземе предвид наличната памет. Недостатъци на софтуерната реализация - високо натоварване на микроконтролера. Прекъсванията трябва да се извикват за всяко увеличение на брояча и всеки път, когато е необходимо да се проверява дали е достигнал една от екстремните стойности. Освен това софтуерната реализация има по-малка точност (по-голямо трептене на ръба) и дори по-ниска честота (поради първия недостатък).
Но въпреки това, софтуерната реализация на PWM също има място, ако искате да генерирате постоянен аналогов сигнал или променлив, но с ниска честота.
Следва пример за код, който изпълнява функцията за генериране на аналогов сигнал с помощта на хардуерна и софтуерна модулация на ширината на импулса. Кодът е написан за микроконтролера atmega16, тактова честота 8 MHz, IAR компилатор. На изходите PB2 и PB3 се генерират две синусоиди (с различни честоти) от 32 две проби.
1.4 Филтър за ШИМ
Граничната честота на филтъра трябва да бъде между максималната честота на генерираните аналогови сигнали и честотата на ШИМ сигнала. Ако граничната честота на филтъра е избрана близо до границата на честотната лента на аналоговия сигнал, тя ще бъде отслабена. И ако граничната честота на филтъра е близка до честотата на PWM сигнала, аналоговият сигнал просто няма да "се откроява". Колкото по-висока е честотата на ШИМ сигнала, толкова по-лесно е да се реализира изходният филтър.
Помислете за пример. PWM сигналът се генерира от хардуерен 8-разряден брояч с коефициент на прескалер 8, тактовата честота на микроконтролера е 8 MHz, броят на пробите на аналоговия сигнал е 32.
Честотата на PWM сигнала ще бъде равна на:
Fpwm = Fcpu/(K*2^n) = 8000000/(8*256) =
Честотата на аналоговия сигнал ще бъде равна на:
Fa = Fpwm/Ns = 3906/32 = 122 Hz
Нека изберем гранична честота от 200Hz и изчислим рейтингите на пасивния нискочестотен RC филтър. Честотата на прекъсване на такъв филтър се дава от:
където R е стойността на резистора (Ohm), а C е капацитетът на кондензатора (F).
Като се има предвид стойността на един от компонентите, можете да изчислите стойността на втория. За резистор с номинална стойност 1 kOhm, капацитетът на кондензатора ще бъде равен на:
C = 1/(2*Pi*Fc*R) = 1/(6,28 * 1000*200) =
Изберете най-близката стойност от серията E12 - 0,82 uF. С такива стойности на филтъра ще получим подобен аналогов сигнал.
Въпреки това, като правило, една връзка на пасивния филтър няма да е достатъчна. Тъй като след него аналоговият сигнал все още ще съдържа голям брой хармоници.