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

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

Image37.gif (32883 byte)

Per gentile concessione: Vittorio Crapella

Torna all'indice