PWM cu 6 canale pe microcontroler avr. Software multicanal PWM în AVR. Instrucțiuni pentru utilizarea PWM în Arduino

Pentru a înțelege cum puteți implementa mai multe canale PWM pe un controler, să ne amintim mai întâi ce este PWM și pentru ce este folosit.

PWM înseamnă Pulse Width Modulation. Acesta este un mod de funcționare în care ciclul de lucru al impulsurilor poate fi reglat de un cip de control (controlerul nostru) conform unor reguli (cu alte cuvinte, se spune că ciclul de lucru este modulat de ceva sau în funcție de ceva). Adică trecerea de la un nivel de semnal ridicat la unul scăzut și invers se realizează în momente de timp strict definite de unele reguli.

Astfel, pentru un canal PWM trebuie să cunoaștem regulile care determină ciclul de funcționare (nu există probleme cu aceasta, le setăm noi înșine) și, în plus, să numărăm două puncte în timp de la începutul pulsului: în primul rând, cât timp este semnalul în starea nivel ridicat și, în al doilea rând, timpul total al pulsului. Grozav, atunci tot ce avem nevoie pentru a implementa un PWM sunt două contoare. Algoritmul se va dovedi astfel: pornim ambele contoare, comutăm ieșirea la „1”. La întreruperea de la primul contor (timp de nivel înalt), comutăm ieșirea la „0”, oprim contorul și așteptăm întreruperea de la al doilea contor. La întreruperea de la al doilea numărător (timpul total al pulsului), repetăm ​​totul de la început.

În consecință, pentru trei canale PWM avem nevoie de 3*2=6 contoare. Dar, să presupunem că PIC12F629 are doar 2 contoare, ce ar trebui să facem? În primul rând, să facem ca durata totală a pulsului să fie aceeași pentru toate canalele PWM (lăsați toate cele trei canale să funcționeze la aceeași frecvență), aceasta este deja minus două contoare. Tot ce rămâne este să numărăm timpul de nivel înalt pentru fiecare dintre canalele PWM. În total, au mai rămas 4 contoare. Nu mult, dar mai ușor.

Acum să ne amintim că controlerul nu este un microcircuit analogic, ci unul digital, și numără momentele de timp discret. Toți cei trei timpi de nivel înalt (pentru fiecare dintre canalele PWM) vor fi un multiplu al unui cuantum de timp comun. Durata acestui cuantum este determinată de lățimea PWM și de frecvența pulsului. În cazul în care toate canalele funcționează la aceeași frecvență și au aceeași adâncime de biți, această porțiune de timp va fi egală cu: T 1 =1/(f*(2 n -1)), unde n este capacitatea PWM, f este frecvența pulsului.

Dacă PWM este de 8 biți și funcționează la o frecvență de 100 Hz, atunci durata cuantică este (1/100)/(2 8 -1) = 39 μs - timpul total al impulsului (1/f) împărțit la număr a posibilelor momente de comutare (2 n) minus 1 (dacă puneți N puncte pe o dreaptă, atunci acestea formează N-1 intervale).

Acesta este, Avem nevoie doar de un numărător hardware care va număra intervalele T 1. Apoi, creăm un contor de program care va număra numărul de astfel de intervale și va stabili patru setări. O setare determină câte citiri ale contorului programului sunt necesare pentru a număra timpul de nivel înalt pentru primul canal PWM, al doilea - același pentru al doilea canal, al treilea - pentru al treilea, al patrulea corespunde cu timpul total al pulsului și operațiuni de comparare, comutare, creștere sau resetare a contorului programului vom face
faceți-o pe baza unei întreruperi de la un contor hardware.

Principalul dezavantaj al acestei metode este că în loc de (n+1) întreruperi pe perioadă, vom procesa (2 n -1) întreruperi.

Să estimăm care ar putea fi frecvența maximă PWM cu o astfel de implementare? Evident, la frecvența maximă, controlerul are doar suficient timp pentru a procesa întrerupere. Adică, întregul interval de timp T 1 al controlerului este ocupat cu procesarea întreruperii; de îndată ce iese din întrerupere, se întâmplă imediat un alt lucru.

Dacă notăm numărul maxim de cicluri de mașină pentru care se execută subprogramul, N max - atunci, ținând cont de expresia pentru T 1, obținem ecuația: N max *4/fosc=1/(f max *(2 n -1)). Prin urmare, frecvența maximă PWM: f max =fosc/(4*N max *(2 n -1)). Desigur, formula rezultată este pur și simplu o estimare, deoarece am presupus că subrutina ocupă tot timpul T 1 , dar dacă după executarea subrutinei mai rămâne timp pentru a executa 2 sau 3 comenzi, atunci acest lucru, în general, nu se va potrivi. si noi mult. Ce se poate face in 3 echipe? În mod normal, dacă vrem să facem altceva, de exemplu, să facem schimb de informații cu un computer, atunci valoarea frecvenței calculate trebuie împărțită la cel puțin încă jumătate.

Ce determină timpul maxim de execuție al unei rutine de întrerupere? Ei bine, în primul rând, desigur, depinde de gradul de strâmbătate al programatorului și, în al doilea rând, de numărul de canale PWM pe care dorim să le implementăm.

Pentru a clarifica despre ce valori vorbim, să calculăm un exemplu concret: lăsăm controlerul să funcționeze la o frecvență de fosc = 4 MHz, am scris o subrutină care rulează în maximum 40 de cicluri de mașină și dorim să obține o lățime PWM de 8 biți. Atunci frecvența maximă PWM va fi egală cu 4000000/(4*40*255)=98 Hz. După cum puteți vedea, cu această metodă de implementare, totul este destul de limitat, dar este suficient pentru RGB. Apropo, cu 8 biți pe culoare obținem un număr total de culori egal cu 2 8 * 2 8 * 2 8 = 16 milioane și, în general, merită să ne gândim - avem nevoie de atâtea?

Cu 2 biți pe canal și aceeași frecvență de ceas, puteți obține o frecvență PWM maximă egală cu 4000000/(4*40*3)=8,3 kHz și vor exista 2 2 *2 2 *2 2 =64 combinații diferite de cicluri de lucru (în cazul RGB aceasta este de 64 de culori). Această frecvență poate fi deja folosită nu numai pentru RGB.

Ei bine, asta e tot pentru teorie.

Dispozitivele digitale, de exemplu, un microcontroler poate funcționa numai cu două niveluri de semnal, de exemplu. zero și unu sau oprit și pornit. Astfel, îl puteți utiliza cu ușurință pentru a monitoriza starea încărcării, cum ar fi pornirea sau oprirea unui LED. De asemenea, îl puteți utiliza pentru a controla orice dispozitiv electric folosind driverele adecvate (tranzistor, triac, releu etc.) Dar uneori aveți nevoie de mai mult decât doar „pornirea” și „oprirea” dispozitivului. Deci, dacă doriți să controlați luminozitatea unui LED (sau lampă) sau viteza unui motor de curent continuu, atunci semnalele digitale pur și simplu nu pot face acest lucru. Această situație este foarte comună în tehnologia digitală și se numește Modularea lățimii impulsului (PWM).

Aproape toate microcontrolerele moderne au hardware specializat pentru generarea unui semnal PWM. În acest tutorial vom învăța elementele de bază ale tehnicii PWM și mai târziu vom vedea cum să implementăm PWM folosind microcontrolere AVR.

Dispozitivele digitale precum un microcontroler pot genera doar două niveluri pe liniile de ieșire, înalt = 5V și scăzut = 0V. Dar dacă vrem să obținem 2,5 sau 3,1 sau orice tensiune între 0-5V? Pentru a face acest lucru, în loc să generăm o tensiune continuă constantă la ieșire, vom genera o undă pătrată care are niveluri ridicate = 5V și scăzute = 0V (vezi Figura 1).

Fig.1

Figura arată că semnalul rămâne alternativ la niveluri scăzute și ridicate pentru o perioadă de timp. T0 - nivel scăzut, T1 - nivel înalt. Perioada semnalului va fi egală cu T = T0+T1. Perioada pulsului- acesta este intervalul de timp dintre două puncte caracteristice a două impulsuri adiacente. În mod obișnuit, perioada este măsurată între două creșteri sau scăderi ale impulsurilor adiacente și este notă cu litera mare T.

Perioada de repetare a pulsului este direct legată de frecvența secvenței pulsului și poate fi calculată folosind formula: T = 1/F

Dacă lungimea pulsului T1 este exact egală cu jumătate din perioada T, atunci un astfel de semnal este adesea numit „undă pătrată”.

Ciclul de funcționare al impulsurilor este raportul dintre perioada de repetare a impulsurilor și durata acestora și este notat cu litera S: S = T/T1

Factorul de sarcină este o mărime adimensională și nu are unități de măsură, dar poate fi exprimat ca procent. Termenul se găsește adesea în textele în limba engleză Ciclu de funcționare, aceasta este așa-numita valoare duty cycle sau PWM. Ciclul de funcționare D este reciproca ciclului de funcționare.

Factor de umplere de obicei exprimat ca procent și calculat folosind formula: D=1/S sau așa D = T1/T*100%

În figura de mai sus (Fig. 1) puteți vedea că T1 = T0, aceasta este egală cu jumătate din perioada de timp. Deci, ciclul de lucru PWM este de 50%. Dacă frecvența unor astfel de impulsuri este suficient de mare (să zicem, 5000 Hz), atunci obținem jumătate din 5V, adică 2,5 V. Astfel, dacă ieșirea controlerului este cuplată la motor (folosind drivere adecvate) acesta va funcționa la 50% din viteza maximă. Tehnica PWM folosește acest fapt pentru a crea orice tensiune între două niveluri (de exemplu, între 0-12V). Trucul este că atunci când valoarea ciclului de lucru se schimbă între 0-100%, obținem același procentaj de tensiune de intrare la ieșire. Mai jos sunt câteva exemple de semnale PWM cu cicluri de lucru diferite.

Dacă instalați un filtru R/C la ieșire, puteți obține un nivel pur de semnal DC, mai degrabă decât unde pătrate. Dar acest lucru nu este necesar pentru motoarele cu perii sau pentru controlul luminozității LED-urilor. Pentru a face acest lucru, puteți aplica un semnal PWM direct driverului (de exemplu, un tranzistor bipolar, MOSFET etc.).


Sub modul de operare pe 16 biți. Temporizatorul este înțeles ca algoritmul său de numărare și comportamentul ieșirii modelului de impuls asociat cu acesta, care este determinat de o combinație de biți care specifică modul de funcționare a temporizatorului (WGMn3-0) și modul de generare a semnalului de ieșire (COMnx1:0) . În acest caz, biții pentru setarea modului de generare a semnalului de ieșire nu afectează algoritmul de numărare, deoarece Algoritmul de numărare depinde doar de starea biților pentru setarea modului de funcționare a temporizatorului. În modurile PWM, biții COMnx1:0 vă permit să activați/dezactivați inversarea pe ieșirea PWM generată (adică selectați PWM cu inversare sau PWM fără inversare). Pentru modurile non-PWM, biții COMnx1:0 determină ce acțiune trebuie întreprinsă atunci când are loc o potrivire: resetați, setați sau inversați ieșirea (consultați, de asemenea, „Blocul de condiționare a semnalului de ieșire” și „Diagramele de temporizare cronometru-contor pe 16 biți”) .

Operatie normala

Cel mai simplu mod de operare este modul normal (WGMn3-0 = 0b0000). În acest mod, contorul funcționează ca un contor de însumare (incrementare), iar contorul nu este resetat. Contorul depășește când trece prin maximul de 16 biți. valoarea (0xFFFF) la limita inferioară de numărare (0x0000). În timpul funcționării normale, indicatorul de depășire a temporizatorului-contor TOVn va fi setat pe același ciclu de ceas când TCNTn ajunge la zero.

De fapt, flag-ul TOVn overflow este al 17-lea bit al cronometrului, cu excepția faptului că este doar setat și nu este șters. Cu toate acestea, această proprietate poate fi utilizată în mod programatic pentru a crește rezoluția temporizatorului prin utilizarea unei întreruperi de depășire a temporizatorului, după care steag-ul TOVn este resetat automat. Nu există situații speciale pentru funcționarea normală, astfel încât o stare nouă a contorului poate fi înregistrată în orice moment.

În modul normal, puteți utiliza blocul de captură. Cu toate acestea, trebuie să se asigure că intervalul maxim de timp dintre apariția evenimentelor externe nu depășește perioada de depășire a contorului. Dacă această condiție nu este îndeplinită, este necesar să utilizați o întrerupere a depășirii contorului de cronometru sau un prescaler.

Blocul de comparație poate fi folosit pentru a genera întreruperi. Nu este recomandat să folosiți ieșirea OCnx pentru a genera semnale în funcționare normală, deoarece în acest caz, o parte semnificativă din timpul procesorului va fi cheltuită.

Modul de resetare a cronometrului meciului (CTC)

În modul CTC (WGM01, WGM00 =0b10), registrul OCR0 este utilizat pentru a seta rezoluția contorului. Dacă modul CTC este setat și valoarea contorului (TCNT0) se potrivește cu valoarea registrului OCR0, contorul este resetat la zero (TCNT0=0). Astfel, OCR0 specifică numărul de top al contorului și, în consecință, rezoluția acestuia. Acest mod oferă o gamă mai largă de reglare a frecvenței impulsurilor dreptunghiulare generate. De asemenea, simplifică funcționarea contorului de evenimente extern.

În resetarea temporizatorului în modul de potrivire (WGMn3-0 = 0b0100 sau 0b1100), rezoluția temporizatorului este setată de registrele OCRnA sau ICRn. În modul CTC, contorul (TCNTn) este resetat dacă valoarea lui se potrivește cu valoarea registrului OCRnA (WGMn3-0 = 0b0100) sau ICRn (WGMn3-0 = 0b1100). Valoarea registrului OCRnA sau ICRn determină limita superioară de numărare și, prin urmare, rezoluția temporizatorului. Acest mod oferă o gamă mai largă de reglare a frecvenței impulsurilor dreptunghiulare generate. De asemenea, simplifică funcționarea contorului de evenimente extern. Diagrama de timp a funcționării temporizatorului în modul CTC este prezentată în Figura 1. Contorul (TCNTn) își crește starea până când apare o potrivire cu valoarea OCRnA sau ICRn, apoi contorul (TCNTn) este resetat.

Figura 1 – Diagrama de timp pentru modul STS

