- PWM щифтове в AVR микроконтролер Atmega16
- Какво е ШИМ сигнал?
- Необходими компоненти
- Електрическа схема
- Програмиране на Atmega16 за ШИМ
Модулацията на широчината на импулса (PWM) е мощна техника, при която ширината на импулса се променя чрез поддържане на честотата постоянна. Техниката се използва в много системи за управление днес. Приложението на ШИМ не е ограничено и се използва в широк спектър от приложения като контрол на скоростта на двигателя, измерване, контрол на мощността и комуникация и т.н. В ШИМ техниката може лесно да се генерира аналогов изходен сигнал, използвайки цифрови сигнали. Този урок ще ви помогне да разберете PWM, неговите терминологии и как можем да го приложим с помощта на микроконтролер. В този урок ще демонстрираме ШИМ с микроконтролер AVR Atmega16 чрез промяна на интензивността на светодиода.
За да разберете подробно основите на ШИМ, моля, отидете на предишните ни уроци за ШИМ с различни микроконтролери:
- Урок за ARM7-LPC2148 PWM: Управление на яркостта на светодиода
- Модулация с широчина на импулса (ШИМ) с използване на MSP430G2: Контролиране на яркостта на светодиода
- Генериране на ШИМ с помощта на микроконтролер PIC с MPLAB и XC8
- Модулация с широчина на импулса (PWM) в STM32F103C8: Контрол на скоростта на DC вентилатора
- Генериране на PWM сигнали на GPIO щифтове на PIC микроконтролер
- Урок за PWM на Raspberry Pi
PWM щифтове в AVR микроконтролер Atmega16
Atmega16 има четири специални PWM пина. Тези щифтове са PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Също така Atmega16 има два 8-битови таймера и един 16-битов таймер. Timer0 и Timer2 са 8-битови таймери, докато Timer1 е 16-битов таймер. За да генерираме ШИМ, трябва да имаме преглед на таймерите, тъй като таймерите се използват за генериране на ШИМ. Както знаем, че честотата е брой цикли в секунда, при които таймерът работи. Така че по-високата честота ще ни даде по-бърз таймер. При генерирането на ШИМ, по-бързата ШИМ честота ще даде по-фин контрол върху изхода, защото може да реагира по-бързо на новите работни цикли на ШИМ.
В този урок на Atmega16 PWM ще използваме Timer2. Можете да изберете всеки работен цикъл. Ако не знаете какво е работен цикъл в ШИМ, тогава нека обсъдим накратко.
Какво е ШИМ сигнал?
Модулация на широчината на импулса (PWM) е цифров сигнал, който се използва най-често в схемите за управление. Времето, през което сигналът остава висок, се нарича „on time“, а времето, през което сигналът остава нисък, се нарича „off time“. Има два важни параметъра за ШИМ, както е обсъдено по-долу:
Работен цикъл на ШИМ
Процентът от времето, през което ШИМ сигналът остава ВИСОКИ (навреме) се нарича работен цикъл.
Както при 100ms импулсен сигнал, ако сигналът е HIGH за 50ms и LOW за 50ms, това означава, че импулсът е бил наполовина HIGH и наполовина LOW. Така че можем да кажем, че работният цикъл е 50%. По същия начин, ако импулсът е в 25ms HIGH състояние и 75ms в LOW състояние от 100ms, тогава работният цикъл ще бъде 25%. Забележете, че ние изчисляваме само продължителността на HIGH състояние. Можете да направите справка с картинката по-долу за визуално разбиране. Формулата за работен цикъл е тогава,
Работен цикъл (%) = Време за включване / (Време за включване + Време за изключване)
Така че, чрез промяна на работния цикъл можем да променим ширината на ШИМ, като по този начин се променя яркостта на LED. Ще имаме демонстрация за използване на различен работен цикъл при управление на яркостта на светодиода. Проверете демонстрационното видео в края на този урок.
След като изберете работния цикъл, следващата стъпка ще бъде избирането на ШИМ режим. Режимът PWM посочва как искате да работи PWM. Основно има 3 вида PWM режими. Те са както следва:
- Бърз ШИМ
- Фазово правилен ШИМ
- Фазово и честотно правилно ШИМ
Използва се бърза ШИМ, когато промяната на фазата няма значение. Използвайки Fast PWM, можем бързо да изведем PWM стойностите. Бързият ШИМ не може да се използва там, където промяната на фазата влияе на операцията като управление на двигателя, така че в такова приложение се използват други режими на ШИМ. Тъй като ще контролираме яркостта на светодиода, където промяната на фазата няма да повлияе много, затова ще използваме режима Fast PWM.
Сега, за да генерираме ШИМ, ще контролираме вътрешния таймер да отброява и след това да задаваме нула при определен брой, така че таймерът ще отброява и след това отново и отново връща на нула. Това определя периода. Сега имаме възможност да контролираме импулса, да включваме импулса при определен брой в таймера, докато той се покачва. Когато броячът се върне на 0, изключете импулса. Има много гъвкавост с това, защото винаги можете да получите достъп до брояча на таймера и да осигурите различни импулси с един таймер. Това е чудесно, когато искате да контролирате няколко светодиода едновременно. Сега нека започнем да свързваме един светодиод с Atmega16 за ШИМ.
Проверете всички проекти, свързани с ШИМ тук.
Необходими компоненти
- Atmega16 AVR микроконтролер IC
- 16Mhz кристален осцилатор
- Два кондензатора 100nF
- Два кондензатора 22pF
- Натисни бутона
- Джъмперни проводници
- Макет
- USBASP v2.0
- 2 светодиода (всеки цвят)
Електрическа схема
Използваме OC2 за ШИМ, т.е. Pin21 (PD7). Затова свържете един светодиод на PD7 щифт на Atmega16.
Програмиране на Atmega16 за ШИМ
Пълната програма е дадена по-долу. Запишете програмата в Atmega16 с помощта на JTAG и Atmel studio и вижте PWM ефекта върху светодиода. Яркостта му ще се увеличава и намалява бавно поради различен работен цикъл на ШИМ. Проверете видеото, дадено в края.
Започнете да програмирате Atmega16 с настройка на Timer2 Register. Регистриращите битове на Timer2 са както следва и можем да зададем или нулираме битовете съответно.
Сега ще обсъдим всички битове на Timer2, за да можем да получим желаната ШИМ с помощта на писмена програма.
В регистъра Timer2 има основно четири части:
FOC2 (Force Output Compare за Timer2): Битът FOC2 се задава, когато битовете WGM посочват режим, който не е PWM.
WGM2 (Режим на генериране на вълна за таймер2): Тези битове контролират последователността на броене на брояча, източника за максималната (TOP) стойност на брояча и какъв тип генериране на форма на вълната да се използва.
COM2 (Сравнете изходния режим за Timer2): Тези битове контролират поведението на изхода. Пълното описание на битовете е обяснено по-долу.
TCCR2 - = (1 <
Задайте битове WGM20 и WGM21 като HIGH, за да активирате PWM Fast Mode. WGM означава режим на генериране на вълнови форми. Битовете за избор са както по-долу.
WGM00 |
WGM01 |
Работа в режим Timer2 |
0 |
0 |
Нормален режим |
0 |
1 |
CTC (Clear Timer On Compare Match) |
1 |
0 |
ШИМ, фаза правилна |
1 |
1 |
Бърз ШИМ режим |
За повече подробности относно режима на генериране на вълновите форми можете да се обърнете към официалния лист с данни на Atmega16.
TCCR2 - = (1 <
Също така не сме използвали предварително мащабиране, така че сме задали Clock source register като '001'.
Битовете за избор на часовник са както следва:
CS22 |
CS21 |
CS20 |
Описание |
0 |
0 |
0 |
Няма източник на часовник (таймер / брояч спря) |
0 |
0 |
1 |
clk T2S / (без предварително мащабиране) |
0 |
1 |
0 |
Clk T2S / 8 (от Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (от Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (от Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (от Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (от Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (от Prescaler) |
Също така OC2 се изчиства при сравняване на съвпадение чрез задаване на бита COM21 като '1' и COM20 като '0'.
Опциите за избор на режим Сравнение на изходния режим (COM) за бърз ШИМ режим са дадени по-долу:
COM21 |
COM21 |
Описание |
0 |
0 |
Нормална работа на портовете, OC2 е изключен. |
0 |
1 |
Резервиран |
1 |
0 |
Изчистете OC2 при сравняване на мача, задайте OC2 на върха |
1 |
1 |
Задайте OC2 за сравнение, изчистете OC2 отгоре |
Увеличете работния цикъл от 0% на 100%, за да се увеличи яркостта с течение на времето. Вземете стойност от 0-255 и я изпратете на OCR2 щифт.
за (мито = 0; мито <255; мито ++) // 0 до макс. работен цикъл { OCR2 = мито; // бавно увеличаваме яркостта на светодиода _delay_ms (10); }
По същия начин намалете работния цикъл от 100% на 0%, за да намалите постепенно яркостта на светодиода.
за (мито = 0; мито> 255; мито--) // макс. до 0 работен цикъл { OCR2 = мито; // бавно намаляваме яркостта на светодиода _delay_ms (10); }
Това завършва нашия урок за използване на ШИМ в Atmega16 / 32.