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 lescursione dellADC 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 ° CCosì 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 lamplificazione desiderata.
Per la taratura si dovrà , con Vin della sonda = 0 V, regolare R4 per azzerare luscita 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
Un metodo semplice per trasmettere dei dati digitali (bit 0/1 di un byte) su una linea bifilare consiste nellassociare allo 0 e all1 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 limpulso 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 limpulso 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 byteFLOW 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 altroPer gentile concessione: Vittorio Crapella