Când limita superioară de numărare este atinsă, o întrerupere poate fi generată utilizând steagurile OCFnA sau ICFn corespunzătoare registrelor utilizate pentru a seta limita superioară de numărare. Dacă întreruperea este activată, atunci rutina de întrerupere poate fi utilizată pentru a actualiza limita superioară de numărare. Totuși, setarea valorii superioare de numărare aproape de valoarea limitei inferioare de numărare atunci când contorul funcționează fără prescaler sau cu o valoare mică de prescaler trebuie făcută cu extremă precauție, deoarece Nu există tamponare dublă în modul CTC. Dacă valoarea scrisă în OCRnA sau ICRn este mai mică decât valoarea curentă a TCNTn, contorul se va reseta atunci când apare condiția de potrivire când atinge valoarea maximă (0xFFFF), apoi se va reseta la 0x0000 și atinge noua valoare a OCRnA sau ICRn. În multe cazuri, această situație nu este de dorit. O alternativă este modul rapid PWM, în care registrul OCRnA determină limita superioară de numărare (WGMn3-0 = 0b1111), deoarece în acest caz OCRnA este tamponat dublu.

Pentru a genera un semnal în modul CTC, ieșirea OCnA poate fi utilizată pentru a schimba nivelul logic la fiecare potrivire prin setarea modului de comutare (COMnA1, COMnA0 = 0b01). Valoarea OCnA va fi prezentă pe un pin de port numai dacă direcția de ieșire este specificată pentru acel pin. Frecvența maximă a semnalului generat este fOC0 = fclk_I/O/2 dacă OCRnA = 0x0000. Pentru alte valori OCRn, frecvența semnalului generat poate fi determinată prin formula:

unde variabila N specifică factorul de diviziune prescaler (1, 8, 32, 64, 128, 256 sau 1024).

Ca și în cazul funcționării normale, indicatorul TOV0 este setat la aceeași bifă a temporizatorului atunci când valoarea sa se schimbă de la 0xFFFF la 0x0000.

Mod rapid PWM

Modul rapid de modulare a lățimii impulsului (PWM) (WGMn3-0 = 0b0101, 0b0110, 0b0111, 0b1110, 0b1111) este conceput pentru a genera impulsuri PWM cu frecvență crescută. Spre deosebire de alte moduri de operare, acesta folosește funcționarea contor unidirecțională. Numărarea se efectuează în direcția de la limita inferioară la limita superioară de numărare.

Dacă este setat un mod de ieșire fără inversare, atunci când TCNTn și OCRnx coincid, semnalul OCnx este setat și resetat la limita superioară de numărare. Dacă este specificat modul de inversare, ieșirea OCnx este resetată la o potrivire și setată la limita de număr mare. Datorită numărării unidirecționale, frecvența de operare pentru acest mod este de două ori mai mare decât în ​​modul PWM cu corecție de fază, în care se utilizează contorizarea bidirecțională. Capacitatea de a genera semnale PWM de înaltă frecvență face ca utilizarea acestui mod să fie utilă în sarcinile de stabilizare a puterii, rectificare și conversie digital-analogică. Înaltă frecvență, în același timp, permite utilizarea elementelor externe de dimensiuni fizice mici (inductori, condensatori), reducând astfel costul total al sistemului.

Rezoluția PWM poate fi fixată pe 8, 9 sau 10 biți sau setată de registrul ICRn sau OCRnA, dar nu mai puțin de 2 biți (ICRn sau OCRnA = 0x0003) și nu mai mult de 16 biți (ICRn sau OCRnA = 0xFFFF). Rezoluția PWM la o anumită valoare limită superioară (UL) se calculează după cum urmează:

În modul PWM rapid, contorul este incrementat până când valoarea lui se potrivește cu una dintre valorile fixe 0x00FF, 0x01FF sau 0x03FF (dacă WGMn3:0 = 0b0101, 0b0110 sau respectiv 0b0111), valoarea în ICRn (dacă WGMn3:0 = 0b1110) sau valoarea din OCRnA (dacă WGMn3:0 = 0b1111) și apoi resetați la următoarea bifare a ceasului temporizatorului. Diagrama de timp pentru modul PWM rapid este prezentată în Figura 2. Figura arată modul PWM rapid atunci când registrul OCRnA sau ICRn este utilizat pentru a seta limita superioară. Valoarea TCNTn din diagrama de timp este afișată ca un grafic al funcției pentru a ilustra numărarea unidirecțională. Diagrama arată atât ieșirile PWM inversate, cât și cele neinversate. O linie orizontală scurtă arată punctele din graficul TCNTn unde valorile OCRnx și TCNTnx coincid. Indicatorul de întrerupere OCnx este setat atunci când are loc o potrivire.

Figura 2 – Diagrama de timp pentru modul rapid PWM

Indicatorul Timer-Counter Overflow (TOVn) este setat ori de câte ori contorul atinge limita sa superioară. În plus, același impuls de ceas, împreună cu steagul TOVn, poate seta steaguri OCnA sau ICFn dacă registrul OCRnA sau ICRn este utilizat pentru a seta limita superioară, respectiv. Dacă una dintre aceste întreruperi este activată, rutina de întrerupere poate actualiza limita superioară a numărului și pragurile de comparație.

Dacă valoarea limitei superioare de numărare se modifică, atunci trebuie îndeplinită condiția ca noua valoare limită superioară scrisă să fie mai mare sau egală cu valorile din toate registrele de prag de comparație. În caz contrar, o potrivire între TCNTn și OCRnx nu va avea loc niciodată. Rețineți că atunci când utilizați valori limită superioară fixe, biții neutilizați sunt mascați la 0 atunci când scrieți în registrele OCRnx.

Mecanismul de modificare a registrului ICRn diferă de OCRnA atunci când este utilizat pentru a seta limita superioară. Registrul ICRn nu este dublu tamponat. Aceasta înseamnă că dacă o valoare mică este scrisă în ICRn în timp ce contorul rulează cu o prescalare mică sau deloc, există riscul de a scrie o valoare în registrul ICRn care este mai mică decât valoarea curentă a TCNTn. Ca urmare, în această situație meciul din fruntea numărului va fi ratat. În acest caz, contorul va atinge valoarea maximă (0xFFFF), va reporni la 0x0000 și abia apoi va genera o potrivire. Registrul OCRnA conține o schemă de tamponare dublă, astfel încât poate fi modificat în orice moment.

class="eliadunit">

Dacă se face o scriere pentru adresa OCRnA, valoarea este de fapt plasată în registrul tampon OCRnA. Dacă apare o potrivire între TCNTn și vârful numărării, atunci următorul ciclu de ceas al temporizatorului este copierea registrului tampon în registrul prag de comparație OCRnA. Registrul este actualizat în același ciclu de ceas pe măsură ce TCNTn este resetat și steag-ul TOVn este setat.

Se recomandă utilizarea registrului ICRn pentru a seta limita superioară dacă limita superioară de numărare este o constantă. În acest caz, registrul OCRnA este, de asemenea, eliberat pentru a genera un semnal PWM la ieșirea OCnA. Cu toate acestea, dacă frecvența PWM se modifică dinamic (datorită modificării limitei superioare), atunci în acest caz este mai avantajos să folosiți registrul OCRnA pentru a seta limita superioară, deoarece suportă dubla tamponare.

În modul rapid PWM, unitățile de comparație vă permit să generați semnale PWM pe pinii OCnx. Dacă COMnx1:0 = 0b10, atunci PWM este setat fără inversiune de ieșire, iar dacă COMnx1:0 = 0b11, atunci modul PWM cu inversiune de ieșire este setat (vezi Tabelul 59). Valoarea reală OCnx poate fi observată pe pinul portului dacă este setată pe direcția de ieșire (DDR_OCnx). Semnalul PWM este generat prin setarea (resetarea) registrului OCnx atunci când apare o potrivire între OCRnx și TCNTn și prin resetarea (setarea) registrului OCnx împreună cu resetarea contorului (modificarea de la limita superioară la limita inferioară).

Frecvența PWM a semnalului de ieșire pentru o anumită valoare limită superioară (UL) este determinată de expresia:

unde N este o variabilă care specifică valoarea coeficientului de predicție (1, 8, 32, 64, 128, 256 sau 1024).

Scrierea valorilor limită în registrul OCRnx este asociată cu cazuri speciale în generarea de impulsuri PWM. Dacă OCRnx este setat egal cu limita inferioară (0x0000), atunci la ieșire va apărea un impuls scurt la fiecare (VP+1) ciclu de ceas al temporizatorului. Scrierea unei valori egale cu limita superioară pentru OCRnx va avea ca rezultat setarea unui nivel de jurnal constant. 1 sau 0 la ieșire (în funcție de polaritatea semnalului de ieșire selectat folosind bitul COMnx1:0).

Dacă este necesară generarea de unde pătrate de înaltă frecvență (impulsuri dreptunghiulare cu un ciclu de lucru de 2 sau 50% umplere), atunci este necesar să se folosească modul rapid PWM cu biții COMnA1:0 = 0b01 setați, ceea ce determină nivelul logic la ieșirea OCnA pentru a comuta (inversa) la fiecare meci. Acest lucru este aplicabil numai dacă OCRnA este utilizat pentru a seta limita superioară (WGMn3-0 =0b1111). Frecvența maximă a undei pătrate generată în acest caz este fOCnA = fclk_I/O/2, dacă OCRnA = 0x0000. Această caracteristică este similară cu comutarea OCnA în modul CTC, cu excepția tamponării duble, care este prezentă în modul rapid PWM.

Modul de modulare a lățimii impulsului cu corecție de fază (Phase Correct)

Modul de modulare a lățimii impulsului corectat în fază (PWM FC) (WGMn3-0 = 0b0001, 0b010, 0b0011, 0b1010 sau 0b1011) este proiectat pentru a genera un semnal PWM corectat în fază cu rezoluție înaltă. Modul PWM FC se bazează pe funcționarea bidirecțională a unui cronometru. Contorul circulă de la limita inferioară (0x0000) la limita superioară și apoi înapoi de la limita superioară la limita inferioară. Dacă modul de ieșire a modelului de impulsuri este setat la non-inversoare, ieșirea OCnx este resetata/setata atunci când valorile TCNTn și OCRnx se potrivesc în timpul numărării ascendente/retrocesive. Dacă este setat modul de ieșire inversă, atunci, dimpotrivă, în timpul numărării directe, setarea are loc, iar în timpul numărării inverse, ieșirea OCnx este resetată. La funcționarea bidirecțională, frecvența maximă a semnalului PWM este mai mică decât la funcționarea unidirecțională, cu toate acestea, datorită unor caracteristici precum simetria în modurile PWM cu funcționare bidirecțională, aceste moduri sunt de preferat să fie utilizate atunci când se rezolvă problemele de control al unității.

Rezoluția PWM în acest mod poate fi fie fixă ​​(8, 9 sau 10 biți), fie setată folosind registrul ICRn sau OCRnA. Rezoluția minimă este de 2 biți (ICRn sau OCRnA = 0x0003), iar cea maximă este de 16 biți (ICRn sau OCRnA = 0xFFFF). Dacă este specificată o limită superioară, atunci rezoluția PWM în acest mod este determinată după cum urmează:

În modul PWM FC, contorul este incrementat până când atinge una dintre valorile fixe 0x00FF, 0x01FF sau 0x03FF (respectiv pentru WGMn3-0 = 0b0001, 0b0010 sau 0b0011), precum și o valoare egală cu ICRn- (dacă WGMn3-). 0 = 0b1010) sau OCRnA (dacă WGMn3 :0 = 0b1011). În plus, când este atinsă limita superioară, contorul schimbă direcția de numărare. Valoarea TCNTn rămâne la limita superioară pentru un ciclu de ceas temporizator. Diagrama de timp pentru modul PC PWM este prezentată în Figura 3. Figura arată modul PC PWM folosind registrul OCRnA sau ICRn pentru a seta limita superioară. Starea TCNTn este reprezentată ca un grafic de funcții pentru a ilustra numărarea bidirecțională. Figura arată atât ieșirea PWM neinversată, cât și cea inversată. Liniile orizontale scurte indică punctele din graficul TCNTn în care apare o potrivire cu valoarea OCRnx. Indicatorul de întrerupere OCnx este setat atunci când are loc o potrivire.

Figura 3 – Diagrama de timp pentru modul PWM FC

Indicatorul Timer-Counter Overflow (TOVn) este setat ori de câte ori contorul atinge limita sa inferioară. Dacă registrul OCRnA sau ICRn este utilizat pentru a seta limita superioară, atunci flag-ul OCnA sau ICFn este setat corespunzător cu același impuls de ceas la care registrul OCRnx a fost actualizat din registrul tampon (în partea de sus a numărării). Indicatoarele de întrerupere pot fi utilizate pentru a genera o întrerupere atunci când un contor atinge o limită inferioară sau superioară.

Când modificați valoarea limitei superioare de numărare, trebuie să vă asigurați că aceasta este mai mare sau egală cu valorile din toate registrele de comparație. În caz contrar, o potrivire între TCNTn și OCRnx nu va avea loc niciodată. Rețineți că atunci când utilizați valori fixe de numărare superioare, biții neutilizați sunt șterși la zero atunci când scrieți în registrele OCRnx. A treia perioadă din Figura 53 ilustrează cazul în care o modificare dinamică a limitei superioare de numărare duce la generarea unui impuls asimetric. Această caracteristică se bazează pe timpul de actualizare a registrului OCRnx. Deoarece actualizarea OCRnx are loc în partea de sus a numărului, perioada PWM începe și se termină în partea de sus a numărului. Aceasta implică faptul că durata numărătorii inverse este determinată de valoarea limită superioară anterioară, iar durata de numărare înainte este determinată de noua valoare limită superioară. Dacă aceste două valori sunt diferite, atunci și durata numărării înainte și înapoi va fi diferită. Diferența de durată duce la asimetria impulsurilor de ieșire.

Dacă sarcina este de a modifica limita superioară în timp ce contorul rulează, atunci în locul acestui mod se recomandă utilizarea modului PWM PFC (corecție de fază și frecvență). Dacă se utilizează o valoare limită superioară statică, atunci practic nu există diferențe între aceste moduri.

În modul PWM FC, unitățile de comparație vă permit să generați semnale PWM la pinii OCnx. Dacă setați COMnx1:0 = 0b10, atunci ieșirea PWM va fi fără inversare, iar dacă COMnx1:0=0b11, atunci cu inversare. Valoarea reală a OCnx poate fi observată pe pinul de port dacă registrul de direcție a datelor pentru acel pin de port este setat pe direcția de ieșire (DDR_OCnx). Semnalul PWM este generat prin setarea (resetarea) registrului OCnx atunci când valorile OCRnx și TCNTn se potrivesc în timpul numărării, și prin resetarea (setarea) registrului OCnx atunci când există o potrivire între OCRnx și TCNTn în timpul numărării reduse. Frecvența rezultată a semnalului PWM în modul PWM FC la o limită superioară dată (UL) poate fi calculată folosind următoarea expresie:

