Schema avr rapidă. Schema circuitului pentru restaurarea biților FUSE în microcontrolerele AVR. Conectarea pinii microcontrolerului în modul de programare serială de înaltă tensiune

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 folosi 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 când TCNTn este resetat și este setat indicatorul TOVn.

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ță (Corectare 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 ocazional 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. dacă 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ă, mai întâi se citește octetul mic, apoi octetul înalt.

TCCR1A:TCCR1B- Registre de control temporizator/contor de 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 (resetat 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 (resetat 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ă un meci.

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.

În general, un cronometru are un registru de comparație OCR** iar când valoarea din cronometru se potrivește cu valoarea registrului de comparație OCR** Se pot intampla 2 lucruri:

  • Întrerupe
  • Schimbarea stării pinului de comparație extern OC**

Acum ne putem configura PWM când contorul atinge valoarea OCR** tensiune pe piciorul pe care l-am ales OC**schimbați de la 5 la 0. Când cronometrul ajunge la sfârșit și începe să numere, mai întâi schimbați tensiunea de la 0 la 5, vom avea impulsuri dreptunghiulare la ieșire

Există 3 moduri de funcționarePWM

STS(resetare la meci) - Acesta poate fi apelat CHIM semnal simulat cu frecvența pulsului când cronometrul numără invers până la valoare OCR** resetează și schimbă valoarea OC**spre opus. Astfel ciclul de activitate PWMîntotdeauna la fel.

Acesta este folosit atunci când trebuie să numărați perioade precise sau să generați întreruperi după un anumit timp.

PWM rapid(PWM rapid) - contorul numără de la 0 la 255, după care este resetat la 0.

Când valoarea temporizatorului se potrivește OCR** pinul corespunzător este resetat la 0; atunci când este resetat, este setat la 1.

Cel mai des folosit ca de obicei PWM

PWM corect de fază(PWM cu fază precisă) - în acest mod, contorul numără de la 0 la 255 și apoi numără înapoi până la zero. La primul meci cu OCR** ieșirea este resetată la 0, dacă există o a doua potrivire (când contorul revine), este setată la 1.

Folosit pentru a se asigura că faza nu se rătăcește atunci când ciclul de funcționare se schimbă.



Dacă vrem să lucrăm cu ieșirea OC1A pune bucățile înăuntru COM1A1 COM1A0
În general, „/” înseamnă SAU. TCNT1= OCR1A Pentru PWM la ieșire OC1A

Mod de funcționare temporizator/contor- mod de funcționare cronometru/contor.

Top- Valoarea TCNT1 la care comută valoarea de ieșire OC**.

Steagul TOV1 activat- la ce valori este setat bitul de registru GIFR

Selectăm din ultimul tabel modul de care avem nevoie, nu ne uităm Top. Din tabelul 2, selectați oricare dintre ultimele 2 opțiuni. Tot ce rămâne este să aranjați biții necesari în registre.

#define F_CPU 8000000UL #include #include int main() ( DDRD = 0xFF; OCR1A=0xC0; // Comparați cu această valoare OCR1B=0x40; // Configurarea PWM și cronometrul TCCR1A|=(1)<CS10 setat la 1, calculează cu frecvența MK despre modul de setare a frecvenței cronometrului


Să trecem la studiul cronometrelor încorporate.
întreruperi de studiu și mai ales cronometreîn microcontrolere prezintă o anumită complexitate datorită versatilităţii lor. Astăzi vom încerca să înțelegem termenii și numele.

ÎN Microcontrolere AVR poate fi de la unu la 4 temporizatoare, opt biți sau șaisprezece biți.
În termeni simplificați, cronometrele sunt desemnate prin litera T și un număr de la zero la trei. De obicei, chiar T0 și T2 sunt de opt biți, iar T1 și T3 impari sunt de șaisprezece biți. La programare, o versiune simplificată este utilizată numai în comentarii, iar în programe este scris numele complet al temporizatorului - registrul TCNT. Simbolurile cronometrului sunt prezentate mai jos:

Cronometre

T0, T2– (TCNT0, TCNT2) contoare pe opt biți (pari)
TCNTn- registrul de numărare al contorului de 8 biți
Unde; număr n-contor

T1, T3– (TCNT1Н și TCNT1L, TCNT3H și TCNT3L) contoare pe șaisprezece biți (impare)
TCNTny- registrul de numărare al unui contor de 16 biți
Unde; număr n-contor
cifra y-înaltă (H) sau mică (L).

T1 este format din două registre de opt biți TCNT1H și TCNT1L, A
T3 din două registre TCNT3H și TCNT3L. Scrisoare H este indicată cifra cea mai semnificativă și L Jr.

Deoarece cronometre sunt registre, pot fi accesate oricând, citiți, scrieți, resetați și modificați valoarea.
Au fost adoptate anumite reguli de scriere și citire în temporizatoarele TCNT1Н și TCNT1L.

1. Programele pentru scrierea și citirea datelor temporizatorului trebuie să fie atomice, adică. Înainte de a citi sau scrie, dezactivăm întreruperile, iar la sfârșitul procesului le activăm din nou.
2. La scriere, se scrie mai întâi octetul mare H și apoi octetul mic L.
3. La citire, mai întâi este citit octetul mic L, apoi octetul mare H.
De exemplu:
Înregistrarea datelor în registrul de numărare.
CLI ; Dezactivare întreruperi OUT TCNT1H,R16; Scrie octet mare OUT TCNT1L,R17; Scrie SEI cu octet mic; Activați întreruperile

Citirea datelor din registrul de contor
CLI ; Dezactivare întreruperi IN TCNT1L,R16; Citiți octet mic IN TCNT1H,R17; Citiți octet înalt SEI; Activați întreruperile

De ce astfel de reguli?Și toate acestea pentru ca datele să nu fie distorsionate în timpul necesar pentru a citi din fiecare registru.
Dacă utilizați citirea directă a registrelor de 8 biți TCNT1H și TCNT1L, nu puteți fi sigur că aceste registre au fost citite în același timp. Poate apărea următoarea situație: Contorul conținea valoarea $01FF, ați numărat TCNT1H (conținând valoarea 01 într-o variabilă). În acest timp, a sosit pulsul de numărare, iar conținutul lui TCNT1L a devenit egal cu $00, iar valoarea $02 a fost scrisă în TCNT1H.

Acum citiți valoarea TCNT1L într-o altă variabilă, obțineți valoarea 00 USD în această variabilă (la urma urmei, cronometrul/contorul a contat deja). Valoarea pe 16 biți a acestor variabile s-a dovedit a fi 0100 USD, dar în momentul în care a fost citit octetul înalt, conținutul contorului era 01FF USD, iar octetul tău scăzut ar fi trebuit citit ca FF. Pentru a preveni această situație, se utilizează un registru temporar conținut în blocul temporizator/contor. Acest registru este transparent, adică. functioneaza automat. Când citiți valoarea registrului TCNT1L într-o variabilă, conținutul TCNT1H ajunge în acest registru. Apoi, la citirea octetului mare în variabilă, se citește valoarea registrului temporar. Registrul temporar este absolut transparent pentru utilizator, dar pentru ca acesta să funcționeze corect, trebuie urmată secvența de acțiuni de mai sus. Accesarea registrelor printr-un registru suplimentar (buffer) se numește dublu buffering

Temporizatoarele sunt asociate cu numărarea impulsurilor, care poate fi extern și alimentat la o intrare specială a microcircuitului sau generat de propriul generator. La rândul său, frecvența propriului oscilator poate fi sincronizată de un rezonator extern de cuarț sau poate fi determinată de un circuit RC intern. După aceasta, frecvența externă sau frecvența propriului oscilator trece printr-un prescaler controlat de registru CLKPR Frecvența oscilatorului după prescaler (prescaler) CLKPR este adesea numită semnalul de ceas (frecvența de ceas) al procesorului (CPU).
Frecvența furnizată la intrarea temporizatorului desemnat ca CLKTn Această frecvență corespunde semnalului de ceas al procesorului.
Un impuls de numărare mărește valoarea temporizatorului cu unul, astfel încât registrele TCNT contorează și numit cronometru/contor (TC).
Pentru ca temporizatorul/contorul să funcționeze corect pe un semnal de ceas extern, timpul minim dintre două comutatoare ale semnalului de ceas extern trebuie să fie de cel puțin o perioadă de ceas a CPU. Semnalul de ceas extern este sincronizat de frontul ascendent al semnalului de ceas intern al procesorului. (Acest lucru trebuie reținut atunci când se construiesc contoare de frecvență).
Registrul de control pentru cronometru/contor TCNT este un registru TCCR.
Întrerupeți masca pentru cronometru/contor TCNT servește drept registru TIMSK(registru de control al întreruperii temporizatorului).
Registrul de semnalizare a mască de întrerupere TIMSK este registrul TIFR. Amintiți-vă că aceste 3 registre (TCCR, TIMSK, TIFR) sunt aproape întotdeauna folosite când contorul/temporizatorul TCNT rulează.

Întreruperile pot fi declanșate prin depășirea registrului TCNT, compararea valorii registrului TCNT cu valoarea registrelor speciale de comparare OCR, captarea de valorile registrelor speciale de captare ICR și sunt determinate de modul de funcționare al cronometru/contor. În plus, poate fi declanșată o cerere de întrerupere Watchdog Timer WDT.

Temporizatoarele/contoarele pot funcționa în diferite moduri și, în consecință, pot îndeplini diferite funcții.
Modul de funcționare, adică comportamentul temporizatorului/contorului și ieșirii semnalului de potrivire, este determinat de modul de funcționare al generatorului de semnal controlat de registru WGM02; WGM01; WGM00(forma prescurtată WGM02:0), și modul de ieșire a semnalului de potrivire controlat de registre COM0x1; COM0x0(forma prescurtată COM0x1:0). Starea biților care determină modul de ieșire al semnalului de potrivire nu afectează secvența de numărare, care este determinată numai de starea biților de configurare a generatorului de semnal.

Biți COM0x1:0 determinați dacă semnalul de ieșire PWM ar trebui să fie inversat sau nu (PWM inversat sau neinversat).
(PWM) Modulație pe lățime de impuls sau modulare pe lățime de impuls (PWM).
Pentru modurile non-PWM, conținutul biților COM0x1:0 determină dacă semnalul de ieșire trebuie setat la unu, resetat la zero sau comutat la starea opusă în momentul unei potriviri

--
Vă mulțumim pentru atenție!
Igor Kotov, redactor-șef al revistei Datagor

Puteți face un pas egal cu unu, apoi modificările vor arăta astfel:
plus: întârziere apel ; Accesați subrutina de întârziere inc temp2; Să mergem cu un pas mai departe și să verificăm dacă rezultatul este egal cu zero breq plus_1 ; Dacă este egal, atunci mergeți la eticheta plus_1 rjmp Corect ; Reveniți la sondaj butoanele plus_1: dec temp2 ; scade un rjmp Corect ; Revenirea la butoanele de sondare minus: întârziere apel ; Accesați subrutina de întârziere dec temp2; Să facem un pas și să verificăm dacă rezultatul este egal cu zero breq minus_1 ; Dacă este egal, atunci mergeți la minus_1 rjmp Eticheta corectă; Reveniți la butoanele de sondare minus_1: inc temp2 ; adăugați un rjmp Corect; Reveniți la sondarea butonului

Din cauza învechirii AVRStudio 5 și a microcontrolerului ATtiny2313, o serie de articole vor fi rescrise pentru AtmelStudio6 și microcontrolerele ATmega8 și ATmega16. Îmi cer scuze anticipat pentru inconvenient.

Un alt exemplu simplu de realizare a unei plăci de depanare, dar de data aceasta pentru dispozitive care folosesc microcontrolerul ATTiny2313. Locația picioarelor de programare pentru ATTiny2313 este identică cu ATTiny13. În consecință, plăcile vor fi similare. Diferența va fi prezența unui oscilator master extern (cuart). Implicit, ATTiny2313 este furnizat din fabrică cu un oscilator intern activat, așa că dacă microcontrolerul nu este planificat să funcționeze de la un oscilator extern, acesta nu poate fi instalat. Duplicăm conectorul de alimentare în cazul conectării unui programator alimentat de circuit la placă (alimentăm un conector, iar programatorul de la celălalt).


Pentru a face o placă de depanare pentru dispozitive bazate pe ATTiny2313 avem nevoie de:


Asamblam placa de depanare conform desenului:

1 este lipit într-o priză pentru microcircuit și pini (ca în imagine);
2, așa cum se arată în figură (linia roșie), facem un jumper pe partea din față a plăcii. Mai facem un săritor pe cealaltă parte;
Folosind 3 jumperi „snot” conectăm pinii și picioarele prizei (punctele de lipit sunt încercuite în verde).

Tabloul nostru de dezvoltare este gata!

Concluzie.

— Punem marcaje pe GND, SCK pentru conectarea corectă a puterii și programatorului;
— Orice altceva de pe placa de depanare va fi lipit în funcție de circuitul dispozitivului selectat. (ca opțiune, puteți lipi pini la fiecare picior al microcontrolerului pentru a conecta alte plăci și periferice);
— Pentru o funcționare mai fiabilă în condiții de zgomot crescut, este foarte de dorit să completați circuitul cu un rezistor care trage pinul de resetare la sursa de alimentare (rezistorul intern de pull-up are o rezistență de aproximativ 10 kOhm - aceasta nu este suficient) și un condensator ceramic de filtrare pe pinii de alimentare (în limita a 0,1 μF);
-Acum introducem microcontrolerul în soclu și folosim ATTiny2313 pentru a-l flash cu firmware-ul necesar.

(Vizitat de 16.038 de ori, 1 vizite astăzi)

Sectiunea: Etichete: ,

Post navigare

O placă de dezvoltare simplă pentru dispozitivele AVR ATTiny2313 cu cuarț.: 70 de comentarii


  1. GetChiper Postat de

    Te-ai atins de siguranțe?
    L-ai verificat pe alt Tini2313?

  2. Toxa12345

    M-am chinuit mult timp despre: „CE MK să aleg?” M-am hotărât pe Tinka 2313 pentru că este mai ieftin decât ATMEG, și nu este la fel de scump ca Tinka 13, tot din cauza prezenței liniilor RxD și TxD, ceea ce permite comunicare prin Africa de Sud
    ZY Nu este o problemă să cumperi MK aici, în Kursk. Tinka 2313 costă 130 de ruble. și atmega8 până la 200 de ruble nu au aflat despre Tink 13


  3. GetChiper Postat de

    Sau poate ATmega88 sau ATmega48?

  4. Andrei1979

    Timp bun.
    Am asamblat placa conform schemei propuse, am conectat-o ​​la USBasp, am conectat 2313, am aplicat 5 V. Extreme Burner dă un cip incorect găsit. Prin urmare, este imposibil să nu flash nimic. Același lucru se întâmplă și la înlocuirea cutiei.
    A mai intalnit cineva asa ceva?
    Poate că asta se datorează interferențelor?

    „- Pentru o funcționare mai fiabilă în condiții de zgomot crescut, este foarte de dorit să completați circuitul cu un rezistor care trage pinul de resetare la sursa de alimentare (rezistorul intern de pull-up are o rezistență de aproximativ 10 kOhm - aceasta este nu este suficient) și un condensator ceramic de filtrare pe pinii de alimentare (în limita a 0,1 µF); »

    și, de asemenea, mai ales pentru manechini, este posibil să reflectăm aceste acțiuni sub forma unei diagrame.


  5. GetChiper Postat de

    Ce să afișați acolo.
    Condensatorul este plasat paralel cu sursa de alimentare (adică între picioarele 10 și 20)
    Un rezistor de 10 kOhm este plasat între Vcc și resetare (adică între pinii 1 și 20)

  6. Andrei1979

    Multumesc pentru raspuns. L-am setat la 4,7 KOhm și 220pF. A devenit un pic mai distractiv. extreme arzător scrie la fel ca a fost. Dar khazama raportează de fiecare dată Semnătura cipului este 0x1e000. NEPOTITARE Semnătura așteptată pentru ATTiny 2313 este 1e 91 0a. În alte cazuri, scrie și o eroare de conexiune.

    Folosesc o placă fără lipire, așa că nu ar trebui să fie probleme cu lipirea murdară. Unde mai poți căuta?


  7. GetChiper Postat de

    220pF nu este suficient. Aveți nevoie de 0,1 µF - ceramică (nepolară) și 10-100 µF electrolitic (polar) în paralel.

  8. Dederik

    Bună ziua))) Nu am găsit cuarț 20.000, în schimb am putut găsi doar cuarț 4.000. Dacă instalez quartz 4.000, micro-r-ul meu va încetini? Iar condensatorii sunt la fel, trebuie schimbati cu quartz 4.000? Locuiesc în Samarkand cu piese de schimb pentru radio, avem o problemă(((Nici măcar nu știu unde să găsesc o priză pentru microcon-r((( este posibil să faci singur o priză pentru micro-r?

  9. Dederik

    macar sa raspunda cineva)))


  10. GetChiper Postat de

    Calmează-te - era weekend :)

    Puteți folosi orice cuarț dacă intenționați să studiați și să vă faceți propriile dispozitive folosind această eșarfă (nu este nevoie să schimbați condensatorii pentru cuarț). Sau puteți sări peste instalarea quartzului și să utilizați oscilatorul RC încorporat.

    În ceea ce privește fabricarea unei prize, poate doar lipiți MK-ul până la moarte într-o placă?

  11. Dederik

    multumesc pentru ajutor))) Mai am o intrebare pentru tine, dar nu stiu unde sa intreb ((((azi mi-au adus un contor electronic pentru reparatie Holley DDS28. Am sapat pe acolo si am gasit un micro-p) Fudan FM24C02 acolo care răspunde pentru citirile contorului.Întreaga înregistrare este stocată în micro-înregistrare.Poți să-mi spui cum să fac un programator pentru el, astfel încât să poți citi și edita datele micro-înregistrării???și cum să iti scriu direct???


  12. GetChiper Postat de

    FM24C02 este o memorie serială nevolatilă (EEPROM)
    Cred că există multe cabluri și programe pentru această chestiune (dacă întrebați un motor de căutare) - aici este primul care apare http://www.msplata.ru/teleprog.html

  13. Dederik

    Multumesc pentru ajutor:-)

  14. kosmogon

Acest dispozitiv - Attiny fusebit doctor - vă permite să restabiliți configurația Fuse bits (setări din fabrică, conform descrierii tehnice) a microcontrolerelor din familia Tiny de la Atmel. Acceptă toate microcontrolerele care au o interfață de programare în serie de înaltă tensiune (HVSP):

  • într-un pachet cu 8 pini: , , ;
  • într-un pachet cu 14 pini: , ;
  • la pachet cu 20 de pini, cu un adaptor special: , .

Dacă aveți nevoie de un dispozitiv pentru a restabili configurația de biți de siguranță a microcontrolerelor din familia ATtiny, consultați proiectul: .

Aparatul este foarte simplu de fabricat și nu conține componente scumpe. Baza este un microcontroler, precum și mai multe rezistențe și tranzistoare (,) și un regulator de tensiune de +5 V (7805T). Este de remarcat faptul că pentru alimentarea dispozitivului este necesară o sursă de alimentare stabilizată cu o tensiune de ieșire de +12 V (ceea ce este important pentru inițializarea modului de programare de înaltă tensiune).

La programarea biților de siguranță ai microcontrolerului Trebuie luat în considerare faptul că un oscilator intern de 4 MHz este utilizat fără un divizor cu 8. De asemenea, puteți activa opțiunea „putere în creștere rapidă”.

Diagramă schematică

Placă de circuit imprimat

Placa cu componentele instalate

Conectarea pinii microcontrolerului în modul de programare serială de înaltă tensiune

Restaurarea configurației microcontrolerului (pacientului) începe prin apăsarea butonului Start. Pentru a indica starea, sunt prevăzute două LED-uri, ale căror stări indică:

  • LED verde aprins- Configurația biților de siguranță a fost restabilită. Dacă sunt setați biți de blocare, atunci numai configurația curentă a biților este verificată pentru conformitate cu setările din fabrică și dacă se potrivește, LED-ul verde se aprinde;
  • LED roșu aprins- eroare la citirea semnăturii microcontrolerului: este imposibil de citit, nu există microcontroler în soclu sau semnătura nu se potrivește cu cele din baza de date a dispozitivului;
  • LED-ul verde clipește- semnătura este corectă, configurația bitului Fuse este incorectă. Biții de blocare sunt setați, este necesară operația de ștergere flash;
  • LED-ul roșu clipește- semnătura este corectă, biții de blocare nu sunt setați, dar din anumite motive biții Fuse nu pot fi scriși, iar verificarea eșuează după 10 încercări.

Dispozitivul de recuperare a biților de siguranță funcționează conform protocolului de programare serială de înaltă tensiune. Inițial, când începe procesul, microcontrolerul care este restaurat (pacient) trece în modul de programare a memoriei de înaltă tensiune, apoi se citește semnătura cipului și se verifică capacitatea dispozitivului de a lucra cu acesta. După aceasta, se efectuează o operație de ștergere dacă utilizatorul a specificat-o. Următoarea etapă este citirea biților de blocare și, dacă aceștia nu sunt setați, „pacientul” primește o nouă configurație de biți Fuse corespunzătoare modelului microcontrolerului pacientului. După aceasta, se verifică instalarea (verificarea) biților Fuse și, dacă testul are succes, dispozitivul își încheie funcționarea. În caz contrar, dispozitivul repetă ciclul de înregistrare și verificare a biților Fuse de 10 ori.

Există două jumperi instalate pe placă: „Ștergere cip” și „semnătură necunoscută”:

  • ștergerea cipului- permite operatia de stergere a intregii memorie Flash a cipului. Acest lucru este necesar dacă biții de blocare sunt setați, de ex. Nu există nicio modalitate de a corecta biții de siguranță până când biții de blocare nu sunt șterși. Jumperul este pornit - operația de ștergere este permisă.
  • semnătură necunoscută- o semnătură de cip necunoscută este un fenomen foarte rar, dar totuși se întâmplă ca un cip să-și fi șters semnătura. Semnătura, octeții de calibrare și alte date nu pot fi stocate imuabil în structura cipului, ele pot fi deteriorate (șterse) accidental dacă sursa de alimentare este instabilă în timpul procesului de programare. De obicei, în astfel de cazuri, valorile semnăturii rezultate sunt FF FF FF, dar cipul funcționează normal și memoria flash poate fi citită și scrisă. Dacă semnătura citită nu se potrivește cu niciuna dintre bazele de date a dispozitivului (inclusiv valorile FF FF FF și 00 00 00), atunci când acest jumper este pornit, dispozitivul va scrie o configurație universală de biți Fuse. O configurație universală înseamnă că ISP (porniți bitul SPIEN) și funcționalitatea Reset pin (dezactivați bitul RSTDISBL) ale microcontrolerului vor fi restabilite, opțiunile oscilatorului nu vor fi afectate. Cu astfel de acțiuni, microcontrolerul va putea restabili în continuare, dar folosind un programator SPI convențional.

Atenţie! Nu utilizați opțiunea „semnătură necunoscută” cu microcontrolerele ATtiny11 sau ATtiny15.

Aplicație:

  1. Fișiere de proiect (format Eagle 5.4.0), schema de circuit și desenul plăcii de circuit imprimat (pdf, png), fișier .hex și fișier .bin pentru programarea microcontrolerului - .
  2. Firmware actualizat pentru microcontroler (versiunea 2): cod sursă (BASCOM v.1.11.9.0), fișier .hex și fișier .bin pentru programarea microcontrolerului - .
  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva