Regolazione luminosita´ / breathing LED PWM con Mosfet e PIC10F322
In realtà il termine breathing (respirare) che ho usato nel titolo non mi piaceva molto ma è così che viene indicato l’effetto di “respirazione” tipico dei led di stato sui macbook della Apple (sleep mode): si tratta di una pulsazione eseguita in maniera graduale: si passa da uno stato di luminosità zero per poter giungere al massimo livello di luce per poter poi di nuovo scendere gradualmente e quindi ricominciare daccapo. L’effetto è sicuramente molto più interessante di un semplice lampeggiamento on/off.
Il circuito (oserei più dire il firmware) qui proposto fa uso della schedina di sviluppo basata sul PIC10F322 vista qualche tempo fa qui.
Vedete che nello schema ho cerchiato in verde le parti aggiunte nell’area di prototipazione della scehda.
Ho collegato questo circuito a delle strisce di led. I led vengono pilotati attraverso un MOSFET. Il mosfet che ho utilizzato è un BUZ91, ma potete usare un qualsiasi mosfet a canale N (o a canale P ma collegandolo in maniera inversa!) purchè la corrente di Drain massima (Id) sia in grado di alimentare il carico e la tensione di funzionamento di questo sia inferiore o uguale alla Vdss (Tensione Drain-Source). Nel mio caso, dovendo pilotare due strisce di led funzionanti a 12V e che hanno un assorbimento totale di 800mA, il BUZ91 è più che sufficiente dal momento che ha una corrente di Drain di 8A. Se siete più esigenti potete utilizzare, tanto per fare un altro esempio, un IRF540 (Id=33A e Vdss=100V). Ad ogni modo al massimo della luminosità, l’aletta del mio BUZ91 comunque scalda tantissimo tanto da non poterla toccare ed è necessario un dissipatore.
Il segnale PWM viene applicato al gate del mosfet a canale N attraverso una resistenza di basso valore (47Ω), il carico da pilotare viene quindi collegato tra tensione di alimentazione e drain (ricordo che se pilotate un motore, o un qualsiasi carico induttivo come un solenoide o un relè, è necessario mettere un diodo di ricircolo in antiparallelo).
Sulla scheda ho messo due screw-terminal in parallelo per facilitare il collegamento delle mie due strisce di led. Per fare in modo che il tutto sia alimentato con una singola tensione (12V, necessaria alla striscia di led), ho incluso anche uno stadio di alimentazione classico con un 7805 e sull’area avanza ancora spazio (mi raccomando, montate il mosfet in maniera tale che poi sia agevole avvitarci un’aletta di raffreddamento):
Il firmware, dicevo, fa uso del modulo PWM e vi sono due modalità di funzionamento, selezionabili tramite il pulsantino SW1:
- Modalità manuale (evidenziata dal led D1 spento) : il trimmer regola il duty cycle del pwm e quindi la luminosità dei led collegati al mosfet
- Modalità automatica (evidenziata dal led D2 acceso) : il duty cycle viene variato in maniera ciclica (da un valore minimo a uno massimo e viceversa) e il trimmer regola invece la velocità di lampeggiamento (ovvero il ritardo tra una variazione del duty cycle e la successiva)
Un video dovrebbe spiegare meglio la funzionalità del progetto che vi sto esponendo:
La regolazione del PWM viene eseguita dalla Interrupt Service Routine sull’ overflow del Timer0: ho impostato i registri per avere un interrupt ogni millisecondo circa. Qui vengono incrementati/decrementati i contatori e invertito flag di direzione che determinano insieme l’effetto breathing led. In modalità manuale, invece, nell’ISR viene soltanto impostato il valore di duty cycle determinato dal valore restituito dal modulo AD, fornito dalla posizione del trimmer.
Nel codice vengono eseguite 32 letture dal convertitore AD e quindi fatta la media tramite bitshift a destra di 6 posizioni (2^6=32), questo per avere una lettura più stabile del trimmer ed evitare quindi fastidiose fluttuazioni di luminosità in modalità manuale.
Se ancora non avete pratica con le operazioni di bitshift, leggete il mio articolo sugli operatori di scorrimento
Il senso della riga 119:
119 | pwmcounter=adman>>3; |
è questo: il valore della variabile adman (valore dal convertitore AD già mediato) viene shiftato a destra di 3 posizioni (ovvero diviso per 2^3=8) in maniera tale da portare i valori 0-255 a 0-31; tale valore viene quindi assegnato alla variabile pwmcounter che si occupa in pratica di generare il ritardo (espresso in millisecondi) tra un incremento/decremento del duty cycle e il successivo in modalità automatica: 255 per me era troppo e i led rimanevano accesi per troppo tempo.
La luminosità dei led collegati al mosfet, variando il duty cycle in maniera lineare, appare scorrere in maniera esponenziale (cioè quando la luminosità deve diminuire, sembra che lo faccia più velocemente di quando invece aumenta). Per poterla linearizzare, i ritardi dovrebbero essere diminuiti per valori “alti” di duty cycle e aumentati per valori bassi.
I due defines:
56 57 | #define MAXPWM 180 #define MINPWM 0 |
impostano i valori massimo e minimo del PWM (nel range 0-255), io ho messo 180 come valore massimo perchè dopo questo valore non noto un cambiamento di luminosità apprezzabile e i led rimanevano quindi accessi al massimo per troppo tempo rispetto a quanto rimangono spenti.
Il parametro:
60 | #define MINDELAY 1 |
invece determina il valore minimo di ritardo tra una variazione di duty cycle e l’altra in modalità automatica, l’ho impostato ad 1mS, in pratica mettendolo a zero, quando si gira il trimmer tutto al minimo, la velocità di lampeggiamento è talmente elevata che i led appaiono fissi, con 1mS lampeggiano abbastanza velocemente, per avere regolazioni più fini si dovrebbe diminuire il tempo di interrupt.
La memoria programma occupata è di circa il 64% con la versione LITE dell’Hi-Tech: questi PIC grandi come un chicco di riso continuano a stupirmi.
Download
Nel file zip è contenuto il sorgente in C per Hi-Tech C Compiler per la famiglia PIC10/12/16, il progetto MPLAB e il file HEX precompilato. Per ulteriori informazioni sulla scheda di sviluppo utilizzata fate riferimento all’articolo precedente su di essa. nei commenti qualcuno ha indicato dove poterla ancora reperire dato che non è più in produzione.
Controllo luminosità/breathing LED PWM con PIC10F322 (858 download)
Di seguito c’è il download del codice scritto dall’utente “Yoba”, descrizione nei commenti all’articolo.
Codice di Yoba - 6 Giugno 2014 (280 download)