Scrierea valorilor limită în registrul OCRnx este asociată cu cazuri speciale în generarea de semnale PWM în modul PWM FC. Dacă setați modul PWM fără inversare și setați OCRnx egal cu limita inferioară, atunci ieșirea va fi setată continuu la log. 0, iar dacă este egal cu limita superioară, atunci un jurnal este întotdeauna prezent la ieșire. 1. Pentru PWM cu inversare, nivelurile indicate trebuie înlocuite cu cele opuse.

Dacă specificați să utilizați OCnA ca limită superioară (WGMn3:0 = 0b1011) și setați COMnA1:0 =0b01, o undă pătrată va fi generată la ieșirea OCnA.

Modul de modulare a lățimii impulsului cu corecție de fază și frecvență (Corect de fază și frecvență)

Modul de modulare a lățimii impulsului cu corecție de fază și frecvență (PWM PFC) (WGMn3-0 = 0b1000 sau 0b1001) este proiectat pentru a genera impulsuri PWM de înaltă rezoluție cu corecție de fază și frecvență. La fel ca modul PWM FC, modul PWM FC se bazează pe funcționarea bidirecțională a contorului. Contorul circulă de la limita inferioară (0x0000) la limita superioară și apoi înapoi de la limita superioară la limita inferioară. Dacă este specificat modul PWM fără inversare, ieșirea OCnx este resetată dacă apare o potrivire între TCNTn și OCRnx în timpul numărării în sus și este setată dacă apare o potrivire în timpul numărării în jos. În modul inversare, operația este inversă. Funcționarea bidirecțională, în comparație cu funcționarea unidirecțională, este asociată cu generarea de frecvențe inferioare. Cu toate acestea, datorită simetriei în modurile PWM cu numărare bidirecțională, utilizarea lor este de preferat în sarcinile de control al unității.

Principala diferență dintre modurile PWM FC și PWM FC este momentul în care registrul OCRnx este actualizat din registrul tampon OCRnx (vezi Figura 3 și Figura 4).

Rezoluția PWM în acest mod poate fi setată folosind registrul ICRn sau OCRnA. Rezoluția minimă este de 2 biți (ICRn sau OCRnA = 0x0003), iar rezoluția maximă este de 16 biți (ICRn sau OCRnA = 0xFFFF). Rezoluția PWM în biți poate fi calculată folosind următoarea expresie:

În modul PWM FCC, contorul este incrementat până când se potrivește cu valoarea din ICRn (WGMn3:0 = 0b1000) sau în OCRnA (WGMn3:0 = 0b1001). Aceasta înseamnă atingerea vârfului numărării, după care direcția numărării se schimbă. Valoarea TCNTn rămâne în partea de sus a numărului pentru un ciclu de ceas al temporizatorului. Diagrama de timp pentru modul PWM FCC este prezentată în Figura 54. Figura arată modul PWM FCC când vârful de numărare este setat de registrul OCRnA sau ICRn. Valoarea TCNTn este afișată ca un grafic al funcției pentru a ilustra numărarea bidirecțională. Diagrama arată atât ieșirile PWM fără inversare, cât și cele inversoare. Liniile orizontale scurte indică punctele din graficul TCNTn unde apare o potrivire între OCRnx și TCNTn. Indicatorul de întrerupere OCnx este setat după ce apare o potrivire.

Figura 4 – Diagrama de timp a modului PWM cu corecție de fază și frecvență

Indicatorul de depășire a cronometrului-contor (TOVn) este setat la același ciclu de ceas atunci când registrele sunt actualizate cu valoarea din registrul tampon (la limita inferioară de numărare). Dacă registrul OCRnA sau ICRn este utilizat pentru a seta limita superioară, atunci când contorul atinge limita superioară, este setat indicatorul OCnA sau, respectiv, ICFn. Indicatoarele de întrerupere pot fi utilizate pentru a genera o întrerupere atunci când un contor atinge o limită superioară sau inferioară.

Când modificați limita superioară, trebuie să vă asigurați că noua valoare este mai mare sau egală cu valorile din toate registrele de prag de comparație. În caz contrar, dacă limita superioară este setată la o valoare mai mică decât oricare dintre valorile din registrele de prag de comparație, nu va avea loc niciodată o potrivire între TCNTn și OCRnx.

Figura 4 arată că, spre deosebire de modul PWM FC, semnalul de ieșire generat este simetric în toate perioadele. Deoarece registrele OCRnx sunt actualizate la limita inferioară de numărare, duratele numărătorilor înainte și înapoi sunt întotdeauna egale. Ca urmare, impulsurile de ieșire au o formă simetrică și, prin urmare, o frecvență corectată.

Utilizarea registrului ICRn pentru a seta limita superioară este recomandată dacă valoarea limită superioară este o constantă. În acest caz, registrul OCRnA este de asemenea eliberat pentru modularea lățimii impulsurilor la pinul OCnA. Cu toate acestea, dacă trebuie să modificați în mod dinamic frecvența PWM prin modificarea limitei superioare, atunci este recomandat să utilizați registrul OCRnA pentru a seta limita superioară datorită tamponării sale duble.

În modul PWM, unitățile de comparație vă permit să generați impulsuri PWM la pinul OCnx. Dacă COMnx1:0 = 0b10, atunci este setată o ieșire PWM non-inversoare, iar dacă COMnx1:0=0b11, atunci una inversoare (vezi tabelul 60). Valoarea OCnx va fi prezentă numai pe pinul portului corespunzător dacă este setată pe direcția de ieșire. Semnalul PWM este generat prin setarea (resetarea) registrului OCnx pe o potrivire între OCRnx și TCNTn în timpul numărării și resetarea (setarea) registrului OCnx pe o potrivire între OCRnx și TCNTn în timpul numărării reduse. Frecvența PWM în acest mod cu o limită superioară dată (UP) de numărare este determinată după cum urmează:

unde N este factorul de diviziune prescaler (1, 8, 32, 64, 128, 256 sau 1024).

Scrierea valorilor limită în registrul OCRnx este asociată cu cazuri speciale în generarea semnalelor PWM în acest mod. Dacă setați OCRnx egal cu limita inferioară (0x0000), atunci în modul fără inversare, ieșirea va avea în mod constant un nivel logic scăzut, iar atunci când scrieți o valoare egală cu limita superioară, ieșirea va avea un nivel logic ridicat pentru un perioadă lungă de timp. În modul inversare, nivelurile date vor fi opuse.

Dacă OCRnA este utilizat pentru a seta limita superioară (WGMn3:0 = 0b1001) și COMnA1:0 = 0b01, atunci va fi generată o undă pătrată la ieșirea OCnA.


Implementarea hardware a PWM oferă avantaje incontestabile față de software, deoarece scutește procesorul atât de codul inutil, cât și de greoi și de timpul necesar pentru întreținerea acestuia și oferă, de asemenea, mai multe oportunități de utilizare a lucrului cu PWM. Este suficient să inițializați cronometrul/contorul (introduceți valorile necesare în registrele folosite de cronometru/contor) iar cronometrul/contorul poate funcționa independent de procesor; în consecință, procesorul se poate ocupa de alte sarcini, doar uneori contactand la momentul necesar pentru a regla sau schimba modul sau a obtine rezultate de la cronometru/contor.

Descrierea steagurilor de întrerupere

T1 poate genera o întrerupere atunci când:

  1. registru contor TCNT1 overflow;
  2. când registrul de numărare TCNT1 și registrul de comparație OCR1A și OCR1B sunt egale (separat pentru fiecare registru);
  3. în timp ce se păstrează registrul de numărare în registrul de captare ICR1.

T2 poate genera o întrerupere atunci când:

  1. Depășire registru contor TCNT2;
  2. când registrul de numărare TCNT2 și registrul de comparație OCR2 sunt egale.

Flag-urile tuturor întreruperilor sunt în registrul TIFR, iar activarea/dezactivarea întreruperii este în registrul TIMSK.

Biți de registru TIMSK
Inregistreaza-te7 6 5 4 3 2 1 0
TIMSK OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0* TOIE0
  • OCIE2- Indicatorul de activare a întreruperii pentru evenimentul „potrivire” al cronometrului/contorului T2
  • TOIE2- Indicator de activare a întreruperii temporizatorului/contorului de depășire T2
  • TICIE1- Indicatorul de activare a întreruperii pentru evenimentul „captură” al temporizatorului/contorului T1
  • OCIE1A- Indicatorul de activare a întreruperii pentru evenimentul „match A” al temporizatorului/contorului T1
  • OCIE1B- Indicatorul de activare a întreruperii pentru evenimentul „match B” al temporizatorului/contorului T1
  • TOIE1- Indicator de activare a întreruperii temporizatorului/contorului de depășire T1
  • OCIE0*- Indicatorul de activare a întreruperii pentru evenimentul „coincidență” al temporizatorului/contorului T0 (* - nu este disponibil în ATmega8)
  • TOIE0- Indicatorul de activare a întreruperii temporizatorului/contorului de depășire T0
  • OCF2- Flag de întrerupere pentru evenimentul „coincidență” al temporizatorului/contorului T2
  • TOV2- Indicatorul de întrerupere a temporizatorului/contorului de depășire T2
  • ICF1- Flag de întrerupere pentru evenimentul „captură” al cronometrului/contorului T1
  • OCF1A- Indicatorul de întrerupere pentru evenimentul „coincidență A” al temporizatorului/contorului T1
  • OCF1B- Indicatorul de întrerupere pentru evenimentul „coincidență B” al temporizatorului/contorului T1
  • TOV1- Indicator de întrerupere a temporizatorului/contorului de depășire T1
  • OCF0- Flag de întrerupere pentru evenimentul „coincidență” al temporizatorului/contorului T0
  • TOV0- Indicatorul de întrerupere a temporizatorului/contorului de depășire T0

Descrierea funcționării temporizatorului/contorului T1 în controlerul ATmega8/16

Temporizatorul/contorul de șaisprezece biți T1 poate fi folosit pentru a genera intervale de timp, a număra numărul de semnale externe și a genera semnale PWM cu cicluri de lucru și durate diferite pe pinii OC1A și OC1B. În plus, printr-un semnal extern de la pinul ICP1 sau de la un comparator analog, T1 își poate salva starea curentă într-un registru de captură separat ICR1.

Biți de înregistrare TCCR1A:TCC1B:TCNT1:OCR1A:OCR1B:ICR1
Inregistreaza-te7 6 5 4 3 2 1 0
TCCR1A COM1A1 COM1A0 COM1B1 COM1BO FOC1A FOC1B WGM11 WGM10
TCCR1B ICNC1 ICES1 * WGM13 WGM12 CS12 CS11 CS10
TCNT1:H R/V R/V R/V R/V R/V R/V R/V R/V
TCNT1:L R/V R/V R/V R/V R/V R/V R/V R/V
OCR1A:H R/V R/V R/V R/V R/V R/V R/V R/V
OCR1A:L R/V R/V R/V R/V R/V R/V R/V R/V
OCR1B:H R/V R/V R/V R/V R/V R/V R/V R/V
OCR1B:L R/V R/V R/V R/V R/V R/V R/V R/V
ICR1:H R/V R/V R/V R/V R/V R/V R/V R/V
ICR1:L R/V R/V R/V R/V R/V R/V R/V R/V

Fiecare registru de 16 biți este situat fizic în două registre de 8 biți, așa că atunci când citiți o intrare în ele, trebuie efectuate două operații. La scriere, se încarcă mai întâi octetul înalt, apoi octetul mic; la citire, dimpotrivă, se citește mai întâi octetul mic, apoi octetul înalt.

TCCR1A:TCCR1B- Registre de control timer/contor pe 8 biți T1

TCNT1- Temporizator/contor registru T1 pe 16 biți. În funcție de modul de funcționare, conținutul acestui registru este șters, incrementat (valoarea este mărită cu 1) sau decrementat (valoarea este scăzută cu 1) pentru fiecare impuls al semnalului de cronometru/contor ceas.

OCR1A:OCR1B- registre de comparație pe 16 biți

ICR1- Registrul de captare pe 16 biți, stochează valoarea TCNT1 atunci când o margine de semnal activ este aplicată pinului ICP1 sau de un semnal de la comparator.

Alocarea biților

COM1A1:COM1A0:COM1B1:COM1B0- Acești biți determină comportamentul pinului OC1A:OC1B atunci când valoarea registrului de numărare TCNT1 și a registrului de comparație OCR1A:OCR1B se potrivesc

FOC1A:FOC1B- Acești biți sunt folosiți pentru a forța o schimbare a stării pinului OC1A:OC1B

ICNC1- Bit de control al circuitului de interferență, dacă bitul este „0” captura va fi pe prima margine activă, dacă „1” captarea va fi după cea de-a patra eșantion identică a semnalului de captare.

ICES1- Bit pentru selectarea frontului activ al semnalului, dacă valoarea acestuia este „0”, salvarea registrului de numărare TCNT1 în registrul de captare OCR1 va fi pe frontul descendent al semnalului, dacă „1” pe frontul ascendent.

WGM13:WGM12:WGM11:WGM10- Acești biți determină modul de funcționare al temporizatorului/contorului T1

CS22:CS21:C20- Biți care determină sursa semnalului de cronometru/contor ceas T1.

Selectarea modului de operare al temporizatorului/contorului T1
WGM13WGM12WGM11WGM10Mod de operareModul de cont (TOP)
0 0 0 0 Normal $FFFF
0 0 0 1 PWM corect de fază

8 biți

00 $ FF
0 0 1 0 PWM corect de fază

9 biți

01 $ FF
0 0 1 1 PWM corect de fază

10 biți

03 $ FF
0 1 0 0 CTC (resetare la meci) OCR1A
0 1 0 1 PWM rapid

8 biți

00 $ FF
0 1 1 0 PWM rapid

9 biți

01 $ FF
0 1 1 1 PWM rapid

10 biți

03 $ FF
1 0 0 0 ICR1
1 0 0 1 PWM corect de fază și frecvență OCR1A
1 0 1 0 PWM corect de fază ICR1
1 0 1 1 PWM corect de fază OCR1A
1 1 0 0 CTC (resetare la meci) ICR1
1 1 0 1 Rezervat *
1 1 1 0 PWM rapid ICR1
1 1 1 1 PWM rapid OCR1A

Selectarea unei surse de ceas

Mod normal

