Tema n° 2
SCHEMA A BLOCCHI
12V 5V
ALIM. clock 12V
Interf.
di Valv1
Potenza
Trasd.
Condiz.
di μC
Temp.
Interf.
Sensore di di Valv4
livello Potenza
Alimentazione:
Ipotizzando di avere una alimentazione generale a 12 V (utile anche per le elettrovalvole) la sez. di
ALIM. Sarà composta da un semplice regolatore di tensione 7805 che fornisce una uscita stabile a 5
Volt. L’alimentazione a 12 sarà utilizzata anche per la sezione di condizionamento del segnale
proveniente dal trasduttore.
R
Vt +
R +
–
2,73V –
R
R1 R2
R
5V
+
2,73V
–
R2
Affinché il guadagno del secondo stadio sia 10 è necessario che G = 1 + = 10 da cui otteniamo
R1
R2=9KΩ (ottenibile con la serie di 2,2KΩ e 6,8KΩ) e R1=1KΩ. Non si è ritenuto necessario
inserire un filtro passa basso perché l’operazione di media delle temperature costituisce di fatto un
filtraggio numerico passa basso.
Programma di gestione:
Prima di presentare il diagramma di flusso alcune considerazioni.
Il programma deve dalle 7.00 alle 19.00 acquisire la temperatura ed effettuarne la media, non è
quindi necessario salvare i singoli valori, ogni dato verrà sommato in un'unica variabile (su due
celle a 8 bit MEDIAH e MEDIAL). In questa fase viene anche controllato il livello, se la linea viene
trovata a 0 (livello inferiore a 2m) si attenderà la giornata successiva e per quella giornata non si
effettuerà irrigazione (è plausibile pensare che il pozzo sia naturale e quindi che si possa riempire
solo in tempi medio lunghi)
Alle 19.00 viene eseguita la media della temperatura: se inferiore a 15 non si avrà irrigazione (si
aspetteranno ancora le 7.00). La temperatura determina il contenuto di una variabile indice che
indirizza una tabella (di seguito) che contiene il tempo di irrigazione delle diverse zone.
Ind 1 2 3 4 5 6 7 8 9 10 11 12
min. 20 26 30 30 39 45 30 39 45 40 52 60
Se la temp è compresa tra 15° e 25° l’indice relativo è 1 e i tempi saranno relativi alla cella 1, 4, 7,
10. Indirizzando la tabella con i per la zona 1, i+3 per la 2, i+6 per la terza e i+9 per la quarta
determino senza ulteriori controlli il tempo corretto di irrigazione (si noti in questo modo che i
tempi sono facilmente modificabili modificando la tabella).
La gestione dell’orologio viene fatta in interrupt di timer. Si imposta in modo che scateni interrupt
ogni secondo, ad es. Timer a 16 bit, tempo di ciclo 1µs, prescaler 64 e timer precaricato a 15625
(contando in up va messo a 49911= 65536-15625).
FLOW CHART
START
ORA=STEP
?
S
STEP=7
ORA<20 S
? V1,2,3,4 <= OFF
S ORA=20? S
START CONV A/D
V1 <= ON
Fine.conv.? S
LIV=0?
Somma a 16 S
bit
MEDIA=MEDIA+ADRES
MIN=TAB(I)
?
STEP=STEP+1 ORA=19?
S
S V1 <= OFF
MEDIA=MEDIA/13
STEP=STEP+1
TM=MEDIA·50/255 S
ORA=21?
S S
STEP=STEP+1 LIV=0?
I=1 TM>25
S
MIN=TAB(I+3)
I=2 TM>30 ?
S
S V2 <= OFF
I=2
STEP=STEP+1
VEDI PAG.
SEGUENTE
FLOW CHART 2° PARTE
vai a inizio
CONTINUA vai a spegni
valvole
ORA=22? S
V3 <= ON
INTERRUPT S
LIV=0?
TIMER
SEC=SEC+1 S
V3 <= OFF
SEC=60? STEP=STEP+1
V4<= ON
S
SEC=0 LIV=0?
MIN=MIN+1
MIN=TAB(I+9)?
MIN=60?
S
V4 <= OFF
MIN=0
STEP=7
ORA=ORA+1
ORA=24?
ORA=0
RITORNA
Si noti che la variabile step contiene l’ora della prossima operazione, e che la stessa variabile viene
caricata a 7 quando il livello scende sotto i due metri (spegnendo contestualmente le due valvole). In
questo caso infatti l’irrigazione va interrotta e si attende la giornata seguente (durante la quale verrà
nuovamente controllato il livello). Si osservi inoltre che durante la fase di setup viene caricata la tabella
dei tempi precedentemente riportata.
CODIFICA
Segue la codifica in assembler per PIC 16F87x della porzione di programma che esegue la divisione
per 13 e la successiva moltiplicazione per 10 e divisione per 51 (equivalente all’operazione
TM=MEDIA*50/255)
Si utilizza una routine DIVIDI che divide il valore 16 bit contenuto in MEDIAH e MEDIAL per il
valore contenuto nel working e mette il risultato nella variabile RIS.
La divisione viene eseguita per sottrazioni successive e ignorando il resto, mentre la moltiplicazione
viene operata con il metodo delle somme successive.
MOVLW 13d
CALL DIVIDI ; chiama la routine che divide mediah-medial per 13
MOVF RISUL,W ; mette il risultato in medial
MOVWF MEDIAL
MOVLW 9d ; carica nella variabile ind 9 (per la moltiplicaz. Per 10)
MOVWF IND
MOVF MEDIAL ; mette medial nel working
Ciclo
ADDWF MEDIAL,F ; medial=medial+w
BTFSC STATUS,C
INCF MEDIAH ; se c’è stato carry incrementa mediah
DECFSZ INDEX
GOTO Ciclo
MOVLW 51d
CALL DIVIDI ; con la routine divide mediah-medial per 51
MOVF RIS
MOVWF TM ; copia il risultato in TM
DIVIDI
CLRF RIS ; azzera risultato
Loop
SUBWF MEDIAL,F ; medial=medial-w
BTFSC STATUS,C ; se c’e prestito (medial<w) salta la prox. Istruz
GOTO INCREM ; vai a INCREM
DECFSZ MEDIAH ; decrementa mediah e se a zero salta prox. Istruz
GOTO INCREM ;
INCF RIS ; se mediah è zero salta la prox. Istruz vai a INCREM
Loop1
SUBWF MEDIAL,F ; medial=medial-w
BTFSS STATUS,C ; se c’e prestito (medial<w) salta la prox. Istruz
GOTO FINE ; vai a INCREM
INCF RIS
GOTO LOOP ; ritorna dalla subroutine
INCREM
INCF RIS
GOTO LOOP
FINE
RETURN