- Pinii PWM în microcontrolerul AVR Atmega16
- Ce este un semnal PWM?
- Componente necesare
- Diagrama circuitului
- Programare Atmega16 pentru PWM
Modularea lățimii pulsului (PWM) este o tehnică puternică în care lățimea pulsului este modificată prin menținerea frecvenței constante. Tehnica este utilizată astăzi în multe sisteme de control. Aplicarea PWM nu este limitată și este utilizată într-o gamă largă de aplicații, cum ar fi controlul vitezei motorului, măsurare, controlul puterii și comunicații etc. În tehnica PWM, se poate genera cu ușurință semnal analogic de ieșire utilizând semnale digitale. Acest tutorial vă va ajuta să înțelegeți PWM, terminologiile sale și modul în care îl putem implementa folosind un microcontroler. În acest tutorial vom demonstra PWM cu microcontrolerul AVR Atmega16 prin variația intensității unui LED.
Pentru a înțelege în detaliu elementele de bază ale PWM, vă rugăm să accesați tutorialele noastre anterioare despre PWM cu diverse microcontrolere:
- Tutorial ARM7-LPC2148 PWM: Controlul luminozității LED-urilor
- Modulația lățimii impulsurilor (PWM) utilizând MSP430G2: Controlul luminozității LED-urilor
- Generarea PWM utilizând microcontrolerul PIC cu MPLAB și XC8
- Modulația lățimii impulsurilor (PWM) în STM32F103C8: Viteza de control a ventilatorului de curent continuu
- Generarea semnalelor PWM pe pinii GPIO ai microcontrolerului PIC
- Tutorial Raspberry Pi PWM
Pinii PWM în microcontrolerul AVR Atmega16
Atmega16 are patru pini dedicati PWM. Acești pini sunt PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
De asemenea, Atmega16 are două temporizatoare de 8 biți și unul de 16 biți. Timer0 și Timer2 sunt temporizatoare pe 8 biți, în timp ce Timer1 este temporizator pe 16 biți. Pentru a genera PWM trebuie să avem o imagine de ansamblu asupra temporizatoarelor, deoarece temporizatoarele sunt folosite pentru a genera PWM. După cum știm, frecvența este numărul de cicluri pe secundă la care rulează temporizatorul. Deci, frecvența mai mare ne va oferi un cronometru mai rapid. La generarea PWM, o frecvență PWM mai rapidă va oferi un control mai fin asupra ieșirii, deoarece poate răspunde mai rapid la noile cicluri de funcționare PWM.
În acest tutorial Atmega16 PWM vom folosi Timer2. Puteți alege orice ciclu de funcționare. Dacă nu știți care este ciclul de funcționare în PWM, atunci să discutăm pe scurt.
Ce este un semnal PWM?
Modularea lățimii pulsului (PWM) este un semnal digital care este cel mai frecvent utilizat în circuitele de control. Timpul în care semnalul rămâne ridicat se numește „timp activ”, iar timpul în care semnalul rămâne scăzut se numește „timp oprit”. Există doi parametri importanți pentru un PWM, așa cum este discutat mai jos:
Ciclul de funcționare al PWM
Procentul de timp în care semnalul PWM rămâne HIGH (la timp) este numit ciclu de funcționare.
La fel ca în semnalul de impuls de 100 ms, dacă semnalul este ÎNALT pentru 50 ms și LOW pentru 50ms, înseamnă că pulsul a fost la jumătate de timp HIGH și la jumătate de timp LOW. Deci, putem spune că ciclul de funcționare este de 50%. În mod similar, dacă pulsul este în starea HIGH 25ms și 75ms în starea LOW din 100ms, atunci ciclul de funcționare ar fi de 25%. Observați că calculăm doar durata stării HIGH. Puteți face referire la imaginea de mai jos pentru a înțelege vizual. Formula pentru ciclul de funcționare este atunci,
Ciclul de funcționare (%) = Timp pornit / (Timp pornit + Timp oprit)
Deci, schimbând ciclul de funcționare putem modifica lățimea PWM, rezultând astfel o schimbare a luminozității LED-urilor. Vom avea o demonstrație de utilizare a unui ciclu de funcționare diferit în controlul luminozității LED-urilor. Verificați videoclipul demonstrativ la sfârșitul acestui tutorial.
După selectarea ciclului de funcționare, următorul pas ar fi selectarea modului PWM. Modul PWM specifică cum doriți să funcționeze PWM. Există în principal 3 tipuri de moduri PWM. Acestea sunt după cum urmează:
- PWM rapid
- PWM corect de fază
- Faza și frecvența corectă PWM
PWM rapid este utilizat acolo unde schimbarea de fază nu contează. Folosind Fast PWM, putem emite rapid valorile PWM. PWM rapid nu poate fi utilizat acolo unde schimbarea de fază afectează funcționarea, cum ar fi controlul motorului, așa că în astfel de aplicații sunt utilizate alte moduri de PWM. Deoarece vom controla Luminozitatea LED-urilor în cazul în care schimbarea de fază nu va afecta prea mult, așa că vom folosi modul PWM rapid.
Acum, pentru a genera PWM, vom controla temporizatorul intern pentru a număra în sus și apoi vom reveni la zero la un anumit număr, astfel încât temporizatorul va număra în sus și apoi va reveni la zero din nou și din nou. Aceasta stabilește perioada. Acum avem opțiunea de a controla un impuls, de a activa un impuls la un număr specific din cronometru în timp ce acesta crește. Când contorul revine la 0, apoi opriți impulsul. Există o mulțime de flexibilitate, deoarece puteți accesa oricând numărul de temporizator și puteți furniza diferite impulsuri cu un singur temporizator. Acest lucru este minunat atunci când doriți să controlați mai multe LED-uri simultan. Acum să începem interfața unui LED cu Atmega16 pentru PWM.
Verificați aici toate proiectele legate de PWM.
Componente necesare
- IC microcontroler Atmega16 AVR
- Oscilator de cristal de 16 MHz
- Două condensatoare 100nF
- Două condensatoare de 22pF
- Apasa butonul
- Sârme jumper
- Breadboard
- USBASP v2.0
- 2 leduri (orice culoare)
Diagrama circuitului
Folosim OC2 pentru PWM, adică Pin21 (PD7). Deci, conectați un LED la pinul PD7 al Atmega16.
Programare Atmega16 pentru PWM
Programul complet este prezentat mai jos. Ardeți programul în Atmega16 folosind JTAG și Atmel studio și vedeți efectul PWM pe LED. Luminozitatea sa va crește și scădea încet din cauza ciclului de funcționare variabil al PWM. Verificați videoclipul dat la final.
Începeți programarea Atmega16 cu configurarea Timer2 Register. Biții de registru Timer2 sunt după cum urmează și putem seta sau reseta biți în consecință.
Acum vom discuta despre toți biții Timer2, astfel încât să putem obține PWM dorit folosind un program scris.
Există în principal patru părți în registrul Timer2:
FOC2 (Comparare forță ieșire pentru Timer2): bitul FOC2 este setat atunci când biții WGM specifică un mod non-PWM.
WGM2 (Wave Generation Mode for Timer2): Acești biți controlează secvența de numărare a contorului, sursa pentru valoarea maximă a contorului (TOP) și ce tip de generație de formă de undă trebuie utilizată.
COM2 (Compare Output Mode for Timer2): Acești biți controlează comportamentul de ieșire. Descrierea completă a biților este explicată mai jos.
TCCR2 - = (1 <
Setați biții WGM20 și WGM21 ca HIGH pentru a activa modul rapid PWM. WGM reprezintă modul de generare a formelor de undă. Biții de selecție sunt ca mai jos.
WGM00 |
WGM01 |
Funcționarea în modul Timer2 |
0 |
0 |
Mod normal |
0 |
1 |
CTC (Clear Timer On Compare Match) |
1 |
0 |
PWM, fază corectă |
1 |
1 |
Mod PWM rapid |
Pentru mai multe detalii despre modul de generare a formelor de undă, puteți consulta fișa tehnică oficială a Atmega16.
TCCR2 - = (1 <
De asemenea, nu am folosit nici o pre-scalare, așa că am setat registrul sursei Clock ca „001”.
Biții de selecție Ceas sunt după cum urmează:
CS22 |
CS21 |
CS20 |
Descriere |
0 |
0 |
0 |
Fără sursă de ceas (Timer / Contor oprit) |
0 |
0 |
1 |
clk T2S / (fără precalificare) |
0 |
1 |
0 |
Clk T2S / 8 (de la Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (de la Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (de la Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (de la Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (de la Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (de la Prescaler) |
De asemenea, OC2 este eliminat la compararea potrivirii setând bitul COM21 ca „1” și COM20 ca „0”.
Opțiunile de selecție Comparare mod ieșire (COM) pentru modul PWM rapid sunt prezentate mai jos:
COM21 |
COM21 |
Descriere |
0 |
0 |
Funcționare normală a portului, OC2 deconectat. |
0 |
1 |
Rezervat |
1 |
0 |
Ștergeți OC2 pe Comparare, setați OC2 la TOP |
1 |
1 |
Setați OC2 pe meci de comparare, ștergeți OC2 în TOP |
Măriți ciclul de funcționare de la 0% la 100%, astfel încât luminozitatea va crește în timp. Luați valoarea de la 0 la 255 și trimiteți-o la pinul OCR2.
pentru (taxă = 0; taxă <255; taxă ++) // 0 până la ciclul maxim de taxare { OCR2 = taxă; // creșteți încet luminozitatea LED _delay_ms (10); }
În mod similar, reduceți ciclul de funcționare de la 100% la 0% pentru a reduce treptat luminozitatea LED-ului.
for (duty = 0; duty> 255; duty--) // max to 0 duty cycle { OCR2 = duty; // micșorați încet luminozitatea LED _delay_ms (10); }
Acest lucru termină Tutorialul nostru despre utilizarea PWM în Atmega16 / 32.