Cel mai simplu mod de operare este T1. Pentru fiecare impuls al semnalului de ceas, registrul de numărare TCNT1 este incrementat (valoarea crește cu 1). La trecerea prin valoarea $FFFF a modulului de numărare (TOP), are loc o depășire și următorul ciclu de ceas începe să conteze de la valoarea $0000, în același moment în registrul TIFR este setat indicatorul TOV1=1, iar o întrerupere poate poate fi generat dacă flag-ul TOIE1=1 este setat în registrul TIMSK. Pentru a genera un semnal de o anumită frecvență în acest mod, este necesar să scrieți în biții COM1A1=0:COM1A0=1 pentru ieșirea OC1A sau COM1B1=0:COM1B0=1 pentru ieșirea OC1B a controlerului.

În plus, pentru fiecare ciclu de ceas, se face o comparație între registrul de numărare TCNT1 și registrul de comparație OCR1A:OCR1B; dacă există o potrivire, este setat indicatorul de întrerupere OCF1A=1:OCF1B=1 și dacă bitul OCIE1A=1 :OCIE1B=1 din registrul TIMSK, este generată o întrerupere. În același timp, starea pinului OC1A:OC1B poate fi schimbată în funcție de setările biților COM1A1:COM1A0:COM1B1:COM1B0.

Modul CTC (resetat la meci)

În acest mod, T1 funcționează pe același principiu ca în modul Normal. Diferența este că valoarea maximă posibilă a registrului de numărare TCNT1 este limitată de valoarea registrului de comparație OCR1A sau ICR1 (vezi tabelul de selecție a modului cronometru/contor). Când TCNT1 atinge valoarea OCR1A sau ICR1, valoarea TCNT1 este resetată la TCNT1 = $ 0000. În același timp, flag TOV1 = 1 este setat COM1A1:COM1A0:COM1B1:COM1B0 Determină comportamentul pinului OC1A:OC1B când există o potrivire.

Mod PWM rapid (PWM rapid)

Folosind acest mod, puteți genera un semnal PWM de înaltă frecvență. Principiul și procedura de funcționare nu diferă de modul Normal, cu excepția prezenței dublei tamponări a registrului OCR1A:OCR1B, care elimină apariția impulsurilor de semnal asimetrice și diferă, de asemenea, în comportamentul pinilor OC1A:OC1B ( Vezi tabelul).


Mod Phase Correct PWM

Diferența dintre acest mod și cele anterioare este că registrul de numărare funcționează ca un numărător invers. Deoarece acest mod este recomandat de Atmel ca fiind cel mai potrivit pentru tuning motoare, îl vom lua în considerare mai detaliat. Când registrul de numărare TCNT1 atinge valoarea modulului de numărare (TOP) (sau valoarea registrului ICR1 sau valoarea registrului OCR1A, vezi tabelul de selecție a modului cronometru/contor), direcția de numărare se schimbă. Când registrul de numărare TCNT1 atinge valoarea minimă ($0000), se schimbă și direcția de numărare și, în același timp, este setat indicatorul de întrerupere TOV1 al registrului TIFR. De asemenea, dacă conținutul registrului de numărare TCNT1 și al registrului de comparație OCR1A:OCR1B sunt egale, steag-ul OCF1A:OCF1B al registrului TIFR este setat și starea ieșirii OC1A:OC1B se modifică, conform tabelului.

Pentru a evita emisiile asimetrice la scrierea unei valori în registrul OCR1A:OCR1B, tamponarea dublă de scriere este implementată în acest mod. Datorită acestui fapt, modificarea reală a valorii registrului se modifică în momentul în care registrul contor TCNT1 atinge valoarea modulului de numărare (TOP) (sau valoarea registrului ICR1 sau valoarea registrului OCR1A, vezi selecția modului cronometru/contor). masa). Prin urmare, la început, când cronometrul/contorul este inițializat, pinul OC1A:OC1B nu își va schimba starea la potrivire până când registrul atinge valoarea (TOP).


Sarcină: Să dezvoltăm un program pentru a controla luminozitatea unei lămpi cu incandescență de 12 volți folosind PWM. Când apăsați butonul „Mai mult”, luminozitatea lămpii crește, iar când faceți clic pe butonul „Mai puțin”, luminozitatea scade. Diagrama viitorului nostru dispozitiv este prezentată în figură. Ca de obicei, folosim microcontrolerul Atmega8, care va fi tactat de la un oscilator intern cu o frecventa de 4 MHz. De fapt, vom obține un dimmer; aceste dispozitive sunt concepute pentru a regla luminozitatea corpurilor de iluminat. În zilele noastre, variatoarele LED sunt cele mai răspândite.

Pentru simplitate, puteți conecta și un LED la circuitul nostru, dar va fi mai clar cu un bec. Butoanele sunt conectate la pini PD0, PD1. Conectam sarcina la ieșire PB1(OC1A) printr-un rezistor și un tranzistor cu efect de câmp MOSFET, care va funcționa ca o cheie pentru noi (în modul de comutare). Un tranzistor cu efect de câmp este de preferat deoarece poarta sa este izolată de circuitul de putere și este controlată de un câmp electric, iar curentul de control ajunge la microamperi. Acest lucru permite, folosind unul sau doi tranzistori, să controlați o sarcină de putere enormă (până la zeci de amperi și zeci sau sute de volți) fără a încărca microcontrolerul. Ținând cont și de faptul că tranzistoarele cu efect de câmp pot fi conectate în paralel (spre deosebire de cele bipolare), este posibil să se obțină o cascadă și mai puternică de sute de amperi.

Acum să ne dăm seama cum implementează microcontrolerul PWM și să scriem un program. După cum am menționat mai devreme, MK-ul nostru are 3 cronometre și toate pot funcționa în modul PWM. Vom lucra cu un cronometru/contor de șaisprezece biți. Biți WGM13-10 haideți să ne configuram cronometrul să funcționeze FastPWM cu o limită superioară de numărare ICR1. Principiul programului este următorul: cronometrul nostru numără de la 0 la 65535(0xFFFF), în registru ICR1 Să introducem numărul 255, aceasta va fi limita superioară a numărului cronometrului (TOP), frecvența semnalului PWM va fi constantă. De asemenea, cronometrul nostru este configurat astfel încât, dacă registrul de numărare și registrul de comparare se potrivesc (TCNT1 = OCR1A), ieșirea controlerului va comuta OC1A. Ciclul de lucru PWM poate fi modificat prin scrierea în registrul de comparație OCR1A un anumit număr de la 0 la 255, cu cât acest număr este mai mare, cu atât factorul de umplere este mai mare, cu atât lampa va arde mai strălucitoare. În funcție de ce buton este apăsat, variabila se modifică i, iar apoi este scris în registru OCR1A.

Textul integral al programului este prezentat mai jos. Comentariile descriu funcționarea programului mai detaliat.

/***Lecția nr. 8. Generarea semnalelor PWM***/ #include #include int main(void) ( unsigned int i=0; //define variabila i /***Configurarea porturilor I/O***/ PORTB = 0x00; DDRB |= (1<< PB1); PORTD |= (1 << PD1)|(1 << PD0); // подключаем внутренние нагрузочные резисторы DDRD = 0x00; /***Настройка таймера***/ TCCR1A |= (1 << COM1A1)|(0 << COM1A0) // Установим биты COM1A1-COM1A0:0b10, означает сброс вывода канала A при сравнении |(1 << WGM11)|(0 << WGM10); // Установим биты WGM13-10:0b1110, согласно таблице это TCCR1B |= (1 << WGM13)|(1 << WGM12) // будет режим - FAST PWM, где верхний предел счета задается битом ICR1 |(0 << CS12)|(0 << CS11)|(1 << CS10); // Битами CS12-10:0b001 задаем источник тактового сигнала для таймера МК, включен без делителя TCNT1 = 0x00; // начальная установка счетчика ICR1 = 0xFF; // задаем период ШИМ, здесь у нас число 255, // по формуле fPWM=fclk_I/O/N*(1+ICR1)// вычисляем частоту ШИМ, она будет равна 15625 Hz OCR1A = 0x00; // начальный коэффициент заполнения ШИМ /***Основной цикл программы***/ while(1) { if((PIND&(1 << PD0)) == 0) //если кнопка "больше" нажата { if (i < 254) { // коэффициент заполнения ШИМ изменяется от 0 до 255 i=i+1; // увеличиваем i на единицу OCR1A = i; // записываем переменную в регистр сравнения _delay_ms(30); // задержка 30ms } } if((PIND&(1 << PD1)) == 0) //если кнопка "меньше" нажата { if (i >0) // Ciclul de lucru PWM se modifică de la 255 la 0 ( i--; // micșorează i cu unul (puteți scrie și asta) OCR1A = i; // scrieți o variabilă în registrul de comparație _delay_ms(30); // întârziere 30 ms)))))

Atenţie!În primul rând, furnizăm energie microcontrolerului, apoi trebuie să vă asigurați că tranzistorul este conectat la pinul MK și abia apoi furnizam energie circuitului cu lampa și tranzistorul cu efect de câmp. În caz contrar, puteți arde tranzistorul. Faptul este că atunci când sunt oprite, „picioarele” MK „atârnă în aer” - nu sunt conectate la nimic și apar interferențe asupra lor. Aceste interferențe slabe sunt suficiente pentru a deschide parțial un tranzistor cu efect de câmp foarte sensibil. Apoi, rezistența sa dintre scurgere și sursă va scădea de la câțiva MOhmi la câțiva Ohmi sau fracțiuni de Ohmi și un curent mare va curge prin ea către lampă. Dar tranzistorul nu se va deschide complet, deoarece pentru aceasta nu trebuie să aplicați interferențe de 1-3 V la poartă, ci un 5 V stabil, iar rezistența sa va fi mult mai mare decât minimul. Acest lucru va duce la eliberarea unei cantități mari de căldură pe el și va fuma și, eventual, va arde.

Modularea lățimii impulsului (PWM) este o metodă de conversie a semnalului în care durata impulsului (factorul de sarcină) se modifică, dar frecvența rămâne constantă. În terminologia engleză se face referire la PWM (modularea lățimii pulsului). În acest articol vom analiza în detaliu ce este PWM, unde este utilizat și cum funcționează.

Zona de aplicare

Odată cu dezvoltarea tehnologiei microcontrolerelor, s-au deschis noi oportunități pentru PWM. Acest principiu a devenit baza pentru dispozitivele electronice care necesită atât reglarea parametrilor de ieșire, cât și menținerea acestora la un anumit nivel. Metoda de modulare a lățimii pulsului este utilizată pentru a modifica luminozitatea luminii, viteza de rotație a motoarelor, precum și în controlul tranzistorului de putere al surselor de alimentare cu impulsuri (PSU).

Modularea lățimii impulsului (PW) este utilizată în mod activ în construcția sistemelor de control al luminozității LED. Datorită inerției scăzute, LED-ul are timp să se comute (intermitent și să se stingă) la o frecvență de câteva zeci de kHz. Funcționarea sa în modul puls este percepută de ochiul uman ca o strălucire constantă. La rândul său, luminozitatea depinde de durata pulsului (starea deschisă a LED-ului) într-o perioadă. Dacă timpul pulsului este egal cu timpul de pauză, adică ciclul de lucru este de 50%, atunci luminozitatea LED-ului va fi jumătate din valoarea nominală. Odată cu popularizarea lămpilor cu LED-uri de 220V, a apărut problema creșterii fiabilității funcționării lor cu tensiune de intrare instabilă. Soluția a fost găsită sub forma unui microcircuit universal - un driver de putere care funcționează pe principiul lățimii impulsului sau al modulării frecvenței impulsurilor. Un circuit bazat pe unul dintre aceste drivere este descris în detaliu.

Tensiunea de rețea furnizată la intrarea cipului driverului este în mod constant comparată cu tensiunea de referință în circuit, generând un semnal PWM (PWM) la ieșire, ai cărui parametri sunt stabiliți de rezistențe externe. Unele microcircuite au un pin pentru furnizarea unui semnal de control analogic sau digital. Astfel, funcționarea driverului de impuls poate fi controlată folosind un alt convertor PHI. Este interesant că LED-ul nu primește impulsuri de înaltă frecvență, ci un curent netezit de inductor, care este un element obligatoriu al unor astfel de circuite.

Utilizarea pe scară largă a PWM este reflectată în toate panourile LCD cu iluminare din spate LED. Din păcate, în monitoarele LED, majoritatea convertoarelor PWB funcționează la o frecvență de sute de Herți, ceea ce afectează negativ viziunea utilizatorilor de PC-uri.

Microcontrolerul Arduino poate funcționa și în modul controler PWM. Pentru a face acest lucru, apelați funcția AnalogWrite(), indicând în paranteze valoarea de la 0 la 255. Zero corespunde la 0V, iar 255 la 5V. Valorile intermediare se calculează proporțional.

Proliferarea pe scară largă a dispozitivelor care funcționează pe principiul PWM a permis omenirii să se îndepărteze de sursele de alimentare cu transformatoare de tip liniar. Rezultatul este o creștere a eficienței și o reducere de câteva ori a greutății și dimensiunii surselor de alimentare.

Un controler PWM este o parte integrantă a unei surse de alimentare comutatoare moderne. Controlează funcționarea unui tranzistor de putere situat în circuitul primar al transformatorului de impulsuri. Datorită prezenței unui circuit de feedback, tensiunea la ieșirea sursei de alimentare rămâne întotdeauna stabilă. Cea mai mică abatere a tensiunii de ieșire este detectată prin feedback de către un microcircuit, care corectează instantaneu ciclul de lucru al impulsurilor de control. În plus, un controler PWM modern rezolvă o serie de sarcini suplimentare care ajută la creșterea fiabilității sursei de alimentare:

  • oferă un mod de pornire ușoară pentru convertor;
  • limitează amplitudinea și ciclul de lucru al impulsurilor de control;
  • controlează nivelul tensiunii de intrare;
  • protejează împotriva scurtcircuitelor și supratemperaturii întrerupătorului de alimentare;
  • dacă este necesar, comută dispozitivul în modul standby.

Principiul de funcționare al unui controler PWM

Sarcina controlerului PWM este de a controla comutatorul de alimentare prin schimbarea impulsurilor de control. Când funcționează în modul de comutare, tranzistorul se află într-una din cele două stări (complet deschis, complet închis). În starea închisă, curentul prin joncțiunea p-n nu depășește câțiva μA, ceea ce înseamnă că puterea disipată tinde spre zero. În stare deschisă, în ciuda curentului mare, rezistența joncțiunii pn este extrem de scăzută, ceea ce duce și la pierderi termice nesemnificative. Cea mai mare cantitate de căldură este eliberată în momentul trecerii de la o stare la alta. Dar din cauza timpului scurt de tranziție în comparație cu frecvența de modulație, pierderile de putere în timpul comutării sunt nesemnificative.

