In questo progetto utilizzeremo una delle funzionalità di ATmega32A per regolare la luminosità di 1 Watt LED. Il metodo utilizzato per regolare la velocità del LED è PWM (Pulse Width Modulation). Questo tutorial PWM del microcontrollore AVR spiega in dettaglio il concetto PWM e la generazione di PWM (puoi anche controllare questo semplice circuito generatore PWM). Considera un semplice circuito come mostrato in figura.
Ora, se l'interruttore nella figura sopra è chiuso continuamente per un periodo di tempo, la lampadina si accenderà continuamente durante quel periodo. Se l'interruttore viene chiuso per 8 ms e aperto per 2 ms in un ciclo di 10 ms, la lampadina si accenderà solo entro 8 ms. Ora il terminale medio su un periodo di 10 ms = tempo di accensione / (tempo di accensione + tempo di spegnimento), questo è chiamato ciclo di lavoro ed è dell'80% (8 / (8 + 2)), quindi la media la tensione di uscita sarà l'80% della tensione della batteria.
Nel secondo caso, l'interruttore è chiuso per 5 ms e aperto per 5 ms per un periodo di 10 ms, quindi la tensione media del terminale in uscita sarà il 50% della tensione della batteria. Dire se la tensione della batteria è 5 V e il ciclo di lavoro è del 50%, quindi la tensione media del terminale sarà 2,5 V.
Nel terzo caso il duty cycle è del 20% e la tensione media dei terminali è del 20% della tensione della batteria.
In ATMEGA32A abbiamo quattro canali PWM, ovvero OC0, OC1A, OC1B e OC2. Qui useremo il canale OC0 PWM per variare la luminosità del LED.
Componenti richiesti
Hardware:
Microcontrollore ATmega32
Alimentazione (5v)
Programmatore AVR-ISP
Condensatore 100uF, LED da 1 Watt
Transistor TIP127
Bottoni (2 pezzi)
Condensatore 100nF (104) (2 pezzi), Resistori da 100Ω e 1kΩ (2 pezzi).
Software:
Atmel studio 6.1
Progisp o magia flash
Schema del circuito e spiegazione del funzionamento
La figura sopra mostra lo schema del circuito del dimmer LED con microcontrollore AVR (puoi anche controllare questo semplice circuito dimmer LED).
In ATmega, per quattro canali PWM, abbiamo designato quattro pin. Possiamo solo prendere l'uscita PWM solo su questi pin. Dato che stiamo usando PWM0 dovremmo prendere il segnale PWM al pin OC0 (3 ° PIN PORTB). Come mostrato in figura stiamo collegando la base del transistor al pin OC0 per pilotare il LED di alimentazione. Qui un'altra cosa è su quattro canali PWM, due sono canali PWM a 8 bit. Utilizzeremo un canale PWM a 8 bit qui.
Un condensatore è collegato a ciascuno dei pulsanti per evitare rimbalzi. Ogni volta che viene premuto un pulsante ci sarà un po 'di rumore sul perno. Anche se questo rumore si stabilizza in millisecondi. Per un controller i picchi acuti prima della stabilizzazione agiscono come trigger. Questo effetto può essere eliminato dal software o dall'hardware, affinché il programma sia semplice. Stiamo usando il metodo hardware aggiungendo un condensatore antirimbalzo.
I condensatori annullano l'effetto del rimbalzo dei pulsanti.
In ATMEGA ci sono due modi per generare PWM, sono:
1. PWM corretto di fase
2. PWM veloce
Qui manterremo tutto semplice, quindi useremo il metodo FAST PWM per generare il segnale PWM.
Prima di scegliere la frequenza del PWM, questo dipende dall'applicazione di solito, per un LED qualsiasi frequenza maggiore di 50Hz andrebbe bene. Per questo motivo stiamo scegliendo il contatore di clock 1MHZ. Quindi non stiamo scegliendo prescalar. Un prescalar è un numero selezionato in modo da ottenere un contatore di clock inferiore. Ad esempio, se il clock dell'oscillatore è 8Mhz, possiamo scegliere un prescalar di '8' per ottenere un clock da 1MHz per il contatore. Il prescalar viene selezionato in base alla frequenza. Se vogliamo più impulsi di periodo di tempo, dobbiamo scegliere un prescalar più alto.
Ora per ottenere il FAST PWM di 50Hz dall'ATMEGA, dobbiamo abilitare i bit appropriati nel registro " TCCR0 ". Questo è l'unico registro di cui dobbiamo preoccuparci, per ottenere un PWM FAST a 8 bit.
Qui, 1. CS00, CS01, CS02 (GIALLO) - seleziona il prescalar per la scelta del counter clock. La tabella per il prescalar appropriato è mostrata nella tabella sottostante. Quindi per il prescaling (orologio dell'oscillatore = counter clock).
quindi CS00 = 1, gli altri due bit sono zero.
2. WGM01 e WGM00 vengono modificati per scegliere le modalità di generazione della forma d'onda, in base alla tabella seguente, per PWM veloce. Abbiamo WGM00 = 1 e WGM01 = 1;
3. Ora sappiamo che PWM è un segnale con diverso rapporto di servizio o diversi tempi di accensione e spegnimento. Finora abbiamo scelto frequenza e tipo di PWM. Il tema principale di questo progetto risiede in questa sezione. Per ottenere un rapporto di lavoro diverso, sceglieremo un valore compreso tra 0 e 255 (2 ^ 8 a causa di 8 bit). Supponiamo di scegliere un valore 180, poiché il contatore inizia a contare da 0 e raggiunge il valore 180, la risposta dell'uscita potrebbe essere attivata. Questo trigger può essere invertente o non invertente. Questo è l'output che può essere detto di tirare su quando si raggiunge il conteggio, oppure si può dire di abbassare quando si raggiunge il conteggio.
Questa selezione di pull up o down viene scelta dai bit CM00 e CM01.
Come mostrato nella tabella, affinché l'uscita vada in alto nel confronto e l'uscita rimarrà alta fino al valore massimo (come mostrato nella figura in basso). Dobbiamo scegliere la modalità di inversione per farlo, quindi COM00 = 1; COM01 = 1.
Come mostrato nella figura sottostante, OCR0 (Output Compare Register 0) è il byte che memorizza il valore scelto dall'utente. Quindi, se cambiamo OCR0 = 180, il controller attiva la modifica (alta) quando il contatore raggiunge 180 da 0.
Ora per variare la luminosità del LED dobbiamo cambiare il DUTY RATIO del segnale PWM. Per modificare il rapporto di servizio, è necessario modificare il valore OCR0. Quando modifichiamo questo valore di OCR0, il contatore impiega un tempo diverso per raggiungere l'OCR0. Quindi il controller aumenta l'uscita in momenti diversi.
Quindi per PWM di diversi cicli di lavoro, dobbiamo modificare il valore OCR0.
Nel circuito abbiamo due pulsanti. Un pulsante serve per aumentare il valore OCR0 e quindi il DUTY RATIO del segnale PWM, un altro serve per diminuire il valore OCR0 e quindi il DUTY RATIO del segnale PWM.