- Pin PWM nel microcontrollore AVR Atmega16
- Cos'è un segnale PWM?
- Componenti richiesti
- Schema elettrico
- Programmazione di Atmega16 per PWM
Pulse Width Modulation (PWM) è una tecnica potente in cui l'ampiezza dell'impulso viene modificata mantenendo la frequenza costante. La tecnica è utilizzata oggi in molti sistemi di controllo. L'applicazione del PWM non è limitata e viene utilizzata in un'ampia gamma di applicazioni come il controllo della velocità del motore, la misurazione, il controllo della potenza e la comunicazione, ecc. Nella tecnica PWM, è possibile generare facilmente un segnale di uscita analogico utilizzando segnali digitali. Questo tutorial ti aiuterà a comprendere PWM, le sue terminologie e come possiamo implementarlo utilizzando un microcontrollore. In questo tutorial dimostreremo il PWM con il microcontrollore Atmega16 AVR variando l'intensità di un LED.
Per comprendere in dettaglio le basi del PWM, vai ai nostri tutorial precedenti su PWM con vari microcontrollori:
- Tutorial PWM ARM7-LPC2148: controllo della luminosità del LED
- Modulazione di larghezza di impulso (PWM) utilizzando MSP430G2: controllo della luminosità del LED
- Generazione di PWM utilizzando il microcontrollore PIC con MPLAB e XC8
- Modulazione di larghezza di impulso (PWM) in STM32F103C8: velocità di controllo della ventola CC
- Generazione di segnali PWM sui pin GPIO del microcontrollore PIC
- Tutorial PWM Raspberry Pi
Pin PWM nel microcontrollore AVR Atmega16
Atmega16 ha quattro pin PWM dedicati. Questi pin sono PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Inoltre Atmega16 ha due timer a 8 bit e un timer a 16 bit. Timer0 e Timer2 sono timer a 8 bit mentre Timer1 è timer a 16 bit. Per generare PWM dobbiamo avere una panoramica dei timer poiché i timer vengono utilizzati per generare PWM. Come sappiamo, la frequenza è il numero di cicli al secondo a cui viene eseguito il timer. Quindi la frequenza più alta ci darà un timer più veloce. Nella generazione di PWM, una frequenza PWM più veloce darà un controllo più preciso sull'uscita perché può rispondere più velocemente ai nuovi cicli di lavoro PWM.
In questo tutorial Atmega16 PWM useremo Timer2. Puoi scegliere qualsiasi ciclo di lavoro. Se non sai cos'è il ciclo di lavoro in PWM, discutiamo brevemente.
Cos'è un segnale PWM?
Pulse Width Modulation (PWM) è un segnale digitale più comunemente utilizzato nei circuiti di controllo. Il tempo durante il quale il segnale rimane alto è chiamato "tempo di accensione" e il tempo durante il quale il segnale rimane basso è chiamato "tempo di spegnimento". Esistono due parametri importanti per un PWM come discusso di seguito:
Ciclo di lavoro del PWM
La percentuale di tempo in cui il segnale PWM rimane ALTO (tempo di attivazione) viene chiamata duty cycle.
Come nel segnale a impulsi da 100 ms, se il segnale è ALTO per 50 ms e BASSO per 50 ms, significa che l'impulso era ALTO per metà tempo e BASSO per metà tempo. Quindi possiamo dire che il ciclo di lavoro è del 50%. Allo stesso modo, se l'impulso è nello stato ALTO di 25 ms e nello stato BASSO di 75 ms su 100 ms, il ciclo di lavoro sarebbe del 25%. Notare che calcoliamo solo la durata dello stato HIGH. Puoi fare riferimento all'immagine sottostante per una comprensione visiva. La formula per il ciclo di lavoro è quindi,
Ciclo di lavoro (%) = Tempo di accensione / (Tempo di accensione + Tempo di spegnimento)
Quindi, cambiando il ciclo di lavoro possiamo cambiare la larghezza del PWM con conseguente cambiamento della luminosità del LED. Avremo una demo sull'utilizzo di diversi duty cycle nel controllo della luminosità del LED. Guarda il video dimostrativo alla fine di questo tutorial.
Dopo aver selezionato il ciclo di lavoro, il passaggio successivo sarebbe la selezione della modalità PWM. La modalità PWM specifica che come si desidera che funzioni PWM. Esistono principalmente 3 tipi di modalità PWM. Questi sono i seguenti:
- PWM veloce
- PWM a correzione di fase
- PWM con correzione di fase e frequenza
Il PWM veloce viene utilizzato dove il cambio di fase non ha importanza. Utilizzando Fast PWM, possiamo produrre rapidamente i valori PWM. Il PWM veloce non può essere utilizzato dove il cambio di fase influisce sul funzionamento come il controllo del motore, quindi in tale applicazione vengono utilizzate altre modalità di PWM. Dal momento che controlleremo la luminosità del LED dove il cambio di fase non influirà molto, utilizzeremo la modalità PWM veloce.
Ora per generare PWM controlleremo il timer interno per contare e poi reimpostare a zero a un conteggio particolare, quindi il timer conterà e poi azzererà più e più volte. Questo imposta il periodo. Ora abbiamo la possibilità di controllare un impulso, attivando un impulso a un conteggio specifico nel timer mentre aumenta. Quando il contatore torna a 0, disattivare l'impulso. C'è molta flessibilità con questo perché puoi sempre accedere al conteggio del timer e fornire impulsi diversi con un singolo timer. Questo è ottimo quando vuoi controllare più LED contemporaneamente. Ora iniziamo ad interfacciare un LED con Atmega16 per PWM.
Controlla tutti i progetti relativi al PWM qui.
Componenti richiesti
- Atmega16 AVR Microcontroller IC
- Oscillatore in cristallo da 16 Mhz
- Due condensatori da 100 nF
- Due condensatori da 22pF
- Premi il bottone
- Cavi per ponticelli
- Breadboard
- USBASP v2.0
- 2 Led (qualsiasi colore)
Schema elettrico
Stiamo usando OC2 per PWM cioè Pin21 (PD7). Quindi collega un LED al pin PD7 di Atmega16.
Programmazione di Atmega16 per PWM
Di seguito viene fornito il programma completo. Masterizza il programma in Atmega16 usando JTAG e Atmel Studio e guarda l'effetto PWM sul LED. La sua luminosità aumenterà e diminuirà lentamente a causa del ciclo di lavoro variabile del PWM. Controlla il video fornito alla fine.
Inizia a programmare Atmega16 impostando Timer2 Register. I bit del registro Timer2 sono i seguenti e possiamo impostare o ripristinare i bit di conseguenza.
Ora discuteremo di tutti i bit di Timer2 in modo da poter ottenere il PWM desiderato utilizzando il programma scritto.
Ci sono principalmente quattro parti nel registro Timer2:
FOC2 (Force Output Compare for Timer2): Il bit FOC2 viene impostato quando i bit WGM specificano una modalità non PWM.
WGM2 (Wave Generation Mode for Timer2): questi bit controllano la sequenza di conteggio del contatore, la sorgente del valore massimo (TOP) del contatore e il tipo di generazione della forma d'onda da utilizzare.
COM2 (Compare Output Mode for Timer2): questi bit controllano il comportamento dell'uscita. La descrizione completa dei bit è spiegata di seguito.
TCCR2 - = (1 <
Impostare i bit WGM20 e WGM21 su ALTO per attivare la modalità veloce PWM. WGM sta per modalità di generazione della forma d'onda. I bit di selezione sono i seguenti.
WGM00 |
WGM01 |
Funzionamento in modalità Timer2 |
0 |
0 |
Modalità normale |
0 |
1 |
CTC (Clear Timer On Compare Match) |
1 |
0 |
PWM, correzione di fase |
1 |
1 |
Modalità PWM veloce |
Per maggiori dettagli sulla modalità di generazione delle forme d'onda, fare riferimento alla scheda tecnica ufficiale di Atmega16.
TCCR2 - = (1 <
Inoltre non abbiamo utilizzato alcun pre-ridimensionamento, quindi abbiamo impostato il registro della sorgente del clock come '001'.
I bit di selezione dell'orologio sono i seguenti:
CS22 |
CS21 |
CS20 |
Descrizione |
0 |
0 |
0 |
Nessuna sorgente di clock (timer / contatore fermi) |
0 |
0 |
1 |
clk T2S / (senza prescrizione) |
0 |
1 |
0 |
Clk T2S / 8 (da Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (da Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (da Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (da Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (da Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (da Prescaler) |
Anche OC2 viene cancellato durante il confronto impostando il bit COM21 come "1" e COM20 come "0".
Di seguito sono riportate le opzioni di selezione della modalità di confronto dell'uscita (COM) per la modalità PWM veloce:
COM21 |
COM21 |
Descrizione |
0 |
0 |
Normale funzionamento della porta, OC2 scollegato. |
0 |
1 |
Riservato |
1 |
0 |
Cancella OC2 su Confronta match, imposta OC2 su TOP |
1 |
1 |
Imposta OC2 sulla partita di confronto, cancella OC2 al TOP |
Aumenta il ciclo di lavoro dallo 0% al 100% in modo che la luminosità aumenti nel tempo. Prendi il valore da 0-255 e invialo al pin OCR2.
for (duty = 0; duty <255; duty ++) // 0 to max duty cycle { OCR2 = duty; // aumenta lentamente la luminosità del LED _delay_ms (10); }
Allo stesso modo, diminuire il ciclo di lavoro dal 100% allo 0% per diminuire gradualmente la luminosità del LED.
for (duty = 0; duty> 255; duty--) // duty cycle da max a 0 { OCR2 = duty; // diminuisce lentamente la luminosità del LED _delay_ms (10); }
Questo termina il nostro tutorial sull'uso di PWM in Atmega16 / 32.