Modularea lățimii impulsului este împărțită în două tipuri: analogică și digitală. Fiecare tip are propriile sale avantaje și poate fi implementat în moduri diferite în proiectarea circuitelor.

PWM analogic

Principiul de funcționare al unui modulator analogic PWM se bazează pe compararea a două semnale ale căror frecvențe diferă cu mai multe ordine de mărime. Elementul de comparație este un amplificator operațional (comparator). La una dintre intrările sale este furnizată o tensiune dinți de ferăstrău cu o frecvență constantă ridicată, iar celeilalte este furnizată o tensiune de modulare de joasă frecvență cu amplitudine variabilă. Comparatorul compară ambele valori și generează impulsuri dreptunghiulare la ieșire, a căror durată este determinată de valoarea curentă a semnalului modulator. În acest caz, frecvența PWM este egală cu frecvența semnalului dinți de ferăstrău.

PWM digital

Modularea lățimii impulsului în interpretarea digitală este una dintre numeroasele funcții ale unui microcontroler (MCU). Funcționând exclusiv cu date digitale, MK poate genera fie un nivel de tensiune ridicat (100%), fie un nivel scăzut (0%) la ieșirile sale. Cu toate acestea, în majoritatea cazurilor, pentru a controla eficient sarcina, tensiunea la ieșirea MC trebuie schimbată. De exemplu, reglarea turației motorului, modificarea luminozității LED-ului. Ce ar trebui să fac pentru a obține orice valoare de tensiune în intervalul de la 0 la 100% la ieșirea microcontrolerului?

Problema este rezolvată prin utilizarea metodei de modulare a lățimii impulsului și folosind fenomenul de supraeșantionare, când frecvența de comutare specificată este de câteva ori mai mare decât răspunsul dispozitivului controlat. Prin modificarea ciclului de lucru al impulsurilor, valoarea medie a tensiunii de ieșire se modifică. De regulă, întregul proces are loc la o frecvență de la zeci până la sute de kHz, ceea ce permite o ajustare lină. Din punct de vedere tehnic, acest lucru este implementat folosind un controler PWM - un microcircuit specializat care este „inima” oricărui sistem de control digital. Utilizarea activă a controlerelor bazate pe PWM se datorează avantajelor lor incontestabile:

  • eficiență ridicată de conversie a semnalului;
  • stabilitatea muncii;
  • economisirea energiei consumate de sarcină;
  • cost scăzut;
  • fiabilitate ridicată a întregului dispozitiv.

Puteți primi un semnal PWM la pinii microcontrolerului în două moduri: hardware și software. Fiecare MK are un temporizator încorporat care este capabil să genereze impulsuri PWM la anumiți pini. Acesta este modul în care se realizează implementarea hardware. Recepția unui semnal PWM folosind comenzi software are mai multe posibilități în ceea ce privește rezoluția și vă permite să utilizați un număr mai mare de pini. Cu toate acestea, metoda software duce la o sarcină mare a MK și ocupă multă memorie.

Este de remarcat faptul că în PWM digital numărul de impulsuri pe perioadă poate fi diferit, iar impulsurile în sine pot fi localizate în orice parte a perioadei. Nivelul semnalului de ieșire este determinat de durata totală a tuturor impulsurilor pe perioadă. Trebuie înțeles că fiecare impuls suplimentar este o tranziție a tranzistorului de putere de la o stare deschisă la o stare închisă, ceea ce duce la o creștere a pierderilor în timpul comutării.

Exemplu de utilizare a unui regulator PWM

Una dintre opțiunile pentru implementarea unui regulator simplu PWM a fost deja descrisă mai devreme în. Este construit pe baza unui microcircuit și are un ham mic. Dar, în ciuda designului simplu al circuitului, regulatorul are o gamă destul de largă de aplicații: circuite pentru controlul luminozității LED-urilor, benzi LED, reglarea vitezei de rotație a motoarelor de curent continuu.

Citeste si

PWM- Modularea lățimii impulsului
PWM- Modularea lățimii impulsului (adică la fel ca PWM)

Ce este PWM și de ce este necesar?

De ce aveți nevoie de software PWM?

Apoi, pe AVR (Atmega) în sine există 1-2 canale de lame, ceea ce adesea nu este suficient pentru ceea ce este necesar.

Să avem 3 (trei) LED-uri și vrem să controlăm luminozitatea fiecăruia în mod individual. Canalele de cronometru PWM încorporate nu sunt suficiente. Și, în general, poate că vrem totuși să exercităm un control special asupra fiecăruia dintre ei. Prin urmare, le punem pe picioare normale (în exemplul PORTC, picioarele 3,4,5) și le controlăm programatic.

Informații suplimentare despre conexiune: http://www.radiokot.ru/start/mcu_fpga/avr/05/ și în fișa de date către controler.

Calculul unui rezistor pentru un LED:

Putere: 5V. Căderea de tensiune pe LED poate fi considerată 1,5V. Curentul de pe LED nu ar trebui să fie mai mare de 20mA (unii vor argumenta că este nevoie de 15mA, dar îmi place mai luminos).
Conform legii lui Ohm: I=U/R, R=U/I=(5-1,5)/0,02=175 Ohm. Am instalat rezistențe R1, R2 și R2 - 220 Ohmi.

Algoritm

Cea mai simplă opțiune este un ciclu etern. Opțiunea cu întrerupere va fi mai târziu (mai jos), acum să ne uităm la un exemplu simplu pentru a înțelege esența.

În primul rând, trebuie să determinați două lucruri: la ce frecvență vor clipi LED-urile, astfel încât această clipire să nu fie vizibilă și, în al doilea rând, câte niveluri de luminozitate poate avea LED-ul.

