Atmega16 - pwm cu ajutorul t

Lucrarea descrie metode de pornire și de formare PWM (Pulse Width Modulation, sau PWM în rusă) în AVR microcontroler prin temporizator încorporat / counter T / C0, T / C1 și T / C2. PWM este utilizat pe scară largă pentru conversia digital-analogică, generarea de forme de undă arbitrare, regulament.

1. T / C0 este 8-octet, contorul propriu-zis este în registrul TCNT0. La depășire (tranziție 0xFF-> 0x00) poate fi generată o întrerupere TIMER0_OVF (Timp / Counter0 Overflow, flag TOV0). Această întrerupere este interzisă (mascată) de bitul TOIE0 (bitul 0 al registrului TIMSK). Steagul TOV0 este șters automat când se execută rutina de întrerupere.

2. Sunt definite trei valori speciale pentru contorul TCNT0, conform căruia pot apărea anumite evenimente:

BOTTOM == 0x00
MAX == 0xFF
TOP == MAX sau OCR0

3. TCNT0 poate conta atât în ​​sus (increment), cât și în jos (decrement). Acest lucru este determinat de modul de operare selectat.

4. Pentru TCNT0, sursa ceasului și frecvența sa sunt selectate de biții CS02: 0 (biți 0..2 ai registrului TCCR0). Puteți chiar interzice complet funcționarea TCNT0 (scrierea în CS02: 0 toate nivelele).

5. Există un registru pe 8 biți OCR0 - registrul comparatorului digital. În cazul în care TCNT0 == OCR0 se potrivește, parametrul de comparare a ieșirilor (OCF0) este setat și se poate genera întreruperea TIMER0_COMP (Comparare temporizator / Counter0). Steagul OCF0, ca de obicei, este șters automat când se execută rutina de întrerupere. Întreruperea TIMER0_COMP este interzisă (mascată) de bitul OCIE0 (bitul 1 al registrului TIMSK). În plus, acest eveniment poate genera un semnal PWM hardware pe pinul OC0 al procesorului (piciorul DIP40 4, portul PB3). Semnalul de comparare a cronometrului / contorului0 este folosit de generatorul de semnal PWM.

6. Tipul PWM este selectat prin biti Mod de generare a undelor - WGM01: 0 (biții 3 și 6 ai registrului TCCR0, respectiv). De asemenea, depinde de ele atunci când este setat stegul Timer / Counter Overflow (TOV0). O întrerupere TIMER0_OVF poate fi generată de acest steag. Există 4 moduri în total:

Setarea OC0 la compararea evenimentului la numărare, resetare la numărătoare în jos (PWM cu inversiune).

Modul diferă la jumătate din frecvența PWM, dar are o calitate superioară a generării de semnale, până la valorile limită ale OCR0 (0x00 și 0xFF). Modul este potrivit pentru controlul motorului. În acest mod, TCNT0 se numără mai întâi, ajunge la 0xFF, apoi începe să contorizeze, ajunge la 0x00, începe să numere și procesul se repetă. Timerul / contorul de depășire a contorului (TOV0) este setat de fiecare dată când TCNT0 ajunge la BOTTOM (0x00). Formula generală pentru calculul frecvenței PWM este:

fOC0PWM = fclk_IO / N * 510. unde N este egal cu factorul de divizare (factor prescale 1, 8, 64, 256 sau 1024).

14. Când se utilizează o frecvență internă de ceas de 1 MHz (valoarea implicită), frecvența maximă PWM în modul PWM rapid va fi egală cu
1000000/256 = 3906,25 Hz.

Această frecvență este potrivită pentru procesele care se schimbă lent. Dacă creșteți viteza ceasului la 8 MHz (pentru aceasta trebuie să scrieți siguranțele CKSEL3..0 în valoarea 0100), frecvența PWM va fi
8000000/256 = 31250 Hz

Această frecvență nu este audibilă de urechea umană și poate fi folosită pentru a genera sunete.

15. Exemplu de setare a PWM în modul PWM rapid:

După această ajustare, frecvența PWM la ieșire va fi de 3906,25 Hz, ciclul de funcționare a semnalului este de 50%.

1. Contor T / C1 diferă semnificativ de la T / C0 cel puțin faptul că un 16 biți, și are două registre și un comparator digitale OCR1A OCR1B și 2 hardware PWM de ieșire - OC1A și OC1B. și are 2 registre de control TCCR1A și TCCR1B.

2. Sunt definite trei valori speciale pentru contorul TCNT1, conform căruia pot apărea anumite evenimente:

BOTTOM == 0x0000
MAX == 0xFFFF
TOP == 0x00FF, 0x01FF, 0x03FF sau OCR1A sau ICR1

3. registre de 16 biți (TCNT1, OCR1A, OCR1B și ICR1) au nevoie de tehnici speciale de manipulare sunt citite și scrise, prin intermediul celor două operații de opt biți care implică registrul temporar de 8-biți (este comun pentru toate registrele de 16 biți ale timer-ul). Valoarea octetului de mare ordine este transferată prin acest registru intermediar, iar accesarea octetului inferior (separat pentru fiecare registru de 16 biți) declanșează executarea operației pe 16 biți. Nu toate registrele pe 16 biți utilizează un registru temporar pentru un octet de nivel ridicat, cum ar fi OCR1A și OCR1B.

Iată același exemplu cu interzicerea întreruperilor:

Dacă sunt înregistrate simultan mai multe registre de 16 biți cu același octet de nivel ridicat, octetul înalt poate fi scris numai o singură dată.

