venerdì 2 gennaio 2015

Luci tremolanti con il PIC16F84

Recuperiamo dal cassetto il buon vecchio 16F84A (o 16F84) e utilizziamolo magari per aggiungere alle luci del nostro presepio un realistico effetto torcia o fiaccola: tremolante appunto.

In questo post si affrontano diversi argomenti utili anche come base per ulteriori sviluppi:
  • generare 8 segnali PWM via software
  • generare numeri casuali in asm
  • polarizzare correttamente un transistor utilizzato come interruttore

Materiale necessario:
  • PIC18F84A o in alternativa il PIC16F84
  • quarzo da 4 MHZ
  • resistenze e condensatori qb
  • otto NPN BC337 o similari
  • lampadine a filamento da 5/6 volt (recuperate magari da vecchie catene luminose)

ATTENZIONE: nel caso si voglia utilizzare dei diodi LED al posto delle lampadine a filamento si dovrà limitare la corrente inserendo, per ogni NPN, una resistenza tra il collettore e il LED.
Pilotare dei diodi LED tramite il circuito qui realizzato comporta la loro immediata distruzione in quanto la corrente di collettore non è affatto limitata.
Ovviamente tutti i calcoli sotto riportati andranno rifatti in relazione alla diversa corrente erogata.

Nota: sarà necessario modificare il tipo di pic nelle proprietà del progetto e le dichiarazioni in testa al main.asm se si vuole programmare con successo il vetusto PIC16F84 (quello senza la A finale); il codice invece funzionerà senza problemi e senza bisogno di modifiche per entrambi i modelli.

Schema elettrico

La sezione logica mostra le connessioni del PIC con le otto uscite PWM e le linee riservate alla programmazione (MCLR/VPP, PGD, PGC):


La sezione di potenza mostra un singolo canale PWM; gli altri sono identici:



Scelta del transistor NPN

La scelta è guidata principalmente dalla corrente assorbita dalla lampadina a filamento.
Per determinarla alimentiamola a 5 volt e in serie colleghiamo l'amperometro del nostro multimetro o tester impostandolo sulla scala più alta: 200 mA dovrebbe garantirci di non fare danni...

Nota: misurare con il tester la resistenza della lampadina non serve a nulla in quanto "a freddo" il valore è notevolmente più basso (anche di 20 volte) rispetto a quando il filamento è incandescente.

Nel mio caso ho verificato che le mie lampadine, alimentate a 5 volt, assorbono circa 90 mA.
Sceglierei quindi un transistor NPN che sopporti almeno il doppio della corrente richiesta: nel mio caso andrebbe bene anche un 200mA (2N3904 o similari).

Avendo nel cassetto numerosi BC337-25 ho verificato dal loro datasheet che questi sopportano fino a 800 mA (Ic o corrente di collettore): più che bene per pilotare una sola luce per canale.

Nota: ho scelto di alimentare le lampadine a 5 volt per non complicare il progetto e soprattutto perchè dispongo di un trasformatore che mi eroga 5 volt a 2 ampere ben livellati; adattate ovviamente il circuito alle vostre esigenze aggiungendo eventualmente la sezione di alimentazione per il PIC separata da quella per le lampadine.



Pilotare correttamente i transistor NPN come interruttori

La scelta della valore corretto della resistenza da applicare alla base del transistor è fondamentale per fare in modo di spremere tutti i mA necessari ed ottenere così la massima luminosità delle nostre lampadine.
Dobbiamo in pratica far scorrere la giusta corrente di base ( Ib ) in modo da saturare il transistor ( Ib(sat) ) ed ottenere la massima corrente di collettore ( Ic ) cioè nel mio caso 90 mA.

Per determinare quindi la Ib(min) ci servono poche informazioni:
  • conoscere la hFE del transistor (o anche βdc cioè il rapporto tra Ic e Ib o guadagno in continua)
  • sapere che la corrente di saturazione Ib(sat) = Ic / hFE
  • la legge di Ohm: R = V/I
  • sapere che la caduta di tensione tra base e emettitore è di 0,7 volt (per tutti i transistor a giunzione bipolare o BJT)

Il parametro più incerto è la hFE che può variare, anche per lo stesso modello, sia per ragioni tecniche di produzione e sia in funzione della temperatura di esercizio.
Dal datashhet del BC337-25 leggo che la hFE va da un minimo di 160 ad un massimo di 400; suggerisco di utilizzare in questo caso il valore inferiore: 160

La Ic che vorrei è di 90mA e quindi sapendo che Ib(sat) = Ic / hFE avrò che Ib(sat) =  90mA / 160 = 0,090A / 160 = 0,00056 A (5,6 uA).

Aumentiamo la Ib(sat) di un 20% in modo da compensare le varie tolleranze in gioco: Ib(sat) = 6,3uA

La Rb è quindi = VBB - 0,7 / Ib(sat) = 5volt - 0,7volt / 6,3uA = 4,3volt / 0,00063A = 6825 Ohm che arrotondata ai valori standard fa 6,8 K.



Mano al codice ASM 

Il progetto MPASM-X lo trovate qui: https://sourceforge.net/p/padnest/svn/HEAD/tree/pic16f/pic16f_flickering_lights.X

Premetto subito che questa è solo una base di partenza personalizzabile a piacere per quanto concerne i tempi di lampeggio e quindi l'effetto finale.
Ogni canale PWM genererà un proprio livello di luminosità in modo indipendente dagli altri.

I sorgenti si dividono in tre parti:
  • main.asm: la parte principale che include tutte le altre
  • macros.inc: alcune macro di utilità riprese da quelle scritte per il 18F
  • interrupts.inc: la parte di gestione degli interrupt
  • subs.inc: la parte con le sub routine utilizzate dal main

Il codice è ben commentato in ogni sua parte e non sarà difficile modificarlo a piacimento.
Ricordiamoci solo che, a differenza dei 18F, i 16F sono molto diversi in termini di organizzazione della memoria e di tipo e di numero di istruzioni a nostra disposizione.


Realizzazione pratica

Ecco la BB di sviluppo con 3 canali PWM di prova.


Dettaglio della schedina di sviluppo per il 16F84 realizzata molto tempo fa!


Dettaglio della sezione di potenza.

Risultato

Ecco il risultato finale...








Stay tuned!
ap

NB: l'autore non risponde di eventuali danni causati da omissioni, inesattezze o errori eventualmente presenti nell'articolo pubblicato.
Prego, segnalare suggerimenti e migliorie commentando questo post o inviando una email a padnest@gmail.com.

Nessun commento :

Posta un commento