În ceea ce privește nivelurile de luminozitate, să fie 256. 0 - complet oprit, 255 - complet pornit (adică canalul PWM este în cel logic tot timpul, adică ciclul de lucru = 100%.

Totuși, acum o să vă încurc puțin.

Ideea este că avem PLUS-ul diodei din circuit conectat direct la sursa de alimentare, iar minusul trece prin rezistor la picior (unde este rezistorul nu contează, ceea ce contează este ceea ce este la piciorul MK) . Prin urmare, LED-ul se aprinde atunci când nivelul de pe piciorul MK este scăzut, adică. zero, adică piciorul din interiorul MK este aruncat la GND, i.e. la pamant. Aceasta înseamnă că 0 și 1 din PWM trebuie de fapt inversate. Acestea. Cu cât semnalul conține mai mult 0s față de 1s, cu atât dioda va fi mai strălucitoare.

Și așa, există 256 de niveluri de luminozitate.

Despre ce fel de clipire vorbim? Concluzia este că, dacă trebuie să aplicăm un semnal PWM la mai multe diode și să facem acest lucru secvențial pentru fiecare, atunci după ce ieșim semnalul către prima diodă trebuie să revenim la ieșirea semnalului către aceasta într-un astfel de timp încât:

  1. aveți timp să generați un semnal PWM cu drepturi depline,
  2. nu a trecut mai mult de 1/25 de secundă, altfel LED-ul va clipi vizibil,
  3. Nu au existat pauze vizibile în generarea PWM între segmentele semnalului PWM, de exemplu. astfel încât semnalul PWM NU SĂ ESTE DISTORSAT.

Iată un exemplu de distorsiune a semnalului PWM:

Vom ține cont de toate acestea, dar de fapt nu este important pentru noi aici, deoarece vom avea un intermitent foarte simplu și neted și va schimba doar luminozitatea, adică. va fi mult timp, iar sarcina este atât de simplă încât nu va consuma timp de la generarea semnalului PWM.

Și așa, iată codul sursă (pentru AVR studio, adică gcc):

#define F_CPU 1000000UL #include #include #define LEDS_N 3 #define LEDS_PORT PORTC #define LEDS_DDR DDRC int main() ( înregistrează unsigned char scancounter=0; înregistrează unsigned char i; înregistrează unsigned char glow=0; unsigned char level=(0,16,32); // care parte din toate ciclurile led-ul este ON ledbits cu caracter nesemnat=(0b00001000,0b00010000, 0b00100000); // setați direcția C5 - ieșire LEDS_DDR=0b11111111; // opriți toate LED-urile LEDS_PORT=0b;1;1/(11;1;1;1; parte principală pwm pentru (i=0;i =level[i])( // off - pornește pin LEDS_PORT|=ledbits[i]; ) else ( // on - dezactivează pin LEDS_PORT&=~ledbits[i]; ) ) scancounter++; // luminozitatea ledului se schimbă dacă (!scancounter)( pentru (i=0;i 128)nivel[i]=0; ) ) ) )

Cum funcționează programul

Există un numărător de interval de timp - scancount. Valoarea maximă a acestui contor este numărul de niveluri de luminozitate minus 1. La fiecare rotație a ciclului crește cu unu, apoi depășește 255 și devine din nou 0. La fiecare rotație a ciclului, se setează un semnal pentru fiecare LED. Dacă contorul este mai mic sau egal cu nivelul de luminozitate, atunci opriți dioda. Dacă contorul este mai mic decât nivelul de luminozitate specificat pentru diodă, atunci porniți dioda. Și ca fiecare ciclu. De exemplu, dacă nivelul de luminozitate este 0, atunci contorul va fi întotdeauna egal sau mai mare decât zero și dioda va fi întotdeauna oprită. Dacă nivelul de luminozitate este de 255, atunci contorul va fi mai mic decât această valoare 254 din 255 de rotații ale contorului și va arde la intensitate aproape maximă. Dacă luminozitatea este setată la 50, atunci pentru primele 50 de rotații ale ciclului dioda va fi aprinsă, iar pentru restul de 206 de rotații va fi oprită, de exemplu. I se va furniza 50/256 din curentul maxim.

Mai jos în program controlăm nivelul de luminozitate al diodei, astfel încât să existe un fel de demonstrație. La fiecare depășire a contorului, se adaugă 1 la luminozitatea tuturor diodelor, dar dacă luminozitatea devine mai mare de 128, atunci este resetat la 0. În general, dacă această verificare nu a existat, atunci după atingerea nivelului de luminozitate de 255 ar fi resetat la zero, dar experiența a arătat că după o luminozitate de 128 crește atât de imperceptibil încât putem presupune că la o valoare de 128 este deja aproape maximă. Și pentru ca efectul rezultat să fie mai dinamic, a fost introdusă această verificare.

De asemenea, trebuie să știți că dependența luminozității de curent pentru LED-uri NU este LINEARĂ. Acestea. 128 nu este de două ori mai slab decât 255 și nici de două ori mai luminos decât 64.

Cât timp durează să rotești întregul ciclu cu toate diodele nu ne interesează aici, deoarece este clar că la o puritate de 1 MHz (acolo funcționează MK-ul meu), va fi suficient de rapid pentru ca ochiul să nu poată vezi orice pâlpâire.

Foto asamblare:


click pe fotografie pentru a mari

Și iată un videoclip al lucrării: (avi, divx, 3MB)
Videoclipul nu arată bine procesul de tranziție a luminozității, deoarece matricea camerei nu are aceeași inerție vizuală ca ochiul uman, dar, în general, procesul este vizibil.

Fig.1

T = T0+T1. Perioada pulsului

T = 1/F

S = T/T1

Ciclu de funcționare

Factor de umplere D=1/S sau așa D = T1/T*100%

Dispozitivele digitale, de exemplu, un microcontroler poate funcționa numai cu două niveluri de semnal, de exemplu. zero și unu sau oprit și pornit. Astfel, îl puteți utiliza cu ușurință pentru a monitoriza starea încărcării, cum ar fi pornirea sau oprirea unui LED. De asemenea, îl puteți utiliza pentru a controla orice dispozitiv electric folosind driverele adecvate (tranzistor, triac, releu etc.) Dar uneori aveți nevoie de mai mult decât doar „pornirea” și „oprirea” dispozitivului. Deci, dacă doriți să controlați luminozitatea unui LED (sau lampă) sau viteza unui motor de curent continuu, atunci semnalele digitale pur și simplu nu pot face acest lucru. Această situație este foarte comună în tehnologia digitală și se numește Modularea lățimii impulsului (PWM).

Aproape toate microcontrolerele moderne au hardware specializat pentru generarea unui semnal PWM. În acest tutorial vom învăța elementele de bază ale tehnicii PWM și mai târziu vom vedea cum să implementăm PWM folosind microcontrolere AVR.

Dispozitivele digitale precum un microcontroler pot genera doar două niveluri pe liniile de ieșire, înalt = 5V și scăzut = 0V. Dar dacă vrem să obținem 2,5 sau 3,1 sau orice tensiune între 0-5V? Pentru a face acest lucru, în loc să generăm o tensiune continuă constantă la ieșire, vom genera o undă pătrată care are niveluri ridicate = 5V și scăzute = 0V (vezi Figura 1).

Fig.1

Figura arată că semnalul rămâne alternativ la niveluri scăzute și ridicate pentru o perioadă de timp. T0 - nivel scăzut, T1 - nivel înalt. Perioada semnalului va fi egală cu T = T0+T1. Perioada pulsului- acesta este intervalul de timp dintre două puncte caracteristice a două impulsuri adiacente. În mod obișnuit, perioada este măsurată între două creșteri sau scăderi ale impulsurilor adiacente și este notă cu litera mare T.

Perioada de repetare a pulsului este direct legată de frecvența secvenței pulsului și poate fi calculată folosind formula: T = 1/F

Dacă lungimea pulsului T1 este exact egală cu jumătate din perioada T, atunci un astfel de semnal este adesea numit „undă pătrată”.

Ciclul de funcționare al impulsurilor este raportul dintre perioada de repetare a impulsurilor și durata acestora și este notat cu litera S: S = T/T1

Factorul de sarcină este o mărime adimensională și nu are unități de măsură, dar poate fi exprimat ca procent. Termenul se găsește adesea în textele în limba engleză Ciclu de funcționare, aceasta este așa-numita valoare duty cycle sau PWM. Ciclul de funcționare D este reciproca ciclului de funcționare.

Factor de umplere de obicei exprimat ca procent și calculat folosind formula: D=1/S sau așa D = T1/T*100%

În figura de mai sus (Fig. 1) puteți vedea că T1 = T0, aceasta este egală cu jumătate din perioada de timp. Deci, ciclul de lucru PWM este de 50%. Dacă frecvența unor astfel de impulsuri este suficient de mare (să zicem, 5000 Hz), atunci obținem jumătate din 5V, adică 2,5 V. Astfel, dacă ieșirea controlerului este cuplată la motor (folosind drivere adecvate) acesta va funcționa la 50% din viteza maximă. Tehnica PWM folosește acest fapt pentru a crea orice tensiune între două niveluri (de exemplu, între 0-12V). Trucul este că atunci când valoarea ciclului de lucru se schimbă între 0-100%, obținem același procentaj de tensiune de intrare la ieșire. Mai jos sunt câteva exemple de semnale PWM cu cicluri de lucru diferite.

Dacă instalați un filtru R/C la ieșire, puteți obține un nivel pur de semnal DC, mai degrabă decât unde pătrate. Dar acest lucru nu este necesar pentru motoarele cu perii sau pentru controlul luminozității LED-urilor. Pentru a face acest lucru, puteți aplica un semnal PWM direct driverului (de exemplu, un tranzistor bipolar, MOSFET etc.).

Sub modul de operare pe 16 biți. Temporizatorul este înțeles ca algoritmul său de numărare și comportamentul ieșirii modelului de impuls asociat cu acesta, care este determinat de o combinație de biți care specifică modul de funcționare a temporizatorului (WGMn3-0) și modul de generare a semnalului de ieșire (COMnx1:0) . În acest caz, biții pentru setarea modului de generare a semnalului de ieșire nu afectează algoritmul de numărare, deoarece Algoritmul de numărare depinde doar de starea biților pentru setarea modului de funcționare a temporizatorului. În modurile PWM, biții COMnx1:0 vă permit să activați/dezactivați inversarea pe ieșirea PWM generată (adică selectați PWM cu inversare sau PWM fără inversare). Pentru modurile non-PWM, biții COMnx1:0 determină ce acțiune trebuie întreprinsă atunci când are loc o potrivire: resetați, setați sau inversați ieșirea (consultați, de asemenea, „Blocul de condiționare a semnalului de ieșire” și „Diagramele de temporizare cronometru-contor pe 16 biți”) .

Operatie normala

Cel mai simplu mod de operare este modul normal (WGMn3-0 = 0b0000). În acest mod, contorul funcționează ca un contor de însumare (incrementare), iar contorul nu este resetat. Contorul depășește când trece prin maximul de 16 biți. valoarea (0xFFFF) la limita inferioară de numărare (0x0000). În timpul funcționării normale, indicatorul de depășire a temporizatorului-contor TOVn va fi setat pe același ciclu de ceas când TCNTn ajunge la zero.

De fapt, flag-ul TOVn overflow este al 17-lea bit al cronometrului, cu excepția faptului că este doar setat și nu este șters. Cu toate acestea, această proprietate poate fi utilizată în mod programatic pentru a crește rezoluția temporizatorului prin utilizarea unei întreruperi de depășire a temporizatorului, după care steag-ul TOVn este resetat automat. Nu există situații speciale pentru funcționarea normală, astfel încât o stare nouă a contorului poate fi înregistrată în orice moment.

În modul normal, puteți utiliza blocul de captură. Cu toate acestea, trebuie să se asigure că intervalul maxim de timp dintre apariția evenimentelor externe nu depășește perioada de depășire a contorului. Dacă această condiție nu este îndeplinită, este necesar să utilizați o întrerupere a depășirii contorului de cronometru sau un prescaler.

Blocul de comparație poate fi folosit pentru a genera întreruperi. Nu este recomandat să folosiți ieșirea OCnx pentru a genera semnale în funcționare normală, deoarece în acest caz, o parte semnificativă din timpul procesorului va fi cheltuită.

Modul de resetare a cronometrului meciului (CTC)

În modul CTC (WGM01, WGM00 =0b10), registrul OCR0 este utilizat pentru a seta rezoluția contorului. Dacă modul CTC este setat și valoarea contorului (TCNT0) se potrivește cu valoarea registrului OCR0, contorul este resetat la zero (TCNT0=0). Astfel, OCR0 specifică numărul de top al contorului și, în consecință, rezoluția acestuia. Acest mod oferă o gamă mai largă de reglare a frecvenței impulsurilor dreptunghiulare generate. De asemenea, simplifică funcționarea contorului de evenimente extern.

În resetarea temporizatorului în modul de potrivire (WGMn3-0 = 0b0100 sau 0b1100), rezoluția temporizatorului este setată de registrele OCRnA sau ICRn. În modul CTC, contorul (TCNTn) este resetat dacă valoarea lui se potrivește cu valoarea registrului OCRnA (WGMn3-0 = 0b0100) sau ICRn (WGMn3-0 = 0b1100). Valoarea registrului OCRnA sau ICRn determină limita superioară de numărare și, prin urmare, rezoluția temporizatorului. Acest mod oferă o gamă mai largă de reglare a frecvenței impulsurilor dreptunghiulare generate. De asemenea, simplifică funcționarea contorului de evenimente extern. Diagrama de timp a funcționării temporizatorului în modul CTC este prezentată în Figura 1. Contorul (TCNTn) își crește starea până când apare o potrivire cu valoarea OCRnA sau ICRn, apoi contorul (TCNTn) este resetat.

Figura 1 – Diagrama de timp pentru modul STS

Când limita superioară de numărare este atinsă, o întrerupere poate fi generată utilizând steagurile OCFnA sau ICFn corespunzătoare registrelor utilizate pentru a seta limita superioară de numărare. Dacă întreruperea este activată, atunci rutina de întrerupere poate fi utilizată pentru a actualiza limita superioară de numărare. Totuși, setarea valorii superioare de numărare aproape de valoarea limitei inferioare de numărare atunci când contorul funcționează fără prescaler sau cu o valoare mică de prescaler trebuie făcută cu extremă precauție, deoarece Nu există tamponare dublă în modul CTC. Dacă valoarea scrisă în OCRnA sau ICRn este mai mică decât valoarea curentă a TCNTn, contorul se va reseta atunci când apare condiția de potrivire când atinge valoarea maximă (0xFFFF), apoi se va reseta la 0x0000 și atinge noua valoare a OCRnA sau ICRn. În multe cazuri, această situație nu este de dorit. O alternativă este modul rapid PWM, în care registrul OCRnA determină limita superioară de numărare (WGMn3-0 = 0b1111), deoarece în acest caz OCRnA este tamponat dublu.

Pentru a genera un semnal în modul CTC, ieșirea OCnA poate fi utilizată pentru a schimba nivelul logic la fiecare potrivire prin setarea modului de comutare (COMnA1, COMnA0 = 0b01). Valoarea OCnA va fi prezentă pe un pin de port numai dacă direcția de ieșire este specificată pentru acel pin. Frecvența maximă a semnalului generat este fOC0 = fclk_I/O/2 dacă OCRnA = 0x0000. Pentru alte valori OCRn, frecvența semnalului generat poate fi determinată prin formula:

unde variabila N specifică factorul de diviziune prescaler (1, 8, 32, 64, 128, 256 sau 1024).

Ca și în cazul funcționării normale, indicatorul TOV0 este setat la aceeași bifă a temporizatorului atunci când valoarea sa se schimbă de la 0xFFFF la 0x0000.

Mod rapid PWM

Modul rapid de modulare a lățimii impulsului (PWM) (WGMn3-0 = 0b0101, 0b0110, 0b0111, 0b1110, 0b1111) este conceput pentru a genera impulsuri PWM cu frecvență crescută. Spre deosebire de alte moduri de operare, acesta folosește funcționarea contor unidirecțională. Numărarea se efectuează în direcția de la limita inferioară la limita superioară de numărare.

Dacă este setat un mod de ieșire fără inversare, atunci când TCNTn și OCRnx coincid, semnalul OCnx este setat și resetat la limita superioară de numărare. Dacă este specificat modul de inversare, ieșirea OCnx este resetată la o potrivire și setată la limita de număr mare. Datorită numărării unidirecționale, frecvența de operare pentru acest mod este de două ori mai mare decât în ​​modul PWM cu corecție de fază, în care se utilizează contorizarea bidirecțională. Capacitatea de a genera semnale PWM de înaltă frecvență face ca utilizarea acestui mod să fie utilă în sarcinile de stabilizare a puterii, rectificare și conversie digital-analogică. Înaltă frecvență, în același timp, permite utilizarea elementelor externe de dimensiuni fizice mici (inductori, condensatori), reducând astfel costul total al sistemului.

Rezoluția PWM poate fi fixată pe 8, 9 sau 10 biți sau setată de registrul ICRn sau OCRnA, dar nu mai puțin de 2 biți (ICRn sau OCRnA = 0x0003) și nu mai mult de 16 biți (ICRn sau OCRnA = 0xFFFF). Rezoluția PWM la o anumită valoare limită superioară (UL) se calculează după cum urmează:

În modul PWM rapid, contorul este incrementat până când valoarea lui se potrivește cu una dintre valorile fixe 0x00FF, 0x01FF sau 0x03FF (dacă WGMn3:0 = 0b0101, 0b0110 sau respectiv 0b0111), valoarea în ICRn (dacă WGMn3:0 = 0b1110) sau valoarea din OCRnA (dacă WGMn3:0 = 0b1111) și apoi resetați la următoarea bifare a ceasului temporizatorului. Diagrama de timp pentru modul PWM rapid este prezentată în Figura 2. Figura arată modul PWM rapid atunci când registrul OCRnA sau ICRn este utilizat pentru a seta limita superioară. Valoarea TCNTn din diagrama de timp este afișată ca un grafic al funcției pentru a ilustra numărarea unidirecțională. Diagrama arată atât ieșirile PWM inversate, cât și cele neinversate. O linie orizontală scurtă arată punctele din graficul TCNTn unde valorile OCRnx și TCNTnx coincid. Indicatorul de întrerupere OCnx este setat atunci când are loc o potrivire.

Figura 2 – Diagrama de timp pentru modul rapid PWM

Indicatorul Timer-Counter Overflow (TOVn) este setat ori de câte ori contorul atinge limita sa superioară. În plus, același impuls de ceas, împreună cu steagul TOVn, poate seta steaguri OCnA sau ICFn dacă registrul OCRnA sau ICRn este utilizat pentru a seta limita superioară, respectiv. Dacă una dintre aceste întreruperi este activată, rutina de întrerupere poate actualiza limita superioară a numărului și pragurile de comparație.

Dacă valoarea limitei superioare de numărare se modifică, atunci trebuie îndeplinită condiția ca noua valoare limită superioară scrisă să fie mai mare sau egală cu valorile din toate registrele de prag de comparație. În caz contrar, o potrivire între TCNTn și OCRnx nu va avea loc niciodată. Rețineți că atunci când utilizați valori limită superioară fixe, biții neutilizați sunt mascați la 0 atunci când scrieți în registrele OCRnx.

Mecanismul de modificare a registrului ICRn diferă de OCRnA atunci când este utilizat pentru a seta limita superioară. Registrul ICRn nu este dublu tamponat. Aceasta înseamnă că dacă o valoare mică este scrisă în ICRn în timp ce contorul rulează cu o prescalare mică sau deloc, există riscul de a scrie o valoare în registrul ICRn care este mai mică decât valoarea curentă a TCNTn. Ca urmare, în această situație meciul din fruntea numărului va fi ratat. În acest caz, contorul va atinge valoarea maximă (0xFFFF), va reporni la 0x0000 și abia apoi va genera o potrivire. Registrul OCRnA conține o schemă de tamponare dublă, astfel încât poate fi modificat în orice moment.

class="eliadunit">

Dacă se face o scriere pentru adresa OCRnA, valoarea este de fapt plasată în registrul tampon OCRnA. Dacă apare o potrivire între TCNTn și vârful numărării, atunci următorul ciclu de ceas al temporizatorului este copierea registrului tampon în registrul prag de comparație OCRnA. Registrul este actualizat în același ciclu de ceas pe măsură ce TCNTn este resetat și steag-ul TOVn este setat.

Se recomandă utilizarea registrului ICRn pentru a seta limita superioară dacă limita superioară de numărare este o constantă. În acest caz, registrul OCRnA este, de asemenea, eliberat pentru a genera un semnal PWM la ieșirea OCnA. Cu toate acestea, dacă frecvența PWM se modifică dinamic (datorită modificării limitei superioare), atunci în acest caz este mai avantajos să folosiți registrul OCRnA pentru a seta limita superioară, deoarece suportă dubla tamponare.

În modul rapid PWM, unitățile de comparație vă permit să generați semnale PWM pe pinii OCnx. Dacă COMnx1:0 = 0b10, atunci PWM este setat fără inversiune de ieșire, iar dacă COMnx1:0 = 0b11, atunci modul PWM cu inversiune de ieșire este setat (vezi Tabelul 59). Valoarea reală OCnx poate fi observată pe pinul portului dacă este setată pe direcția de ieșire (DDR_OCnx). Semnalul PWM este generat prin setarea (resetarea) registrului OCnx atunci când apare o potrivire între OCRnx și TCNTn și prin resetarea (setarea) registrului OCnx împreună cu resetarea contorului (modificarea de la limita superioară la limita inferioară).

Frecvența PWM a semnalului de ieșire pentru o anumită valoare limită superioară (UL) este determinată de expresia:

unde N este o variabilă care specifică valoarea coeficientului de predicție (1, 8, 32, 64, 128, 256 sau 1024).

Scrierea valorilor limită în registrul OCRnx este asociată cu cazuri speciale în generarea de impulsuri PWM. Dacă OCRnx este setat egal cu limita inferioară (0x0000), atunci la ieșire va apărea un impuls scurt la fiecare (VP+1) ciclu de ceas al temporizatorului. Scrierea unei valori egale cu limita superioară pentru OCRnx va avea ca rezultat setarea unui nivel de jurnal constant. 1 sau 0 la ieșire (în funcție de polaritatea semnalului de ieșire selectat folosind bitul COMnx1:0).

Dacă este necesară generarea de unde pătrate de înaltă frecvență (impulsuri dreptunghiulare cu un ciclu de lucru de 2 sau 50% umplere), atunci este necesar să se folosească modul rapid PWM cu biții COMnA1:0 = 0b01 setați, ceea ce determină nivelul logic la ieșirea OCnA pentru a comuta (inversa) la fiecare meci. Acest lucru este aplicabil numai dacă OCRnA este utilizat pentru a seta limita superioară (WGMn3-0 =0b1111). Frecvența maximă a undei pătrate generată în acest caz este fOCnA = fclk_I/O/2, dacă OCRnA = 0x0000. Această caracteristică este similară cu comutarea OCnA în modul CTC, cu excepția tamponării duble, care este prezentă în modul rapid PWM.

Modul de modulare a lățimii impulsului cu corecție de fază (Phase Correct)

Modul de modulare a lățimii impulsului corectat în fază (PWM FC) (WGMn3-0 = 0b0001, 0b010, 0b0011, 0b1010 sau 0b1011) este proiectat pentru a genera un semnal PWM corectat în fază cu rezoluție înaltă. Modul PWM FC se bazează pe funcționarea bidirecțională a unui cronometru. Contorul circulă de la limita inferioară (0x0000) la limita superioară și apoi înapoi de la limita superioară la limita inferioară. Dacă modul de ieșire a modelului de impulsuri este setat la non-inversoare, ieșirea OCnx este resetata/setata atunci când valorile TCNTn și OCRnx se potrivesc în timpul numărării ascendente/retrocesive. Dacă este setat modul de ieșire inversă, atunci, dimpotrivă, în timpul numărării directe, setarea are loc, iar în timpul numărării inverse, ieșirea OCnx este resetată. La funcționarea bidirecțională, frecvența maximă a semnalului PWM este mai mică decât la funcționarea unidirecțională, cu toate acestea, datorită unor caracteristici precum simetria în modurile PWM cu funcționare bidirecțională, aceste moduri sunt de preferat să fie utilizate atunci când se rezolvă problemele de control al unității.

Rezoluția PWM în acest mod poate fi fie fixă ​​(8, 9 sau 10 biți), fie setată folosind registrul ICRn sau OCRnA. Rezoluția minimă este de 2 biți (ICRn sau OCRnA = 0x0003), iar cea maximă este de 16 biți (ICRn sau OCRnA = 0xFFFF). Dacă este specificată o limită superioară, atunci rezoluția PWM în acest mod este determinată după cum urmează:

În modul PWM FC, contorul este incrementat până când atinge una dintre valorile fixe 0x00FF, 0x01FF sau 0x03FF (respectiv pentru WGMn3-0 = 0b0001, 0b0010 sau 0b0011), precum și o valoare egală cu ICRn- (dacă WGMn3-). 0 = 0b1010) sau OCRnA (dacă WGMn3 :0 = 0b1011). În plus, când este atinsă limita superioară, contorul schimbă direcția de numărare. Valoarea TCNTn rămâne la limita superioară pentru un ciclu de ceas temporizator. Diagrama de timp pentru modul PC PWM este prezentată în Figura 3. Figura arată modul PC PWM folosind registrul OCRnA sau ICRn pentru a seta limita superioară. Starea TCNTn este reprezentată ca un grafic de funcții pentru a ilustra numărarea bidirecțională. Figura arată atât ieșirea PWM neinversată, cât și cea inversată. Liniile orizontale scurte indică punctele din graficul TCNTn în care apare o potrivire cu valoarea OCRnx. Indicatorul de întrerupere OCnx este setat atunci când are loc o potrivire.