4. La fel ca în T / C0, stegurile de întrerupere (ICF1, OCF1A, OCF1B, TOV1) se află în registrul TIFR (Timer Interrupt Flag Register). La fel ca în T / C0, fiecare dintre întreruperi poate fi mascată prin Registrul de mascare a întreruperilor temporare (TIMSK), biții de mascare TICIE1. OCIE1A. OCIE1B. TOIE1.

5. Timpul T / C1 este același ca și pentru T / C0. Sursa ceasului este selectată de către registrul Registrului de înregistrare B al temporizatorului / contorului (TCCR1B).

Aproape tot ceea ce este scris despre T / C0 este valabil și pentru T / C2. deoarece acestea diferă doar prin faptul că T / C2 este prescaler mai detaliat la ceasul (biți funcționează diferit de biți de control prescaler CS22: 0 - Biți 2..3 TCCR2 registru), iar în cazul în care T / C0 ar putea fi cronometrat de un extern semnal pentru T0, piciorul 1, port PB0, apoi T / C2 poate fi tactat de un oscilator suplimentar de cuarț, așa-numitul Crystal de ceas extern 32 kHz. independent de ceasul principal (nu XTAL2 picior CONCLUZII. 12 și XTAL1 CONCLUZII. 13 și din portul TOSC2 picior 29 și PC7 picior de port TOSC1 PC 6 28).

Să presupunem că trebuie să generați un semnal pătrat de câțiva zeci de kilohertzi pentru a genera o tensiune negativă de alimentare a amplificatorului operațional. Frecvența nu este critică, ar trebui să fie în intervalul de 20..200 kHz. Operatorul de întrerupere nu este necesar, formarea meandrului ar trebui să aibă loc pur hardware, fără participarea procesorului. Iată pașii care trebuie urmați:

Pasul 1, frecvența de ceas a cronometrului. Este necesar să alegeți valoarea pentru biții pentru setarea prescalerului frecvenței ceasului. Acești biți sunt CS12, CS11, CS10, sunt în registrul TCCR1B. Alegerea se face pe baza frecvenței de ceas a microcontrolerului și a frecvenței PWM generate la ieșire. Adică, acești biți trebuie să selecteze aproximativ frecvența ceasului pentru cronometru. Iată un tabel al valorilor acestor biți și al factorilor de fisiune precursori.

Timer1 ca ceas va folosi semnalul extern aplicat piciorului T1. Contorul va conta fronturile jurnalului. nivel (tranziții de la 0 la 1).

În cazul nostru, frecvența ceasului este de 2 MHz, astfel încât să puteți selecta a treia linie din tabel pentru setarea bitului. Trebuie să setați bitul CS11, iar biți CS12 și CS10 trebuie resetați.

Notă: alegerea frecvenței ceasului în funcție de tabel este făcută ținând cont de frecvența cu care timerul va depăși. Frecvența de depășire a timerului, alta decât frecvența ceasului, depinde și de limita de numărare superioară selectată și de modul de numărare.

Pasul 2, intervalul contului. Selectați intervalul contului, adică, în ce măsură contorul va conta. Selectăm valorile pentru contorul 32, limita numărului va fi determinată de valoarea registrului ICR1. În acest caz, cronometrul va conta de la 0 la 31, iar aceste cicluri vor fi repetate la depășire cu o frecvență de 2 MHz / 32 = 62,5 kHz. Dacă selectați modul PWM Phase Correct, atunci frecvența la ieșirea OC1A va fi de 31.25 kHz, ceea ce este destul de potrivit.

Notă: pentru mai multe detalii despre limitele numărului Timer1, consultați [3], "BOTTOM, MAX, TOP: Valori limită de cont".

Pasul 3, setarea pragului de cont. Scrieți valoarea pragului în registrul OCR1A, la care contorul va schimba nivelul la ieșirea OC1A. Pentru a obține un meandru, acesta ar trebui să fie un număr de 16:

Pasul 4, cum să comutați ieșirea OC1A. Comportamentul ieșirii PWM OC1A depinde de modul PWM selectat și de starea bitului Modul de ieșire a rezultatelor. Acești biți sunt COM1A1 și COM1A0 în registrul TCCR1A. Tabelul de mai jos prezintă valorile biților pentru modurile de comparare a modului de ieșire, modul PWM corect pentru fază și modurile PWM corecte de fază și frecvență.

Notă (1): numele biților CTCn și PWMn1: 0 sunt depășite. În schimb, utilizați numele WGMn2: 0. Cu toate acestea, funcționalitatea și plasarea acestor biți este compatibilă cu versiunea anterioară a cronometrului.

În cazul nostru, vom selecta modul de fază și frecvență corectă (rândul din tabelul corespunzător modului 8), valoarea pentru biții WGM1n == 1000b. Pentru acest mod, trebuie să setați bitul WGM13 din registrul TCCR1B (bitul WGM12 va rămâne șters), biții WGM11 și WGM10 din registrul TCCR1A vor rămâne șterși.

Pasul 6, configurați portul de ieșire pentru ieșirea PWM. Pentru ca semnalul de ieșire OC1A să apară pe pinul piciorului microcontrolerului, trebuie să configurați portul PD5 ca ieșire (în mod implicit funcționează ca intrare):

Iată codul complet al procedurii în C, care face următoarele:

Notă: masca care intră în registru este generată de operația de schimbare spre stânga constantei numărului de biți. Deoarece biții pot fi împrăștiați în diferite registre, aveți grijă să activați atribuirea unei măști în registru. Prima atribuire trebuie efectuată prin operația =, această operație va reseta toți biții din registru care nu sunt setați în mască. Setările ulterioare de biți în acest registru prin mască ar trebui să se facă prin operația citire-scriere a operației, în acest caz | = (citire - operație OR - înregistrare). Fii atent!

Articole similare