Misura °C - ST6
© by Vittorio Crapella - i2viu
MISURAZIONE DELLA TEMPERATURA
Si intende misurare la temperatura di un locale e visualizzare il suo valore su un display a tre cifre con la precisione di ± 0,2 ° C.
Il sensore è un integrato tipo LM35 che alla sua uscita dà 10 mV/ ° C.
Si ipotizza che la temperatura possa variare tra il minimo di 0 ° C e 51 ° C.
Il diplay si trova distante dal punto della misura e pertanto si vuole utilizzare una trasmissione, via doppino telefonico, di dati digitali seriali contenenti il valore numerico della temperatura.
Si utilizza un micro controllore ST6210.
SCHEMA A BLOCCHI
La sonda LM35 dà 10 mV / ° C pertanto a 51 ° C avremo una tensione di 510 mV.
Per sfruttare tutta l’escursione dell’ADC cioè da 0 a 5 V per avere una conversione con un numero compreso tra 0 e 255, dovrò amplificare il segnale della sonda di :
A = 5 : 0,51 = 9,804
così da avere a 51 ° C un byte di conversione contenente 255.
Se trasmetto tale byte in forma seriale e lo ricostruisco in sede di ricezione, basterà dividerlo per il fattore 5 così da ottenere :
255 : 5 = 51 con resto 0 51 : 10 = 5 con resto 1
se invio al diplay in maniera multiplexata il primo resto = 0 per i decimi , secondo resto = 1 per le unità e il risultato = 5 per le decine di gradi, sul display apparirà 51.0 ° C.
Altro esempio :
Supponiamo che dalla conversione si abbia il numero 138 si avrà :
138 : 5 = 27 con primo resto = 6 27 : 10 = 2 con secondo resto = 7
cifra decine = 2 cifra unità = 7 cifra decimi = 6 cioè sul display avremo 27.6 ° C
Così per tutti gli altri possibili valori di conversione.
AMPLIFICATORE
Per adattare la tensione della sonda secondo quanto sopra esposto, si usa un operazionale in configurazione non invertente in grado di amplificare 9,804.
Sapendo che A=1+( R8 : (R7+R5)) dovrà essere R7+R5 = 470 : 8,804 = 53,4 Kohm si è pertanto scelto R7 = 22K e R5 un trimmer da 50K così da poterlo regolare per ottenere l’amplificazione desiderata.
Per la taratura si dovrà , con Vin della sonda = 0 V, regolare R4 per azzerare l’uscita sul pin 6 del uA741 mentre con una Vin di 500 mV si regola R5 per una Vout sul pin 6 di 4,9 V.
Per una più accurata taratura ripetere entrambe le regolazioni precedentemente fatte.
TRASMISSIONE DIGITALE Soluzione a C-MOS
Un metodo semplice per trasmettere dei dati digitali (bit 0/1 di un byte) su una linea bifilare consiste nell’associare allo 0 e all’1 un impulso di tensione o corrente sulla linea di uguale durata T avente però diverso duty-cycle a secondo se rappresenta uno 0 o un 1.
Precisamente un impulso di durata T che rappresenta uno 0 avrà il semiperiodo a livello alto di durata pari 1/4 T mentre l’impulso che rappresenta un 1 avrà il semiperiodo a livello alto di durata pari a 3/4 T come raffigurato nel grafico.
Si osservi il FLOW CHART TX e il corrispondente LISTATO TXBYTE.ASM
RICEZIONE DIGITALE
Vediamo ora come ricevere gli impulsi di linea e ricostruire il byte di partenza bit per bit.
Se si campionano gli impulsi in arrivo dopo un tempo pari a ½ T potremo trovare o un livello alto a 1 se l’impulso rappresenta un bit=1 oppure un livello basso 0 se rappresenta un bit=0.
Si osservi il FLOW CHART RX e il corrispondente LISTATO RXBYTE.ASM
FLOW CHART TX :
SCHEMA ELETTRONICO:
CONVERSIONE ADC E TRASMISSIONE DEL DATO
.title "ADC+tx" ; Titolo del programma
.vers "ST62E10" ; Microprocessore usato
; 8 Mhz ; 19/05/1998
ldi wdog,0ffh ; Carico il Watch-Dog.
; Setta la porta A
ldi pdir_a,00000001b ;out solo pa0 TX
ldi popt_a,00000001b
ldi port_a,00000001b
; Setta la porta B
ldi pdir_b,00000000b ;tutti input
ldi popt_b,00000001b ;verrà usato solo pb0 come ADC
ldi port_b,00000001b
;PROGRAMMA PRINCIPALE
main ldi wdog,255
ldi adcr,00110000b ;abilita A/D ( su pb0)
att jrr 6,adcr,att ;attende conversione
ld a,addr ;mette in a il valore convertito
res 1,port_a ;sincronismo per l'oscilloscopio
nop ;piccolo ritardo
set 1,port_a ;l'impulso torna alto
ldi wdog,255
ldi x,8 ;numero dei bit da tx
unbit rlc a ;ruota nrl cy il bit 7 del byte
jrnc zero ;se cy=0 salta a zero
jp uno ;se cy=1 salta a uno
zero set 0,port_a ;mette linea=1
ldi w,6 ;resta a 1 per 1/4 T
decw dec w
jrnz decw
res 0,port_a ;mette linea=0
ldi w,19 ;resta a 0 per 3/4 T
dew dec w
jrnz dew
jp decx
uno set 0,port_a ;lineaa=1
ldi w,19 ;resta per 3/4 T
decc dec w
jrnz decc
res 0,port_a ;lineaa=0
ldi w,6 ;resta a 0 per 1/4 T
decw_ dec w
jrnz decw_
decx dec x
jrz ldiw ;se i bit tx sono 8 ritorna
jp unbit ;altrimenti ne prende un altro
ldiw ldi w,35 ;pausa fra byte = circa 2T
duet ldi wdog,255
dec w
jrnz duet
jp main ;altro byte
FLOW CHART RX:
SCHEMA RX+DISPLAY:
title "RX+display" ; Titolo del programma
.vers "ST62E10" ; Microprocessore usato
; 8 Mhz ;19/05/1998
aa .def 084h
decimi .def 085h
unita .def 086h
decine .def 087h
resto .def 088h
risul .def 089h
xx .def 08ah
;*** Setta la porta A
ldi pdir_a,11111111b ;dipsonibili solo pa0,1,2,3 verso CA3161
ldi popt_a,11111111b ; tutti ouput
ldi port_a,11111111b
;*** Setta la porta B
ldi pdir_b,00000111b ;pa0,1,2 output
ldi popt_b,00000111b ;pb3 in rx
ldi port_b,00000111b ; rimanenti non utilizzati conf. input
media add a,resto ;somma il precedente valore con il nuovo
jrnc etic2 ;se non c’è riporto salta
inc risul ;altrimenti incrementa
etic2 ld resto,a
ld a,xx ;verifica se ha eseguito 255 conversioni
jrz etic4 ;se si salta
dec xx ;altrimenti un conversione in meno
ret
etic4 ld a,resto ;arrotonda
cpi a,127
jrc etic3 ;se a é minore salta e continua a sottrarre
inc risul ;altrimenti arrotonda incrementando risul
etic3 ld a,risul ;valore mediato 255 volte va in a
ldi xx,5
call div
ld a,resto
sla a ;moltiplica per 2
ld decimi,a
ld a,risul
ldi xx,10
call div
cpi a,0
jrnz no0
ldi a,15
no0 ld decine,a
ld a,resto
ld unita,a
clr resto
clr risul
ldi xx,255
ret
div clr w
ldi wdog,255
cp a,xx ;se a< div salta
jrc ok
sub_ sub a,xx ;sottrae x ad a
inc w ;conta quante volte ci sta x in a
ldi wdog,255
cp a,xx
jrnc sub_ ;se a >= salta e continua a sottrarre
ok ld resto,a ;resto UNITA
ld a,w ;risultato
ld risul,a ;DECINE
ret
;DISPLAY
mux ld aa,a
ldi port_b,00001111b ;spegne display
ld a,v
cpi a,0
jrnz uno_
ld a,decimi
ld port_a,a
ldi port_b,0001011b
jp normal
uno_ cpi a,1
jrnz due
ld a,unita
ld port_a,a
ldi port_b,00001101b
jp normal
due ld a,decine
ld port_a,a
ldi port_b,0001110b
ldi v,255
normal inc v
ld a,aa
ret
;PROGRAMMA PRINCIPALE RX
main clr resto
clr risul
ldi xx,255
main_ ldi wdog,255 ;RICEVE UN BYTE
ldi w,25 ;resta in questo loop fino a che input
testa jrs 3,port_b,main_ ;da alto torna basso e permane + di un T
dec w ;per assicurarsi che sia un nuovo byte
jrnz testa
ldi x,8 ;numero bit da ricevere x confronto
rx ldi wdog,255
jrr 3,port_b,rx
call mux
ldi w,6 ;predispone per la campionatura a 1/2 T
decr dec w
jrnz decr
jrr 3,port_b,zero ;se dopo 1/2 T e` 0 salta
uno set 0,a ;altrimenti setta bit0 di a
dec x ;conta un bit ricevuto
jrz out ;se sono finiti salta
sla a ;altrimenti sposta a sinistra bit0 e prepara
resta jrs 3,port_b,resta ;per il prossimo
jp rx ;se linea =1 resta altrimenti input
out call media
jp main_ ;ricomincia per altro byte
zero res 0,a ;bit0= 0
dec x
jrnz slaa
jp out ;se sono finiti salta
slaa sla a ;altrimenti sposta a sinistra e libera x prossimo
jp rx ;ne aspetta un altro
MISURAZIONE DELLA TEMPERATURA ALTRO ESEMPIO
Si intende misurare la temperatura di un pannello solare e visualizzare il suo valore su un display a tre cifre con la precisione di ± 0,2 ° C.
Il sensore è un integrato tipo LM35 che alla sua uscita dà 10 mV/ ° C.
Si ipotizza che la temperatura possa variare tra il minimo di 0 ° C e 102 ° C.
Il diplay si trova distante dal punto della misura e pertanto si vuole utilizzare una trasmissione, via doppino telefonico, di dati digitali seriali contenenti il valore numerico della temperatura.
Si utilizza un micro controllore ST6210.
La sonda LM35 dà 10 mV / ° C pertanto a 102 ° C avremo una tensione di 1020 mV.
Per sfruttare tutta l’escursione dell’ADC cioè da 0 a 5 V per avere una conversione con un numero compreso tra 0 e 255, dovrò amplificare il segnale della sonda di :
A = 5 : 1,02 = 4,9
così da avere a 102 ° C un byte di conversione contenente 255.
Se trasmetto tale byte in forma seriale e lo ricostruisco in sede di ricezione, basterà dividerlo per il fattore 5 e moltiplicare il risultato x 2 così da ottenere il numero che esprime i gradi:
255 : 5 = 51 con resto 0 poi 51 x 2 = 102
in realtá non arriveremo mai né a 100 né a 102° C ma soltanto al max 99,8 ° C
Facciamo un esempio reale :
Supponiamo che dalla conversione si abbia il numero 138 si avrà :
138 : 5 = 27 x 2 = 54 con resto = 6 anche il reto x 2 = 12 il che vuol dire 1 grado in piú e 2 decimi di grado infatti 12:10= 1 unitá e 2 di resto pertanto 54 diventerá 55 che : 10 = 5 con resto = 5 cioé cifra decine = 5 cifra unità = 5 cifra decimi = 2 cioè sul display avremo 55,2 ° C
Così per tutti gli altri possibili valori di conversione.
AMPLIFICATORE
Per adattare la tensione della sonda secondo quanto sopra esposto, si usa un operazionale in configurazione non invertente in grado di amplificare 4,9
Sapendo che A=1+( R8 : (R7+R5)) dovrà essere R7+R5 = 100 : 3,9 = 25,64 Kohm si è pertanto scelto R7 = 15K e R5 un trimmer da 22K così da poterlo regolare per ottenere l’amplificazione desiderata.
TARATURA
Per la taratura si dovrà , con Vin della sonda = 0 V, regolare R4 per azzerare l’uscita sul pin 6 del uA741 mentre con una Vin di 500 mV si regola R5 per una Vout sul pin 6 di 2450 mV.
Per una più accurata taratura ripetere entrambe le regolazioni precedentemente fatte.
.title "RX+display" ; Titolo del programma
.vers "ST62E10" ; Microprocessore usato
; 8 Mhz ; 26/08/1999
....OMISSIS.......
media add a,resto ;somma il precedente valore con il nuovo
jrnc etic2 ;se non c’è riporto salta
inc risul ;altrimenti incrementa
etic2 ld resto,a
ld a,xx ;verifica se ha eseguito 255 conversioni
jrz etic4 ;se si salta
dec xx ;altrimenti un conversione in meno
ret
etic4 ld a,resto ;arrotonda
cpi a,127
jrc etic3 ;se a é minore salta e continua a sottrarre
inc risul ;altrimenti arrotonda incrementando risul
etic3 ld a,risul ;valore mediato 255 volte va in a
ldi xx,5
call div
ld a,resto
add a,a ;moltiplica per 2
add a,a ;ancora x2
ld decimi,a
ld a,risul
add a,a ; x2
ld decine,a ;salva provvisoriamente
ld a,decimi ;riprende decimi
cpi a,10 ;verifica se dopo x2 ha
jrc ldxx ;superato l'unitá
inc decine ;se si incrementa
ldxx ldi xx,10 ;ín xx il divisore (:10)
call div
ld a,resto
ld decimi,a ;decimi di grado
ld a,decine ;riprendo decine
call div
ld decine,a ;decine di grado
ld a,resto
ld unita,a ;unita di grado
ret
div clr w
ldi wdog,255
cp a,xx ;se a< div salta
jrc ok
sub_ sub a,xx ;sottrae x ad a
inc w ;conta quante volte ci sta x in a
ldi wdog,255
cp a,xx
jrnc sub_ ;se a >= salta e continua a sottrarre
ok ld resto,a ;resto UNITA
ld a,w ;risultato
ld risul,a ;DECINE
ret
......OMISSIS......
LE MODIFICHE APPORTATE SONO ALCUNI VALORI DELLO SCHEMA E LA PARTE SCRITTA IN BLU NEL LISTATO RX