Figura 3 – Diagrama de timp pentru modul PWM FC

Indicatorul Timer-Counter Overflow (TOVn) este setat ori de câte ori contorul atinge limita sa inferioară. Dacă registrul OCRnA sau ICRn este utilizat pentru a seta limita superioară, atunci flag-ul OCnA sau ICFn este setat corespunzător cu același impuls de ceas la care registrul OCRnx a fost actualizat din registrul tampon (în partea de sus a numărării). Indicatoarele de întrerupere pot fi utilizate pentru a genera o întrerupere atunci când un contor atinge o limită inferioară sau superioară.

Când modificați valoarea limitei superioare de numărare, trebuie să vă asigurați că aceasta este mai mare sau egală cu valorile din toate registrele de comparație. În caz contrar, o potrivire între TCNTn și OCRnx nu va avea loc niciodată. Rețineți că atunci când utilizați valori fixe de numărare superioare, biții neutilizați sunt șterși la zero atunci când scrieți în registrele OCRnx. A treia perioadă din Figura 53 ilustrează cazul în care o modificare dinamică a limitei superioare de numărare duce la generarea unui impuls asimetric. Această caracteristică se bazează pe timpul de actualizare a registrului OCRnx. Deoarece actualizarea OCRnx are loc în partea de sus a numărului, perioada PWM începe și se termină în partea de sus a numărului. Aceasta implică faptul că durata numărătorii inverse este determinată de valoarea limită superioară anterioară, iar durata de numărare înainte este determinată de noua valoare limită superioară. Dacă aceste două valori sunt diferite, atunci și durata numărării înainte și înapoi va fi diferită. Diferența de durată duce la asimetria impulsurilor de ieșire.

Dacă sarcina este de a modifica limita superioară în timp ce contorul rulează, atunci în locul acestui mod se recomandă utilizarea modului PWM PFC (corecție de fază și frecvență). Dacă se utilizează o valoare limită superioară statică, atunci practic nu există diferențe între aceste moduri.

În modul PWM FC, unitățile de comparație vă permit să generați semnale PWM la pinii OCnx. Dacă setați COMnx1:0 = 0b10, atunci ieșirea PWM va fi fără inversare, iar dacă COMnx1:0=0b11, atunci cu inversare. Valoarea reală a OCnx poate fi observată pe pinul de port dacă registrul de direcție a datelor pentru acel pin de port este setat pe direcția de ieșire (DDR_OCnx). Semnalul PWM este generat prin setarea (resetarea) registrului OCnx atunci când valorile OCRnx și TCNTn se potrivesc în timpul numărării, și prin resetarea (setarea) registrului OCnx atunci când există o potrivire între OCRnx și TCNTn în timpul numărării reduse. Frecvența rezultată a semnalului PWM în modul PWM FC la o limită superioară dată (UL) poate fi calculată folosind următoarea expresie:

Scrierea valorilor limită în registrul OCRnx este asociată cu cazuri speciale în generarea de semnale PWM în modul PWM FC. Dacă setați modul PWM fără inversare și setați OCRnx egal cu limita inferioară, atunci ieșirea va fi setată continuu la log. 0, iar dacă este egal cu limita superioară, atunci un jurnal este întotdeauna prezent la ieșire. 1. Pentru PWM cu inversare, nivelurile indicate trebuie înlocuite cu cele opuse.

Dacă specificați să utilizați OCnA ca limită superioară (WGMn3:0 = 0b1011) și setați COMnA1:0 =0b01, o undă pătrată va fi generată la ieșirea OCnA.

Modul de modulare a lățimii impulsului cu corecție de fază și frecvență (Corect de fază și frecvență)

Modul de modulare a lățimii impulsului cu corecție de fază și frecvență (PWM PFC) (WGMn3-0 = 0b1000 sau 0b1001) este proiectat pentru a genera impulsuri PWM de înaltă rezoluție cu corecție de fază și frecvență. La fel ca modul PWM FC, modul PWM FC se bazează pe funcționarea bidirecțională a contorului. Contorul circulă de la limita inferioară (0x0000) la limita superioară și apoi înapoi de la limita superioară la limita inferioară. Dacă este specificat modul PWM fără inversare, ieșirea OCnx este resetată dacă apare o potrivire între TCNTn și OCRnx în timpul numărării în sus și este setată dacă apare o potrivire în timpul numărării în jos. În modul inversare, operația este inversă. Funcționarea bidirecțională, în comparație cu funcționarea unidirecțională, este asociată cu generarea de frecvențe inferioare. Cu toate acestea, datorită simetriei în modurile PWM cu numărare bidirecțională, utilizarea lor este de preferat în sarcinile de control al unității.

Principala diferență dintre modurile PWM FC și PWM FC este momentul în care registrul OCRnx este actualizat din registrul tampon OCRnx (vezi Figura 3 și Figura 4).

Rezoluția PWM în acest mod poate fi setată folosind registrul ICRn sau OCRnA. Rezoluția minimă este de 2 biți (ICRn sau OCRnA = 0x0003), iar rezoluția maximă este de 16 biți (ICRn sau OCRnA = 0xFFFF). Rezoluția PWM în biți poate fi calculată folosind următoarea expresie:

În modul PWM FCC, contorul este incrementat până când se potrivește cu valoarea din ICRn (WGMn3:0 = 0b1000) sau în OCRnA (WGMn3:0 = 0b1001). Aceasta înseamnă atingerea vârfului numărării, după care direcția numărării se schimbă. Valoarea TCNTn rămâne în partea de sus a numărului pentru un ciclu de ceas al temporizatorului. Diagrama de timp pentru modul PWM FCC este prezentată în Figura 54. Figura arată modul PWM FCC când vârful de numărare este setat de registrul OCRnA sau ICRn. Valoarea TCNTn este afișată ca un grafic al funcției pentru a ilustra numărarea bidirecțională. Diagrama arată atât ieșirile PWM fără inversare, cât și cele inversoare. Liniile orizontale scurte indică punctele din graficul TCNTn unde apare o potrivire între OCRnx și TCNTn. Indicatorul de întrerupere OCnx este setat după ce apare o potrivire.

Figura 4 – Diagrama de timp a modului PWM cu corecție de fază și frecvență

Indicatorul de depășire a cronometrului-contor (TOVn) este setat la același ciclu de ceas atunci când registrele sunt actualizate cu valoarea din registrul tampon (la limita inferioară de numărare). Dacă registrul OCRnA sau ICRn este utilizat pentru a seta limita superioară, atunci când contorul atinge limita superioară, este setat indicatorul OCnA sau, respectiv, ICFn. Indicatoarele de întrerupere pot fi utilizate pentru a genera o întrerupere atunci când un contor atinge o limită superioară sau inferioară.

Când modificați limita superioară, trebuie să vă asigurați că noua valoare este mai mare sau egală cu valorile din toate registrele de prag de comparație. În caz contrar, dacă limita superioară este setată la o valoare mai mică decât oricare dintre valorile din registrele de prag de comparație, nu va avea loc niciodată o potrivire între TCNTn și OCRnx.

Figura 4 arată că, spre deosebire de modul PWM FC, semnalul de ieșire generat este simetric în toate perioadele. Deoarece registrele OCRnx sunt actualizate la limita inferioară de numărare, duratele numărătorilor înainte și înapoi sunt întotdeauna egale. Ca urmare, impulsurile de ieșire au o formă simetrică și, prin urmare, o frecvență corectată.

Utilizarea registrului ICRn pentru a seta limita superioară este recomandată dacă valoarea limită superioară este o constantă. În acest caz, registrul OCRnA este de asemenea eliberat pentru modularea lățimii impulsurilor la pinul OCnA. Cu toate acestea, dacă trebuie să modificați în mod dinamic frecvența PWM prin modificarea limitei superioare, atunci este recomandat să utilizați registrul OCRnA pentru a seta limita superioară datorită tamponării sale duble.

În modul PWM, unitățile de comparație vă permit să generați impulsuri PWM la pinul OCnx. Dacă COMnx1:0 = 0b10, atunci este setată o ieșire PWM non-inversoare, iar dacă COMnx1:0=0b11, atunci una inversoare (vezi tabelul 60). Valoarea OCnx va fi prezentă numai pe pinul portului corespunzător dacă este setată pe direcția de ieșire. Semnalul PWM este generat prin setarea (resetarea) registrului OCnx pe o potrivire între OCRnx și TCNTn în timpul numărării și resetarea (setarea) registrului OCnx pe o potrivire între OCRnx și TCNTn în timpul numărării reduse. Frecvența PWM în acest mod cu o limită superioară dată (UP) de numărare este determinată după cum urmează:

unde N este factorul de diviziune prescaler (1, 8, 32, 64, 128, 256 sau 1024).

Scrierea valorilor limită în registrul OCRnx este asociată cu cazuri speciale în generarea semnalelor PWM în acest mod. Dacă setați OCRnx egal cu limita inferioară (0x0000), atunci în modul fără inversare, ieșirea va avea în mod constant un nivel logic scăzut, iar atunci când scrieți o valoare egală cu limita superioară, ieșirea va avea un nivel logic ridicat pentru un perioadă lungă de timp. În modul inversare, nivelurile date vor fi opuse.

Dacă OCRnA este utilizat pentru a seta limita superioară (WGMn3:0 = 0b1001) și COMnA1:0 = 0b01, atunci va fi generată o undă pătrată la ieșirea OCnA.

Implementarea hardware a PWM oferă avantaje incontestabile față de software, deoarece scutește procesorul atât de codul inutil, cât și de greoi și de timpul necesar pentru întreținerea acestuia și oferă, de asemenea, mai multe oportunități de utilizare a lucrului cu PWM. Este suficient să inițializați cronometrul/contorul (introduceți valorile necesare în registrele folosite de cronometru/contor) iar cronometrul/contorul poate funcționa independent de procesor; în consecință, procesorul se poate ocupa de alte sarcini, doar uneori contactand la momentul necesar pentru a regla sau schimba modul sau a obtine rezultate de la cronometru/contor.

Descrierea steagurilor de întrerupere

T1 poate genera o întrerupere atunci când:

  1. registru contor TCNT1 overflow;
  2. când registrul de numărare TCNT1 și registrul de comparație OCR1A și OCR1B sunt egale (separat pentru fiecare registru);
  3. în timp ce se păstrează registrul de numărare în registrul de captare ICR1.

T2 poate genera o întrerupere atunci când:

  1. Depășire registru contor TCNT2;
  2. când registrul de numărare TCNT2 și registrul de comparație OCR2 sunt egale.

Flag-urile tuturor întreruperilor sunt în registrul TIFR, iar activarea/dezactivarea întreruperii este în registrul TIMSK.

Biți de registru TIMSK
Inregistreaza-te7 6 5 4 3 2 1 0
TIMSK OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0* TOIE0
  • OCIE2- Indicatorul de activare a întreruperii pentru evenimentul „potrivire” al cronometrului/contorului T2
  • TOIE2- Indicator de activare a întreruperii temporizatorului/contorului de depășire T2
  • TICIE1- Indicatorul de activare a întreruperii pentru evenimentul „captură” al temporizatorului/contorului T1
  • OCIE1A- Indicatorul de activare a întreruperii pentru evenimentul „match A” al temporizatorului/contorului T1
  • OCIE1B- Indicatorul de activare a întreruperii pentru evenimentul „match B” al temporizatorului/contorului T1
  • TOIE1- Indicator de activare a întreruperii temporizatorului/contorului de depășire T1
  • OCIE0*- Indicatorul de activare a întreruperii pentru evenimentul „coincidență” al temporizatorului/contorului T0 (* - nu este disponibil în ATmega8)
  • TOIE0- Indicatorul de activare a întreruperii temporizatorului/contorului de depășire T0
  • OCF2- Flag de întrerupere pentru evenimentul „coincidență” al temporizatorului/contorului T2
  • TOV2- Indicatorul de întrerupere a temporizatorului/contorului de depășire T2
  • ICF1- Flag de întrerupere pentru evenimentul „captură” al cronometrului/contorului T1
  • OCF1A- Indicatorul de întrerupere pentru evenimentul „coincidență A” al temporizatorului/contorului T1
  • OCF1B- Indicatorul de întrerupere pentru evenimentul „coincidență B” al temporizatorului/contorului T1
  • TOV1- Indicator de întrerupere a temporizatorului/contorului de depășire T1
  • OCF0- Flag de întrerupere pentru evenimentul „coincidență” al temporizatorului/contorului T0
  • TOV0- Indicatorul de întrerupere a temporizatorului/contorului de depășire T0

