Relazione PDF (1.37Mb)

[email protected]
IrrigaPIC
Centralina a 8 uscite per irrigazione con valvole a 24V ac con programma
settimanale.
Lo scopo del progetto è la realizzazione di una centralina per il controllo di elettrovalvole in alternata per
l’irrigazione del giardino… uno dei requisiti è il costo contenuto.
Schema a blocchi
La presa “220 in” dotata di interruttore (recuperati da alimentatori ATX) alimenta il “trasformatore”
(recuperato da qualche apparecchiatura surplus) da cui si ottiene 12V DC non regolati. Il “Conv dc/dc”
converte i 12V DC in 5 Volt regolati, usati per alimentare “Main CPU” e “RTC”. Il modulo “RTC” ha una
batteria di backup (cella al litio recuperata da un pacco di batterie di un portatile) per mantenere data e ora
in caso di mancanza di alimentazione di rete. La “Scheda relè” utilizza l’alimentazione a 12 V. I relè utilizzati
sono 8 del tipo mini e 1 del tipo normale, utilizzato per comandare una presa con uscita 220V. In pratica
quando almeno una delle 8 uscite è attiva, c’è tensione di rete anche sulla presa comandata in modo da
poter attivare l’alimentatore a bassa tensione (24V ac) solo al momento del bisogno… oppure potrebbe
essere utilizzata per comandare una pompa per pescare l’acqua da utilizzare per irrigare…
Tra un evento (accensione o spegnimento) e l’altro “Main CPU” è posta in stato di SLEEP per ridurre il
consumo di corrente; viene risvegliata da 2 diversi interrupt legati alla batteria scarica e interrupt da parte
del modulo RTC (orario del programma impostato dall’utente)
[email protected]
Convertitore dc/dc
E’ utilizzato un MAX5035B di maxim-ic.com (ottenuto in campionatura gratuita) nel suo schema classico
indicato a pagina 1.
Il C di ingresso sono in realtà 3 : 100n,1u, 100u, l’induttore è 680uH (CoilCraft campionatura gratuita), il
CRef è 10n, il C di uscita 680u insieme a 100n.
Uno schema per la millefori potrebbe essere il seguente
C3 è in realtà l’induttore da 680uH. Ingresso in basso a destra, uscita (5V) in alto a sinistra.
[email protected]
Main CPU
La scheda principale contiene






Processore Pic 18F2550 (Xtal 8Mhz con PLL) (campionatura gratuita Microchip)
RTC I2C DS1337 (Xtal 32Khz) (campionatura gratuita Maxim-ic.com)
Interfaccia di debug USART
Batteria tampone
2 tasti (accesso USB / testo TEST)
2 LED (status / batteria)

I pin relativi alla PORTB (21-28) attivano i relè in miniatura.
Pinout della CPU
[email protected]
Funzionamento
Mancando completamente di display, l’impostazione iniziale della centralina viene fatta attraverso il
collegamento USB ad un PC tramite un apposito programma oppure sempre con lo stesso programma che
modifica il firmware prima della programmazione col PicKit (modalità USB).
All’accensione il firmware verifica la pressione dei tasti SUSB/SKEY entrando rispettivamente in modalità
USB o TEST; se nessuno dei tasti risulta premuto viene eseguito il programma principale: vengono letti data
e ora dal RTC, questi vengono confrontati con i dati presenti nell’EEPROM del PIC e alla presenza di eventi
per quell’ora (siano accensioni o spegnimento) verranno attivati o disattivati i relè corrispondenti.
Quindi viene letto l’evento successivo dalla EEPROM e impostato sul RTC l’ allarme la data a l’ora
dell’evento. A questo punto il PIC si pone in modalità SLEEP (con comparatori accesi) e verrà svegliato solo
da:


batteria tampone scarica (BATInt)
allarme timer (RTCInt)
Interrupt BATInt
Attiva il LED di segnalazione batteria scarica
La tensione di soglia di comparazione è generata usando il “COMPARATOR VOLTAGE REFERENCE
MODULE” (pag 281 del datasheet del P18F2550)
Interrupt RTCInt
Attiva il led di status, con un lampeggio rapido
Legge dalla EEPROM l’evento relativo alla data /ora di quel momento e attiva/disattiva i carichi.
Quindi legge l’evento successivo, spegne il LED di status, imposta nell’RTC il nuovo allarme e si pone
in SLEEP
Organizzazione memoria interna PIC
I 256 byte della EEPROM del PIC sono organizzati in 81 slot in grado di contenere eventi.
Un evento può essere un attivazione/disattivazione di un relè in un dato giorno/ora.
Un evento può accomunare più attivazioni/disattivazioni.
[email protected]
I primi 8 byte sono riservati e possono contenere ad esempio il salvataggio della data/ora in fase di cambio
batteria.
I byte dalla posizione 8 alla posizione 253 sono riservati agli slot di informazione eventi. Ogni slot occupa 3
byte, ed ogni byte è così composto:
Byte 1: B7..B5 => giorno della settimana, B4..B0 => orario.
Il giorno della settimana :
0: non impostato
1: Domenica
…
7: Sabato
Byte 2: minuti
Byte 3: attivazioni PORTB
Segnalazione stato led
I led, di norma spenti, sono di due tipi:
Led batteria (verde) indica batteria tampone scarica. Rimane acceso per ricordare di sostituire la batteria
interna
Led stato (rosso): può lampeggiare in 2 modi (corto per OK, lungo per Errore), oppure acceso Fisso (di
norma un problema)
[email protected]
All’avvio
Pressione SUSB : Led bat ON, Led Status ON => comunicazione USB HID Attivata
Pressione SKEY: Led Status ON (1 secondo), Lampeggio OK.
Poi il Led Status rimane acceso per 2 secondi per poi spegnersi e a questo punto
Se tasto SKEY è ancora premuto
Salva data e ora corrente, il dispositivo si mette in Stop (Led Status ON Fisso)
Se tasto SKEY non è più premuto
Si attiva la modalità di test che accende in sequenza gli 8 relè per 9 secondi ognuno;
durante il test il led status sarà accesso; terminato il testo un lampeggio, quindi il
dispositivo si mette in STOP accendendo il LED Status
Comunicazione USB
I comandi principali inviati nella comunicazione USB HID (report da 64 byte) sono
USB_FIRMWAREINFO : il dispositivo invia la versione del firmware (stringa di 29 byte) al USB HOST
USB_GETORA: il dispositivo legge l’RTC e invia data e ora al USB HOST (8 byte)
USB_LEGGISTATO: il dispositivo invia lo stato di alcune porte del PIC al USB HOST (6 byte)
USB_SETORA: l’USB HOST invia il nuovo orario da importare sul RTC (8 byte), vedi tracciato USB_GETORA
USB_SETPORTB: l’USB HOST invia il nuovo valore di PORTB (2 byte)
USB_RDRMEM: il dispositivo invia tutto il contenuto della EEPROM in blocchi da 64 byte.
USB_SCRMEM: l’USB HOST scrive 256 byte che andranno a sovrascrivere il contenuto della EEPROM
USB_DEBUG: il dispositivo legge il RTC e inizializza la gestione degli slot, leggendo il primo (5 byte)
USB_GETSLOTIDX: il dispositivo legge lo slot indicato alla posizione 1 del report HID, l’ora RTC e ne
restituisce il valore (8 byte)
[email protected]
Scheda relè
Questa parte del circuito è stata realizzata come scheda separata in modo da poterla configurare in modo
personalizzato. In figura sono rappresentati solo il relè numero 1 e il relè numero 8 , i rimanenti sono
collegati in modo analogo. Necessita di una alimentazione +12V DC (non stabilizzati). Per poter pilotare in
modo adeguato le bobine dei relè invece di usare transistor-resistenze-diodo si è fatto uso dell’integrato
ULN2803 (campionatura gratuita ti.com), tranne che per il relè delle presa comandata pilotano con un
normale transistor.
Porta di ULN2808 e pinout del componente:
Realizzazione su mille fori (progetto con lochMaster):
[email protected]
[email protected]
Uno sguardo al firmware
I sorgenti sono in C, il compilatore mikroC 8.2.0.
Le impostazioni del progetto configurano un quarzo da 8 MHz.
Per alimentare correttamente il PLL per l’USB (che accetta solo frequenze da 4Mhz) si deve dividere il
“primary oscillator” per 2 (PLL Prescaler), quindi dividere per 2 questi 96 MHz per ottenere i 48MHz del bus
USB (USBDIV=1). L’uscita del PLL viene usato anche per alimentare il primary clock, dividendo anch’esso per
2 (CPUDIV), ottenendo un clock da 48Mhz.
Visto il “massiccio” utilizzo dei comparatori, ecco di seguito la configurazione usata: servivano 2
comparatori indipendenti ma con un riferimento ad una tensione comune di soglia.
Perché i comparatori ? Perché sono in grado di risvegliare il PIC dalla modalità di SLEEP, stato in cui viene
posta la CPU tra un evento e l’altro.
E la tensione di soglia , quale utilizzare ?
Beh visto che un indicatore è la batteria scarica, potremmo usare un valore intorno ai 3V…
L’altro comparatore è usato “impropriamente” per leggere lo stato del PIN “INT” dell’RTC; questo pin è
tenuto a livello Alto dal RTC fino a quando non scatta un evento impostato che lo porta a livello basso; si
sarebbe potuto utilizzare un normale PIN di I/O con interrupt sul cambio di stato, ma avendo già impostato
1 comparatore, anche l’altro, con le stesse modalità, può essere utilizzato senza troppi problemi.
Il registro principale è il CMCON
[email protected]
È stato configurato in questo modo:
CMCON=0b00000110;
bit 7 C2OUT: Comparator 2 Output bit
0 = C2 VIN+ < C2 VINbit 6 C1OUT: Comparator 1 Output bit
0 = C1 VIN+ < C1 VINbit 5 C2INV: Comparator 2 Output Inversion bit
0 = C2 output not inverted
bit 4 C1INV: Comparator 1 Output Inversion bit
0 = C2 output not inverted
bit 3 CIS: Comparator Input Switch bit
Per impostare la tensione di soglia si utilizza il “Comparator Voltage Reference Module” disponibile su
diversi PIC. In pratica è una rete di 16 resistenze che dividono il valore della tensione di alimentazione in
una tensione che può essere usata come riferimento per il comparatori interni e/o portata sull’uscita del
pin dedicato.
Il registro che controlla il tutto è il
E in questo progetto è configurato in questo modo
CVRCON = 0b11001000;
bit 7 CVREN: Comparator Voltage Reference Enable bit
1 = CVREF circuit powered on
bit 6 CVROE: Comparator VREF Output Enable bit(1)
1 = CVREF voltage level is also output on the RA2/AN2/VREF-/CVREF pin
bit 5 CVRR: Comparator VREF Range Selection bit
0 = 0.25 CVRSRC to 0.75 CVRSRC, with CVRSRC/32 step size (high range)
bit 4 CVRSS: Comparator VREF Source Selection bit
0 = Comparator reference source, CVRSRC = VDD – VSS
bit 3-0 CVR3:CVR0: Comparator VREF Value Selection bits (0 ≤ (CVR3:CVR0) ≤ 15)
[email protected]
When CVRR = 0:
CVREF = (CVRSRC/4) + ((CVR3:CVR0)/32) • (CVRSRC)
(5/4) + ((8/32) * 5)=1.25 + 1.25 = 2.5V
Quindi la tensione di riferimento per i comparatori e disponibile come Test Point su RA2 è di circa 2.5V
(ovviamente dipende dalla tensione di alimentazione).
Interrupt
Per la gestione degli interrupt si devono abilitare dal registro INTCON
GIE=> Global Interrupt Enable bit
PEIE=> Peripheral Interrupt Enable bit
E dal registro PIE2 (contain the individual enable bits for the peripheral interrupts.)
CMIE=>Comparator Interrupt Enable bit
Nella routine di gestione si dovrà poi resettare il bit PIR2.CMIF
La gestione del RTC è piuttosto semplice ed è inclusa nel file ds1337_stuff.c, le funzioni principali
implementate sono le seguenti
DS_NOW(void);
DS_setOrario(unsigned short hh, unsigned short mm,unsigned short ss);
DS_setData(unsigned short dd,unsigned short gg,unsigned short mm, unsigned short aa);
DS_setAllarme(unsigned short hh, unsigned short mm,unsigned short dd);
DS_getAllarme(void);
DS_clearAllarme();
Per semplificare la lettura dei dati dalla eeprom del PIC è stata create una libreria apposita (EEprom_stuff.c)
che simula una lista
void EE_Reset();
unsigned short EE_Eos();
void EE_Open();
void EE_READSlot();
void EE_moveNext();
void EE_moveFirst();
void EE_moveLast();
void EE_moveTo(unsigned short indexBaseZero);
Conclusione
La centralina è stata provata tutto il mese natalizio per accendere le lucine sul mio balcone.. e non è
esplosa! Dal punto di vista elettronico non è una gran complessità, e sono per la maggior parte componenti
reperibili in campionatura gratuita o dal basso costo e quindi le premesse iniziali non sono state disattese…
costa molto di più il contenitore (scatola di derivazione per impianti elettrici).
Samples
PIC18F2550
PIC
DS1337
I²C Serial Real-Time Clock
MAX5035B
1A Step-Down DC/DC Conv.
ULN2803
Octal darlington transistor array
T81H5D312-05 5V PCB relay
RTH14012
12V Power PCB relay
DR0810-684L 680uH Coil
[email protected] Transformer
www.microchip.com
www.maximintegrated.com
www.maximintegrated.com
www.ti.com
www.te.com
www.te.com
www.coilcraft.com
www.te.com
[email protected]
Schema realizzazione scheda CPU