Creative Commons BY-NC-ND 2.5Questo sito e tutto il suo contenuto sono distribuiti sotto la licenza Creative Commons Attribuzione - Non Commerciale - Non opere derivate 2.5 Italia e con le condizioni d'uso definite nel disclaimer: siete pregati di leggere entrambi questi documenti prima di usufruire dei contenuti di questo sito. Per alcuni contenuti è necessaria una registrazione gratuita: non è necessario pagare e non è necessario accumulare punteggi per accedere agli articoli e scaricare i sorgenti. Basta solo essere onesti. Se volete che questo sito continui a rimanere attivo, a contribuire ogni giorno alla diffusione della cultura libera, non copiate il materiale per ripubblicarlo in altri luoghi : chi fa questo è solo un miserabile e un perdente. Se volete partecipare su settorezero e rendere le vostre idee, i vostri progetti, fruibili da tutti senza limitazioni, come dovrebbe essere in un paese civile e acculturato, potete farlo tranquillamente.

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 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.

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 quart’ordine tra l’altro) e la gente (la gentaglia) li vanta come i propri solo perchè “l’ho 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.

PDFControllo luminosità/breathing LED PWM con PIC10F322 (5.15 kB - 237 downloads)

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.

  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. #3 da neborkia il 18 ottobre 2012

    Grazie mille per l’articolo! Ho iniziato da poco con i PIC proprio leggendo il tuo corso! E’ una miniera d’informazioni utili, a seguirlo s’impara 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.

  1. Ancora nessun trackback
settorezero.com e il logo Zroid™ ©2007÷2013 Giovanni Bernardo - E' vietata la copia e la distribuzione anche parziale dei contenuti di questo sito web senza l'esplicito consenso dell'autore.
I contenuti di settorezero.com sono distribuiti sotto una licenza Creative Commons Attribuzione-Non Commerciale-Non Opere derivate 2.5 Italia a cui vanno aggiunte le condizioni d'uso definite nel disclaimer.
settorezero.com e tutti i suoi contenuti sono tutelati dalla legge sul diritto d'autore per cui i trasgressori sono perseguibili a norma di legge.
Creative Commons BY-NC-ND 2.5
Il tema di questo sito è basato sul tema Fusion per wordpress, realizzato originariamente da digitalnature e fa uso del plugin Wassup per il computo delle statistiche. Per contattare l'autore siete pregati di utilizzare la sezione contatti.
Per essere aggiornato con tutte le novità di settorezero.com seguici anche anche su Facebook Twitter Tumblr Blogspot Youtube.