Descrierea funcționării temporizatorului/contorului T1 în controlerul ATmega8/16

Temporizatorul/contorul de șaisprezece biți T1 poate fi folosit pentru a genera intervale de timp, a număra numărul de semnale externe și a genera semnale PWM cu cicluri de lucru și durate diferite pe pinii OC1A și OC1B. În plus, printr-un semnal extern de la pinul ICP1 sau de la un comparator analog, T1 își poate salva starea curentă într-un registru de captură separat ICR1.

Biți de înregistrare TCCR1A:TCC1B:TCNT1:OCR1A:OCR1B:ICR1
Inregistreaza-te7 6 5 4 3 2 1 0
TCCR1A COM1A1 COM1A0 COM1B1 COM1BO FOC1A FOC1B WGM11 WGM10
TCCR1B ICNC1 ICES1 * WGM13 WGM12 CS12 CS11 CS10
TCNT1:H R/V R/V R/V R/V R/V R/V R/V R/V
TCNT1:L R/V R/V R/V R/V R/V R/V R/V R/V
OCR1A:H R/V R/V R/V R/V R/V R/V R/V R/V
OCR1A:L R/V R/V R/V R/V R/V R/V R/V R/V
OCR1B:H R/V R/V R/V R/V R/V R/V R/V R/V
OCR1B:L R/V R/V R/V R/V R/V R/V R/V R/V
ICR1:H R/V R/V R/V R/V R/V R/V R/V R/V
ICR1:L R/V R/V R/V R/V R/V R/V R/V R/V

Fiecare registru de 16 biți este situat fizic în două registre de 8 biți, așa că atunci când citiți o intrare în ele, trebuie efectuate două operații. La scriere, se încarcă mai întâi octetul înalt, apoi octetul mic; la citire, dimpotrivă, se citește mai întâi octetul mic, apoi octetul înalt.

TCCR1A:TCCR1B- Registre de control timer/contor pe 8 biți T1

TCNT1- Temporizator/contor registru T1 pe 16 biți. În funcție de modul de funcționare, conținutul acestui registru este șters, incrementat (valoarea este mărită cu 1) sau decrementat (valoarea este scăzută cu 1) pentru fiecare impuls al semnalului de cronometru/contor ceas.

OCR1A:OCR1B- registre de comparație pe 16 biți

ICR1- Registrul de captare pe 16 biți, stochează valoarea TCNT1 atunci când o margine de semnal activ este aplicată pinului ICP1 sau de un semnal de la comparator.

Alocarea biților

COM1A1:COM1A0:COM1B1:COM1B0- Acești biți determină comportamentul pinului OC1A:OC1B atunci când valoarea registrului de numărare TCNT1 și a registrului de comparație OCR1A:OCR1B se potrivesc

FOC1A:FOC1B- Acești biți sunt folosiți pentru a forța o schimbare a stării pinului OC1A:OC1B

ICNC1- Bit de control al circuitului de interferență, dacă bitul este „0” captura va fi pe prima margine activă, dacă „1” captarea va fi după cea de-a patra eșantion identică a semnalului de captare.

ICES1- Bit pentru selectarea frontului activ al semnalului, dacă valoarea acestuia este „0”, salvarea registrului de numărare TCNT1 în registrul de captare OCR1 va fi pe frontul descendent al semnalului, dacă „1” pe frontul ascendent.

WGM13:WGM12:WGM11:WGM10- Acești biți determină modul de funcționare al temporizatorului/contorului T1

CS22:CS21:C20- Biți care determină sursa semnalului de cronometru/contor ceas T1.

Selectarea modului de operare al temporizatorului/contorului T1
WGM13WGM12WGM11WGM10Mod de operareModul de cont (TOP)
0 0 0 0 Normal $FFFF
0 0 0 1 PWM corect de fază

8 biți

00 $ FF
0 0 1 0 PWM corect de fază

9 biți

01 $ FF
0 0 1 1 PWM corect de fază

10 biți

03 $ FF
0 1 0 0 CTC (resetare la meci) OCR1A
0 1 0 1 PWM rapid

8 biți

00 $ FF
0 1 1 0 PWM rapid

9 biți

01 $ FF
0 1 1 1 PWM rapid

10 biți

03 $ FF
1 0 0 0 ICR1
1 0 0 1 PWM corect de fază și frecvență OCR1A
1 0 1 0 PWM corect de fază ICR1
1 0 1 1 PWM corect de fază OCR1A
1 1 0 0 CTC (resetare la meci) ICR1
1 1 0 1 Rezervat *
1 1 1 0 PWM rapid ICR1
1 1 1 1 PWM rapid OCR1A

Selectarea unei surse de ceas

Mod normal

Cel mai simplu mod de operare este T1. Pentru fiecare impuls al semnalului de ceas, registrul de numărare TCNT1 este incrementat (valoarea crește cu 1). La trecerea prin valoarea $FFFF a modulului de numărare (TOP), are loc o depășire și următorul ciclu de ceas începe să conteze de la valoarea $0000, în același moment în registrul TIFR este setat indicatorul TOV1=1, iar o întrerupere poate poate fi generat dacă flag-ul TOIE1=1 este setat în registrul TIMSK. Pentru a genera un semnal de o anumită frecvență în acest mod, este necesar să scrieți în biții COM1A1=0:COM1A0=1 pentru ieșirea OC1A sau COM1B1=0:COM1B0=1 pentru ieșirea OC1B a controlerului.

În plus, pentru fiecare ciclu de ceas, se face o comparație între registrul de numărare TCNT1 și registrul de comparație OCR1A:OCR1B; dacă există o potrivire, este setat indicatorul de întrerupere OCF1A=1:OCF1B=1 și dacă bitul OCIE1A=1 :OCIE1B=1 din registrul TIMSK, este generată o întrerupere. În același timp, starea pinului OC1A:OC1B poate fi schimbată în funcție de setările biților COM1A1:COM1A0:COM1B1:COM1B0.

Modul CTC (resetat la meci)

În acest mod, T1 funcționează pe același principiu ca în modul Normal. Diferența este că valoarea maximă posibilă a registrului de numărare TCNT1 este limitată de valoarea registrului de comparație OCR1A sau ICR1 (vezi tabelul de selecție a modului cronometru/contor). Când TCNT1 atinge valoarea OCR1A sau ICR1, valoarea TCNT1 este resetată la TCNT1 = $ 0000. În același timp, flag TOV1 = 1 este setat COM1A1:COM1A0:COM1B1:COM1B0 Determină comportamentul pinului OC1A:OC1B când există o potrivire.

Mod PWM rapid (PWM rapid)

Folosind acest mod, puteți genera un semnal PWM de înaltă frecvență. Principiul și procedura de funcționare nu diferă de modul Normal, cu excepția prezenței dublei tamponări a registrului OCR1A:OCR1B, care elimină apariția impulsurilor de semnal asimetrice și diferă, de asemenea, în comportamentul pinilor OC1A:OC1B ( Vezi tabelul).


Mod Phase Correct PWM

Diferența dintre acest mod și cele anterioare este că registrul de numărare funcționează ca un numărător invers. Deoarece acest mod este recomandat de Atmel ca fiind cel mai potrivit pentru tuning motoare, îl vom lua în considerare mai detaliat. Când registrul de numărare TCNT1 atinge valoarea modulului de numărare (TOP) (sau valoarea registrului ICR1 sau valoarea registrului OCR1A, vezi tabelul de selecție a modului cronometru/contor), direcția de numărare se schimbă. Când registrul de numărare TCNT1 atinge valoarea minimă ($0000), se schimbă și direcția de numărare și, în același timp, este setat indicatorul de întrerupere TOV1 al registrului TIFR. De asemenea, dacă conținutul registrului de numărare TCNT1 și al registrului de comparație OCR1A:OCR1B sunt egale, steag-ul OCF1A:OCF1B al registrului TIFR este setat și starea ieșirii OC1A:OC1B se modifică, conform tabelului.

Pentru a evita emisiile asimetrice la scrierea unei valori în registrul OCR1A:OCR1B, tamponarea dublă de scriere este implementată în acest mod. Datorită acestui fapt, modificarea reală a valorii registrului se modifică în momentul în care registrul contor TCNT1 atinge valoarea modulului de numărare (TOP) (sau valoarea registrului ICR1 sau valoarea registrului OCR1A, vezi selecția modului cronometru/contor). masa). Prin urmare, la început, când cronometrul/contorul este inițializat, pinul OC1A:OC1B nu își va schimba starea la potrivire până când registrul atinge valoarea (TOP).

Sarcină: Să dezvoltăm un program pentru a controla luminozitatea unei lămpi cu incandescență de 12 volți folosind PWM. Când apăsați butonul „Mai mult”, luminozitatea lămpii crește, iar când faceți clic pe butonul „Mai puțin”, luminozitatea scade. Diagrama viitorului nostru dispozitiv este prezentată în figură. Ca de obicei, folosim microcontrolerul Atmega8, care va fi tactat de la un oscilator intern cu o frecventa de 4 MHz. De fapt, vom obține un dimmer; aceste dispozitive sunt concepute pentru a regla luminozitatea corpurilor de iluminat. În zilele noastre, variatoarele LED sunt cele mai răspândite.

Pentru simplitate, puteți conecta și un LED la circuitul nostru, dar va fi mai clar cu un bec. Butoanele sunt conectate la pini PD0, PD1. Conectam sarcina la ieșire PB1(OC1A) printr-un rezistor și un tranzistor cu efect de câmp MOSFET, care va funcționa ca o cheie pentru noi (în modul de comutare). Un tranzistor cu efect de câmp este de preferat deoarece poarta sa este izolată de circuitul de putere și este controlată de un câmp electric, iar curentul de control ajunge la microamperi. Acest lucru permite, folosind unul sau doi tranzistori, să controlați o sarcină de putere enormă (până la zeci de amperi și zeci sau sute de volți) fără a încărca microcontrolerul. Ținând cont și de faptul că tranzistoarele cu efect de câmp pot fi conectate în paralel (spre deosebire de cele bipolare), este posibil să se obțină o cascadă și mai puternică de sute de amperi.

Acum să ne dăm seama cum implementează microcontrolerul PWM și să scriem un program. După cum am menționat mai devreme, MK-ul nostru are 3 cronometre și toate pot funcționa în modul PWM. Vom lucra cu un cronometru/contor de șaisprezece biți. Biți WGM13-10 haideți să ne configuram cronometrul să funcționeze FastPWM cu o limită superioară de numărare ICR1. Principiul programului este următorul: cronometrul nostru numără de la 0 la 65535(0xFFFF), în registru ICR1 Să introducem numărul 255, aceasta va fi limita superioară a numărului cronometrului (TOP), frecvența semnalului PWM va fi constantă. De asemenea, cronometrul nostru este configurat astfel încât, dacă registrul de numărare și registrul de comparare se potrivesc (TCNT1 = OCR1A), ieșirea controlerului va comuta OC1A. Ciclul de lucru PWM poate fi modificat prin scrierea în registrul de comparație OCR1A un anumit număr de la 0 la 255, cu cât acest număr este mai mare, cu atât factorul de umplere este mai mare, cu atât lampa va arde mai strălucitoare. În funcție de ce buton este apăsat, variabila se modifică i, iar apoi este scris în registru OCR1A.

Textul integral al programului este prezentat mai jos. Comentariile descriu funcționarea programului mai detaliat.

/***Lecția nr. 8. Generarea semnalelor PWM***/ #include #include int main(void) ( unsigned int i=0; //define variabila i /***Configurarea porturilor I/O***/ PORTB = 0x00; DDRB |= (1<< PB1); PORTD |= (1 << PD1)|(1 << PD0); // подключаем внутренние нагрузочные резисторы DDRD = 0x00; /***Настройка таймера***/ TCCR1A |= (1 << COM1A1)|(0 << COM1A0) // Установим биты COM1A1-COM1A0:0b10, означает сброс вывода канала A при сравнении |(1 << WGM11)|(0 << WGM10); // Установим биты WGM13-10:0b1110, согласно таблице это TCCR1B |= (1 << WGM13)|(1 << WGM12) // будет режим - FAST PWM, где верхний предел счета задается битом ICR1 |(0 << CS12)|(0 << CS11)|(1 << CS10); // Битами CS12-10:0b001 задаем источник тактового сигнала для таймера МК, включен без делителя TCNT1 = 0x00; // начальная установка счетчика ICR1 = 0xFF; // задаем период ШИМ, здесь у нас число 255, // по формуле fPWM=fclk_I/O/N*(1+ICR1)// вычисляем частоту ШИМ, она будет равна 15625 Hz OCR1A = 0x00; // начальный коэффициент заполнения ШИМ /***Основной цикл программы***/ while(1) { if((PIND&(1 << PD0)) == 0) //если кнопка "больше" нажата { if (i < 254) { // коэффициент заполнения ШИМ изменяется от 0 до 255 i=i+1; // увеличиваем i на единицу OCR1A = i; // записываем переменную в регистр сравнения _delay_ms(30); // задержка 30ms } } if((PIND&(1 << PD1)) == 0) //если кнопка "меньше" нажата { if (i >0) // Ciclul de lucru PWM se modifică de la 255 la 0 ( i--; // micșorează i cu unul (puteți scrie și asta) OCR1A = i; // scrieți o variabilă în registrul de comparație _delay_ms(30); // întârziere 30 ms)))))

Atenţie!În primul rând, furnizăm energie microcontrolerului, apoi trebuie să vă asigurați că tranzistorul este conectat la pinul MK și abia apoi furnizam energie circuitului cu lampa și tranzistorul cu efect de câmp. În caz contrar, puteți arde tranzistorul. Faptul este că atunci când sunt oprite, „picioarele” MK „atârnă în aer” - nu sunt conectate la nimic și apar interferențe asupra lor. Aceste interferențe slabe sunt suficiente pentru a deschide parțial un tranzistor cu efect de câmp foarte sensibil. Apoi, rezistența sa dintre scurgere și sursă va scădea de la câțiva MOhmi la câțiva Ohmi sau fracțiuni de Ohmi și un curent mare va curge prin ea către lampă. Dar tranzistorul nu se va deschide complet, deoarece pentru aceasta nu trebuie să aplicați interferențe de 1-3 V la poartă, ci un 5 V stabil, iar rezistența sa va fi mult mai mare decât minimul. Acest lucru va duce la eliberarea unei cantități mari de căldură pe el și va fuma și, eventual, va arde.