Ministero dell’Istruzione dell’Università e della Ricerca
M048 – ESAME DI STATO DI ISTITUTO PROFESSIONALE
CORSO DI ORDINAMENTO
Indirizzo: TECNICO DELLE INDUSTRIE ELETTRONICHE N.O.
Tema di: SISTEMI AUTOMAZIONE E ORGANIZZAZIONE DELLA PRODUZIONE
In una azienda agricola si vuole automatizzare l’irrigazione di un terreno. A tale scopo in 8 punti sono stati installati, ad una certa profondità, altrettanti sensori di umidità che, dopo opportuno condizionamento, forniscono una tensione analogica compresa tra 0 volt per umidità pari al 5% e 5 volt per umidità pari al 40%. Il sistema acquisisce i dati dai sensori e ne calcola la media aritmetica. L’irrigazione viene avviata quando la media dei valori acquisiti scende sotto il 10% e disattivata dopo che il valore medio calcolato risulta pari o superiore al 25%. L’acqua necessaria viene addotta da un pozzo dotato di un sensore di livello di tipo ON/OFF che ne segnala la disponibilità. Nel caso in cui il livello d’acqua nel pozzo sia basso, essa può essere prelevata da un grosso serbatoio, il cui livello deve essere ripristinato dopo ogni uso, non appena se ne rilevi la disponibilità nel pozzo.
La gestione del sistema prevede anche la visualizzazione (su un monitor o altro) dei valori istantanei di umidità e della loro media.
Il candidato, formulate le ipotesi aggiuntive che ritiene necessarie e scelto un dispositivo programmabile di sua conoscenza:
1. Disegni uno schema a blocchi della catena di acquisizione e descriva la funzione di ciascun blocco.
2. Determini le caratteristiche elettriche di ciascun blocco in funzione dei segnali elettrici di ingresso uscita.
3. Progetti l’interfaccia di acquisizione con componenti di sua conoscenza.
4. Disegni la flow-chart del programma di gestione dell’intero sistema.
5. Codifichi in un linguaggio di sua conoscenza un segmento di programma.
Durata massima della prova: 6 ore.
È consentito soltanto l’uso di manuali tecnici e calcolatrici non programmabili
Non è consentito lasciare l’Istituto prima che siano trascorse 3 ore dalla dettatura del tema.
POSSIBILE SOLUZIONE
© by Vittorio Crapella
IPOTESI AGGIUNTIVE
Per la misura dell'umidità del terreno ipotizzo che il sensore, essendo interrato ad una certa profondità, sia formato da due elettrodi di acciaio inox posti ad una certa distanza tali da offrire 200 Ohm a 100 %RH (Relative humidity) e 20 Kohm a 1 %RH. Ipotizzo che il grosso serbatoio sia ad una altezza sufficiente per distribuire l'acqua per caduta naturale e che si utilizzi una elettrovalvola per l’apertura e chiusura della portata d'acqua per l'irrigazione. Per il prelievo dal pozzo, mediante pompa elettrica, o dal serbatoio avverrà attraverso deviata sulla sorgente in base alle disponibilità d'acqua. Intendo inoltre gestire le varie funzioni di controllo mediante un microcontrollore interfacciato ad un computer con comunicazione seriale per l'acquisizione dei dati da mettere a video e/o memorizzare su H.D.
Le elettrovalvole sono del tipo a tre fili un comune, un apri e un chiudi ed ognuna è equipaggiata di fine corsa per staccare l'alimentazione a 24Vcc quanto è tutta aperta o tutta chiusa.
Per quanto concerne il sensore di livello sia per il serbatoio che per il pozzo intendo utilizzare dei galleggianti di minima e massima on/off (contatto chiuso = on quando il livello è minimo e viceversa)
IMPIANTO GENERALE
SCHEMA A BLOCCHI
SENSORE
Il sensore si può rappresentare elettricamente con il seguente schema
Se si alimenta a 5V ne consegue che la Vout sarà 5 x R% / (R% + 4K) ma R% = 20KOhm / %RH pertanto al 5% di umidità relativa avremo R% = 20 / 5 = 4 KOhm e al 40% R% = 20 / 40 = 0,5 KOhm ne consegue che
Vout a 5% di umidità sarà = 5 x 4 K / 8 K =2,5 V
e al 40% di umidità sarà = 5 x 0,5 K / 4,5 K = 0,5555 V
Questa tensione andrà condizionata con adeguato circuito affinché al micro arrivi come voluto un segnale compreso tra 0 e 5V con umidità compresa tra 5% e 40%.
MULTIPLRXER
Per acquisire il segnale di ogni sensore utilizzando un solo circuito di condizionamento si è ritenuto di utilizzare un multiplexer analogico a 8 canali tipo il CD4051 comandato sugli address inputs direttamente dal micro tramite un contatore binario a 3 bit interno.
Schema di principio del multiplexer
Il contatore binario a 3 bit tramite un decoder da binario a 1 to 7 interno al 4051 abilita il passaggio di un ingresso per volta, tramite uno switch a mosfet, verso l'uscita comune che andrà al circuito di condizionamento.
CIRCUITO DI CONDIZIONAMENTO
Dovendo condizionare il segnale che va da 2,5V a 0,5555V in uno che va da 0V a 5V e necessario interporre un amplificatore differenziale invertente.
Tale amplificatore dovrà avere un guadagno di amplificazione
A = Vout / Vin Vout = 5 V e Vin = 2,5 - 0,5555 = 1,9444 V pertanto A = 5 / 1,9444 = 2,571
Imponendo R1= 10K ne consegue che R2 =25,71 K
Nello schema definitivo la R2 verrà sostituita da una R fissa da 10K in serie a un trimmer multigiri pure da 10K così da poter regolare in sede di taratura.
L'operazionale amplifica sempre la tensione differenza tra V+ e V- e più precisamente l'uscita si dovrà portare a quel valore che riportato in retroazione da R2 sul pin V- eguagli V+.
Nel caso di Vin = 2,5V è intuitivo che Vout deve andare a 0V (potenziale di massa) per eguagliare V+ e V- infatti solo in quelle condizioni V+ e V- provengono da due sorgenti identiche formate da due partitori uguali alimentati entrambi da 2,5V.
Nel caso di Vin = 0,5555V è intuitivo che V- tende ad essere meno di V+ fino a quando attraverso R2 riporto un valore di tensione sul V- pari a V+, ma affinché succeda questo Vout dovrà salire a +5V
Schema definitivo
La tensione di riferimento si ottiene con un LM336 nato per generare tensioni di riferimento del valore di 2,5V con ottima stabilità che migliora ai fini termici interponendo D1, D2 e il trimmer T2 che permette una precisa regolazione.
taratura:
Preregolare T1 e T2 a meta corsa, regolare T3 per avere Vref = 2,5V,
regolare T2 per V+ (pin 3 U1) di 1,7999 V
Con Vin = 2,5 V [ umidità 5% ] regolare T1 per Vout = 0V
Con Vin = 0,5555 V [ umidità 40% ] ritoccare T2 per Vout = 5V
Eventualmente ripetere le ultime due tarature per una più precisa e raffinata taratura.
ATTUATORI
Gli attuatori in questo caso sono semplicemente dei normali relè a 12Vcc comandati ognuno da un transistore pilotato da un'uscita del micro. Infatti utilizzando delle elettrovalvole a 3 fili on/off è sufficiente utilizzare un contatto a deviatore del relè per portare il positivo +24v o ad apri o chiudi dell'EV (Elettrovalvola).
Per la pompa pure si utilizza il contatto del relè per abilitare o meno l'alimentazione, in questo caso a 230Vac. In base alla potenza della pompa sarà opportuno valutare di interporre un opportuno teleruttore sulla linea Vac con protezione termica ed utilizzare il relè del nostro controllo per pilotare la bobina del teleruttore.
ACQUISIZIONE MEDIANTE ADC DEL MICRO
Il micro prepara il valore binario da inviare al CD4051 per abilitare il passaggio del segnale del primo sensore, legge il valore di tensione con l'ADC a 8 bit interno e ne salva il valore in una variabile a due byte e continua a leggere in successione gli ingressi per 256 volte.
Cosi facendo al termine delle 256 letture il byte più significativo è il valore mediato di tutte le letture.
Ne valuta il valore e se minore del 10% di umidità andrà ad aprire l'elettovalvola di irrigazione decidendo in base al livello del pozzo come orientare la valvola a 3 vie e se attinge dal pozzo azionerà pure la pompa.
Se la media e superiore 25% di umidità spegnerà la pompa e chiuderà l'elettrovalvola di irrigazione tenendo sotto controllo anche i vari livelli per garantire la scorta nel serbatoio.
Per una umidità del 10% il sensore offrirà una resistenza di R10% = 20K / 10 = 2 KOhm e darà una tensione Vout = 5 x 2 K / 6K = 1,6666V che dopo il condizionamento diventano
Vin ADC = A x (2.5V - 1,6666 ) =2,571 x 0,833 = 2,141 V che convertiti in numero dall'ADC diventa
Nr 10% = 2,141 / (5 / 256) = 109
Per una umidità del 25% il sensore offrirà una resistenza di R25% = 20K / 25 = 0,8 KOhm e darà una tensione Vout = 5 x 0,8 K / 4,8K = 0,8333 V che dopo il condizionamento diventano
Vin ADC = A x (2.5V - 0,8333 ) =2,571 x 1,666 = 4,283 V che convertiti in numero dall'ADC diventa
Nr 25% = 4,283 / (5 / 256) = 219
Pertanto se la media sarà inferiore a 109 andrà irrigato se maggiore o uguale a 219 andrà spento l'irrigazione.
FLOW-CHART
Vedi fondo pagina listato assembler ST6
SPIEGAZIONE FLOW-CHART
L'inizializzazione del micro consiste nella definizione delle port I/O, configurazione della porta seriale per la comunicazione con il PC, la definizione delle variabili da utilizzare come ad esempio FLAG che serve solo per ricordare se siamo nel caso di umidità rilevata mediamente sotto il 10% o uguale o superiore al 25%; oppure MIX che serve per generare i 3 bit da inviare al demultiplexer CD4051 per leggere un sensore alla volta od anche LSB e MSB che sono due variabili byte per sommare i valori letti durante il ciclo delle 256 conversioni con l'ADC (Analogic Digidital Converter).
A questo punto il micro indirizza il multiplexer con i 3 bit di MUX, verifica se ha superato l'indirizzo dell'ottavo ingresso in tal caso riparte con MUX=0 (primo ingresso), legge la tensione che arriva dal condizionamento all'ingresso dell'ADC lo somma nella variabile LSB (Leas Significate Byte) e tiene il riporto nella variabile MSB (Most Significate Byte) cosi all'uscita dalle 256 letture MSB sarà esattamente la media delle letture fatte.
Dopo la prima lettura incrementa la variabile contatore CONT= CONT+1 e se non sono 256 ripete la lettura di un successivo ingresso sino a completamento delle 256 letture.
Ne esce dal ciclo e mette in MEDIA il valore di MSB che invia poi anche al PC assieme anche alle indicazioni dello stato del pozzo e del serbatoio.
Si arriva ora al secondo flow-chart dove si esamina la situazione di FLAG che la prima volta sarà = a 0 e pertanto va ad esaminare se la MEDIA è minore di 109, se SI cambia stato al FLAG per ricordare che siamo in regime di irrigazione. Pertanto la EV a 3 vie (3 V) non dovrà essere attivata lasciando il suo relè disattivato e cioè permane aperta verso il prelievo dal POZZO e predispone l'apertura della EV di irrigazione (EV2) aperta attivando a livello alto l'uscita del micro tale da polarizzare il transistore che ecciterà il relè cosi da deviare il contatto su apri. Prima di attivare la pompa deve accertarsi se il pozzo ha un livello adeguato per poter prelevare acqua. Questo avviene leggendo lo stato di ingresso del micro collegato al galleggiante del pozzo, se il suo contatto è aperto allora è OK e attiva l'uscita del micro inerente il relè per l'abilitazione della pompa e in fine ritorna a inizio primo flow-chart per altro ciclo di acquisizione di dati di umidità e controllo.
Se invece il pozzo fosse sotto un livello sufficiente il galleggiante da uno stato chiuso e il micro disabilita eventualmente la pompa precedentemente attivata poi valuta se il serbatoio ha un livello adeguato per poter prelevare acqua. Se SI devia la EV 3 vie verso il serbatoio e prosegue con altre letture altrimenti se anche il serbatoio e sotto un livello minimo rimette la EV 3 vie sul pozzo e ritorna a inizio primo flow-chart per altro ciclo di acquisizione dati di umidità e controllo.
Invierà al PC nuova media e arriverà nuovamente ad inizio del 2° flow-chart dove valuta lo stato di FLAG che sarà 1 se la precedente media era sotto il valore 109 ed è nello stato di irrigazione, pertanto va a valutare se ha raggiunto o superato il 25% di umidità cioè MEDIA >= a 219 se NO torna al controllo del pozzo e del serbatoio come sopra descritto. Se invece arriverà all'umidità richiesta di fine irrigazione mette il FLAG a 0 per ricordare che non serve irrigare, ferma la pompa diseccitando il relè relativo e chiude la EV di irrigazione (EV 2). A questo punto dopo una irrigazione si deve controllare se il serbatoio ha il suo livello massimo di scorta oppure no, se è pieno allora ferma l'eventuale pompa accesa e chiude l'eventuale EV di riempimento serbatoio (EV 1) e ritorna a inizio primo flow-chart per altro ciclo di acquisizione di dati di umidità.
Se invece il serbatoio andava riempito va prima verificato le condizioni del pozzo e se c'è acqua allora predispone la EV 3 vie su pozzo, apre la EV di riempimento serbatoio (EV1) mediante l'attivazione del suo relè, attiva pure la pompa e ritorna a inizio primo flow-chart per altro ciclo di acquisizione dati di umidità. Se il pozzo non ha acqua anche se il serbatoio va riempito non si può fare altro che tornare all'acquisizione dati di umidità e controllo. Qualora le condizioni del pozzo lo consentiranno si procederà al riempimento ai prossimi controlli.
Essendo i motori delle elettrovalvole opportunamente demoltiplicati, con apposite riduzioni meccaniche per movimenti relativamente lenti, sono di bassa potenza e assorbono correnti dell'ordine dei 250 mA, pertanto ipotizzando anche tutte e tre le EV in movimento l'assorbimento totale sulla alimentazione dei 24V è inferiore ad 1A e pertanto gestibile da un regolatore LM317 regolato con R1 e R2 per una uscita appunto di 24V.
Infatti la sua Vout, trascurando l'irrisoria Iaj, è = 1,2V x (1+R2 / R1)
Vout = 1,2V x [1 + (2700+150) / 150] = 1,2 x (1 + 19) = 1,2 x 20 =24V
Gli altri 3 regolatori sono a tensione fissa della serie LM78xx abbondantemente sovradimensionati come corrente prelevabile considerato che reggono nominalmente 1A e che, sia il micro che l'operazionale consumano correnti esigue al massimo di qualche decina di mA, come pure i relè a 12V ipotizzandoli attivi tutti e 4 non superano i 150 / 160 mA.
Ne consegue che la corrente massima nelle peggiori condizioni di tutto attivo nello stesso momento non supera gli 0,9 A e in ogni caso le valvole nel giro di qualche decina di secondi tornano nello stato OFF, la potenza del trasformatore T1 può rimanere di circa 20 VA o massimo 25 VA. Il ponte di diodi basterebbe anche solo di 1A ma siccome la differenza di prezzo è minima conviene metterlo in grado di sopportare 2A.
Per la scelta dell'elettrolitico di livellamento è consuetudine usare almeno 2000 uF per ogni ampere d'uscita pertanto 2200 uF / 50VL è più che sufficiente, considerato poi che ci sono ancora pure i 220 uF su ogni ramo.
I condensatori da 100 nF sono dei ceramici e vanno messi nelle vicinanze dei terminali dei regolatori e servono ad evitare auto oscillazioni dei regolatori stessi che si ripercuoterebbero sulla stabilità delle tensioni d'uscita.
I diodi 1N4007 sono stati messi per evitare che la tensione sulle uscite possa diventare più alta di quella di ingresso (ipotesi per altro inconsueta ma possibile) il che potrebbe danneggiare i regolatori di tensione.
Il LED alimentato dalla tensione dopo il ponte di diodi, indica se acceso, la presenza di tensione anche se non da la certezza dell'esistenza delle giuste tensioni d'uscita ma è una spia che indica alimentatore acceso. La sua resistenza serie è stata dimensionata considerando che su C1, dove si preleva per l'alimentazione del led, ci sono 24Vac x 1,41 = circa 33V e considerando la caduta del led circa 2V con una corrente di circa 10 mA, ne restano circa 31V da far cadere sulla R in serie al led pertanto R=V/I = 31 / 10 mA = 3,1KOhm. Valore commerciale o 3,3K o 2,7K, si è optato per 2K7 considerato che la corrente diventa circa 11,5 mA.
CONSIDERAZIONI FINALI
Ai fini della sicurezza per le persone e le apparecchiature è d'obbligo prevedere una adeguata messa a terra di tutte le parti metalliche compreso tubi e serbatoio; ogni cavo da e per la centralina di controllo dovrà avere un filo di terra che si collegherà sui previsti morsetti delle elettrovalvole, pompa e galleggianti e nella centralina si uniranno verso il cavo del dispersore di terra.
LISTATO
;by Vittorio Crapella i2viu
.title "CONTROLLO UMIDITÀ" ; Titolo del programma
.vers "ST62E60" ; Microprocessore usato
.w_on ; Abilita la memoria a finestre
; 4 Mhz ; 26-06-2010
;----------------------------------------------
;| VARIABILI DEL MICROPROCESSORE |
.input "st626reg"
;----------------------------------------------
;| VARIABILI usate da questo PROGRAMMA |
;----------------------------------------------
flag .def 084h ;se 1= irrigazione se 0= non irriga
lsb .def 085h ;byte meno significativo per ricordare le letture dell'ADC
msb .def 086h ;byte più significativo che dopo 256 conversioni sarà la media
media .def 087h ;per tenere il valore medio della %RH
cont .def 088h ;per tenere il conteggio del numero di conversioni
mux .def 089h ;contatore binario a 3 bit per cd4051
;fino a 0bfh massimo
;*******************************
;*** Settaggio iniziale ***
;*******************************
.org 080h ; Significa: da qui in poi memorizziamo il programma nella memoria ROM
inizio ; Inizializzazione del micro
ldi wdog,0ffh ; Carico il Watch-Dog.
;*** Setta la porta A
ldi port_a,00000000b ; bir 0, 1 ,2 = output
ldi pdir_a,00000111b
ldi popt_a,00000111b
;*** Setta la porta B
ldi port_b,10000000b ;pb0 input galleggiante pozzo pb1 input gall. cisterna
ldi pdir_b,00011100b ;pb2 out POMPA =0 spenta =1 accesa
ldi popt_b,10011100b ;pb4 out EV 3 VIE =0 pozzo =1 serbatoio
;pb3 out EV serbatoio =0 chiusa =1 aperta
;pb5 out EV pozzo =0 chiusa =1 aperta
;pb7 input ADC
;*** Setta la porta C
ldi port_c,00000000b ;pc2 pc3 pc4 conf. per SPI seriale
ldi pdir_c,00000000b
ldi popt_c,00000000b ;
;*** Disabilita gli Interrupt che non servono
ldi adcr,0 ;disabilita A/D interrupt
ldi tscr,0 ;disabilita TIMER interrupt
ldi ior, 0 ;disabilita TUTTI gli interrupt
reti
jp main
tim_int reti
art_int reti
C_int reti
AB_int reti
nmi_int reti
;*************************************************
;*** SUBROUTINE ***
;**************************************************
RS232 ;sobrutine ;qui andrà scritto la parte per la comunicazione attraverso la porta SPI e il PC
ret
inadc ;sobrutine ;qui andrà scritto la parte per la conversione ADC lettura della tensione equivalente all'umidità
ret
;******************************************
;PROGRAMMA PRINCIPALE
;******************************************
MAIN ldi wdog,255
AZZERA clr cont ;azzera variabile CONT
clr flag
CLRLSB clr lsb ;prepara le variabili per memorizzare el 256 letture di umidità
clr msb
CLRMUX clr mux ;conterrà valore binario tra 0 e 7 per indirizzare CD4051
ld a,mux ;mette il valore di mux in a
ld port_a,a ;manda i bit al 4051
INCMUX inc mux ;mux=mux+1
ld a,mux
cpi a,8 ;verifica se ha indirizzato tutti i sette ingressi
jrz CLRMUX ;se siamo a 8 allora va ad azzerare e ricomincia
call inadc ;chiama la sobrutine per la gestione della lettura con ADC
add lsb,a ;somma a LSB il valore del registro a di ritorno dall'ADC
jrnc OLTRE ;se non c'è riporto va oltre
inc msb ;altrimenti incrementa MSB
OLTRE inc cont ;cont= cont +1 tiene conto del numero di letture fatte
ld a, cont ;mette il valore di cont nel registro a per valutare a che punto siamo
cpi a,0 ;se a=0 significa che abbiamo fatto 256 letture
jrz MEDIA_ ;se si va a prendere la media
jp INCMUX ;altrimenti ricomincia per altra lettura
MEDIA_ ld a,msb ;mette nel reg. a il valore della umidità media
call RS232 ;chiama la sobrutine per comunicare dati tra micro e PC
ld a,flag ;prende il valore del flag per valutare se 1 o 0 (irriga o no)
cpi a,0 ;se 0 va a verificare se la media è minore di 109
jrz VERI109 ;va verificare se 109
jp VERI219 ;altrimenti verifica se è 219
VERI109 ld a,msb ;riprende valore medio
cpi a,109 ;verifica se 109
jrnc VERSERB ;se non è minore salta
jp irriga ;altrimenti va a predisporre per l'irrigazione
VERSERB jrs 1,port_b,OKS ;se il bit 1 di port_b è 1 va a OKS (galleg. serbatoio aperto ok)
jrs 0,port_b,OKP ;se il bit 0 di port_b è 1 va a OKP (galleg. pozzo aperto acqua ok)
jp clrlsb ;ricomincia nuovo ciclo con 256 letture per nuova media
OKS res 2,port_b ;azzera bit 2 di port_b per tenere diseccitato relè pompa OFF
res 3,port_b ;azzera bit 3 di port_b per tenere chiuso EV serbatoio
jp CLRLSB ;ricomincia nuovo ciclo con 256 letture per nuova media
OKP res 4,port_b ;bit 4 a 0 per tenere la EV 3 VIE verso il pozzo
set 3,port_b ;bit 3 a 1 per aprire EV riempimento serbatoio
set 2,port_b ;bit 2 a 1 per eccitare relè pompa = accesa on
jp CLRLSB ;ricomincia nuovo ciclo con 256 letture per nuova media
IRRIGA ldi flag,1 ;flag=1 ricorda che si sta irrigando
res 4,port_b ;bit 4 a 0 per tenere la EV 3 VIE verso il pozzo
set 5,port_b ;bit 5 a 1 per aprire la EV di irrigazione
VERPOZ jrs 0,port_b,POMPON ;salto se il galleggiante è aperto = 1 pozzo con acqua
res 2,port_b ;azzera bit 2 di port_b per diseccitare relè pompa OFF spenta
jrs 1,port_b,SUSERB ;salto se il galleggiante è aperto = 1 serbatoio con acqua
res 4,port_b ;bit 4 a 0 per tenere la EV 3 VIE verso il pozzo
jp CLRLSB ;ricomincia nuovo ciclo con 256 letture per nuova media
POMPON set 2,port_b ;bit 2 a 1 per eccitare relè pompa = accesa on
jp clrlsb ;ricomincia nuovo ciclo con 256 letture per nuova media
SUSERB set 4,port_b ;bit 4 a 1 per girare la EV 3 VIE verso il serbatoio
jp CLRLSB ;ricomincia nuovo ciclo con 256 letture per nuova media
VERI219 ld a,msb ;prende media nel reg. a
cpi a,219
jrc VERPOZ ;salta se minore
clr flag ;se maggiore o = azzera flag per ricordare fine irrigazione
res 2,port_b ;azzera bit 2 di port_b per diseccitare relè pompa OFF spenta
res 5,port_b ;bit 5 a 0 per chiudere la EV di irrigazione
jp VERSERB
;**************************************
;*** VETTORI DI INTERRUPTS ***
;*************************************
.org 0ff0h
jp tim_int ;timer int e A/D int vector #4
jp art_int ;artimer int vector #3
jp C_int ;port C spi int vector #2
jp AB_int ;port A B int vector #1
.org 0ffch
jp nmi_int ;nmi int vector #0
jp inizio ;reset vector
end ; Fine del programma