Sei sulla pagina 1di 6

Regolazione luminosit / breathing LED PWM con Mosfet e PIC10F322

Autore: Giovanni Bernardo | Data pubblicazione: 10 ottobre 2012 Categorie: PICmicro 10/12/16 Progetti

In realt il termine breathing (respirare) che ho usato nel titolo non mi piaceva molto ma cos che viene indicato leffetto 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. Leffetto 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 nellarea 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, laletta 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 sullarea avanza ancora spazio (mi raccomando, montate il mosfet in maniera tale che poi sia agevole avvitarci unaletta 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 leffetto breathing led. In modalit manuale, invece, nellISR 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 #define MAXPWM 180 57 #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 laltra in modalit automatica, lho 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 dellHi-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 allarticolo precedente su di essa. nei commenti qualcuno ha indicato dove poterla ancora reperire dato che non pi in produzione. Vi chiedo come sempre di non utilizzare questo materiale o sue parti per ripubblicarlo su altri siti o riviste: non bello quando vedo i miei lavori su altri siti (di quartordine tra laltro) e la gente ( la gentaglia) li vanta come i propri solo perch lho migliorato cambiando il quarzo e aggiungendo una nuova funzione (totalmente inutile): non cos che un progetto il proprio progetto. E triste, meschino e mi fa passare la voglia di fare tutto. Se potete, supportate settorezero.com con una donazione (link a lato sopra ai siti amici) o con un progetto della sezione servizi o partecipando in maniera attiva. Controllo luminosit/breathing LED PWM con PIC10F322 (5.15 kB - 199 downloads)

Articoli che potrebbero interessarti


Demo PIC10F322 : PWM + ADC + Interrupt Timer0. Moduliamo lintensit luminosa con un trimmer Corso programmazione PICMicro in C Lezione 3 Il primo programma in C: scrivere un semplice programma in C per PICMicro, impostare MPLAB e flashare il PICMicro con il PICKit2. Facciamo lampeggiare un LED! [User Project] Portachiavi POV CENT4UR Driver di potenza per coppia di motori DC a spazzole. Esempio di pilotaggio con PICmicro ORbit16 Scheda di sviluppo per PICmicro a 16/32bit con USB OTG

L'articolo ti piaciuto o ti stato utile per risolvere un problema? SettoreZero realizzato soltanto contenuti originali: tutti gli articoli sono curati con passione dagli autori e nulla viene copiato da altri siti. Supporta e mantieni in vita SettoreZero con una donazione: basta soltanto un caff o una birra. Puoi supportare SettoreZero anche con uno dei progetti elencati nella sezione servizi o partecipare anche tu con un tuo articolo/progetto personale. Se desiderate che SettoreZero continui a rimanere gratuito e fruibile da tutti, non copiate il nostro materiale e segnalateci se qualcuno lo fa. Puoi andare alla fine dell'articolo e lasciare un commento. I trackback e i ping non sono attualmente consentiti.

Commenti (5) Trackbacks (0)

1. #1 da Marco_Fantini il 11 ottobre 2012 Buongiorno, Sono nuovo del forum. Ti faccio i miei sinceri complimenti (se posso darti del tu) per il sito. Girovagavo in rete e mi sono imbattuto in questo sito. Veramente ben fatto. Finalmente non la solita aria fritta. Si vede che ci che scritto prima pensato. Ciao Marco

#2 da Giovanni Bernardo il 16 ottobre 2012 Grazie. Figurati che un tizio mi consigliava di coltivare le patate.

2. #3 da neborkia il 18 ottobre 2012 Grazie mille per larticolo! Ho iniziato da poco con i PIC proprio leggendo il tuo corso! E una miniera dinformazioni utili, a seguirlo simpara tantissimo e molto velocemente!

3. #4 da digito il 23 ottobre 2012 Salve, volevo solo fare i miei complimenti non solo per questo progetto ma per tutti gli altri proposti, dalla semplicit .. la funzionalit, ribadisco elogi per Lei e per tutti quelli che contribuiscono in questo benedetto paese a dare un apporto vero e un impulso verso i giovani a credere che si pu; ma tutti assieme e non individualmente. Grazie e Distinti Saluti.

4. #5 da Fabri877 il 13 novembre 2012 Salve a tutti, sono molti anni che progetto e programmo i PIC in principio lo facevo per pura passione, i primi progetti erano con il 16c55 finestrato!!!!! figuratevi quanto sono anziano. E con l avvento della rete mi sono documentato un po in giro, ma vi giuro che un sito come il vostro non esiste. Complimenti a tutto lo staff e a Lei Giovanni per la semplicit nelle spiegazioni e nelle info dettagliate ed esempi sempre calzanti cos che si incentivano i giovani ad avvicinarsi a questo splendido mondo dei controllori. Grazie mille Devi essere collegato per lasciare un commento.