ESAMI DI MATURITÀ PROFESSIONALE

EX PROGETTO 92

Indirizzo : TECNICO DELLE INDUSTRIE ELETTRONICHE

TEMA 1996:

Si vuole sviluppare un sistema che renda confortevoli le condizioni ambientali in un edificio.
Il sistema si compone di una unità centrale collegata a una serie di unità periferiche, una per ogni stanza.
Le unità periferiche devono svolgere i seguenti compiti :

1) Regolazione della temperatura all’interno della stanza, tramite un sistema di condizionamento in grado di riscaldare e di raffreddare l’intero ambiente.

La temperatura di riferimento viene predisposta all’unità centrale, che la invia come dato alle periferiche.
La temperatura attuale viene valutata mediante i valori rilevati da due sonde posizionate all’interno della stanza.

L’unità periferica

- attiva il sistema di riscaldamento se la temperatura scende di 1.5 C al di sotto della temperatura di riferimento ;

- attiva il sistema di raffreddamento se la temperatura sale di 1.5 C al di sopra della temperatura di riferimento ;

- invia all’unità centrale ogni 2 secondi il valore della temperatura media e il valore del massimo scarto dalla media rilevato alla misura.

Il trasduttore lineare temperatura - corrente utilizzato ha la caratteristica :

I = K * T, con K= 1 micro A / °K

2) Misura e invio all’unità centrale ogni due secondi della quantità di umidità relativa (U)

presente all’interno delle stanze, rilevata con risoluzione minore o uguale all’1% mediante un traduttore capacitivo in cui la dipendenza della capacità C in funzione di U è data da :

C =(150 + 0.5 *U) pF

Il candidato, formulate le necessarie ipotesi aggiuntive :

indichi quali soluzioni e quali specifiche funzionali ritiene adeguate per unità centrale, e per le periferiche, definisca un opportuno sistema di collegamento tra le unità periferiche e la centrale, disegni lo schema a blocchi dell’intero sistema, inoltre, a sua scelta, sviluppi almeno uno dei due punti seguenti

d.1) realizzazione e dimensionamento delle interfaccie di condizionamento e conversione A/D dei segnali analogici,

d.2) illustrazione della struttura algoritmica dei programmi di gestione della unità periferiche e di acquisizione dei dati ; codifica di un segmento a piacere di un linguaggio di programmazione conosciuto.

SOLUZIONE DEL PROBLEMA

Come unità centrale si ritiene idoneo l’uso di un semplice personal computer con un adeguato software per gestire la comunicazione con le unità periferiche, memorizzare i dati ricevuti, fissare le temperature di riferimento (anche diversificate nell’arco della giornata) e visualizzare dati e/o grafici. Il sistema di comunicazione fra centrale e periferiche è preferibile sia del tipo ad anello con una unica fibra ottica da 3 mm che parte dall’unità centrale va alla prima periferiche esce da questa va alla seconda e così via per ritornare alla fine alla centrale. In commercio esistono simili sistemi che consentono fino a 254 moduli periferici. Sistemi con la fibra ottica offrono vantaggi che non si possono avere con i sistemi tradizionali a doppino telefonico o a cavo coassiale e sono : immunità al rumore elettromagnetico (la luce nella fibra non può essere deformata da altri fattori esterni), un solo cavo con buona resistenza meccanica, separazione galvanica (circola luce e non corrente), alta velocità di comunicazione (25 mS per 32 bit), rigenerazione del segnale al passaggio da periferica a periferica e in fine con un solo canale si gestiscono fino a 254 periferiche. In genere questi sistemi sono gestiti da PLC con le varie tipologie di interfaccia a seconda delle esigenze (moduli ADC, I/O digitali, Bus IBM/AT, RS232 e RS422 ecc). Ipotizzando di aver risolto il problema dal punto di vista comunicazione fra periferiche e centrale vediamo come realizzare la parte interfaccia fra sensori e periferica. Con un microcontollore ST6225 è possibile ad esempio ricevere tensioni analogiche da 0 a 5 V e convertirle in segnali digitali numerici da inviare alla periferica che a sua volta li invierà alla centrale. Inoltre il micro riceverà i valori di riferimento dalla centrale e comparati con quelli dei sensori attiverà o no riscaldamento e raffreddamento ed anche umidificatore e deumidificatore. I dati fra ST6 e periferica vengono inviati su un BUS a 8 bit. Il riconoscimento della periferica avverrà con un byte di indirizzo trasmesso come primo dato sia da che verso la centrale.

SCHEMA A BLOCCHI

SENSORE DI TEMPERATURA

Considerando che la temperatura confortevole di una stanza si aggira attorno a 20 °C ipotizziamo che un controllo idoneo a tale scopo debba essere in grado di rilevare temperature da 0 °C a 50 °C. Dobbiamo convertire tale deltaT di 50 °C in una tensione nel campo tra 0 e 5 Volt così da poter usare il convertitore ADC contenuto nell’ST6225 per avere un numero digitale proporzionale alla temperatura. Ipotizzando di attribuire ai 30 °C il numero N=150 (considerato che il massimo numero dato dall’ADC é 255) , a 0 °C corrisponderà il numero 0. In pratica avremo N(t) = 5 x T (°C) Fissati questi paramenti ne consegue che la tensione d’ingresso all’ADC dovrà essere : a 15 °C --> 5/255 = V/75 --> V = 5 x 75/255 = 1,47 V a 30 °C --> V= 5 x 150/255 = 2,941 V. Se la corrente di 1 microA/°K scorre in una resistenza da 10000 Ohm avremo una caduta di tensione di 2,732 V a 0 °C, pertanto a 15 °C avremo 2,882 V e a 30 °C 3,032 V. Se si sottrae in modo fisso 2,732V avremo un segnale di 10 mV/°C cioè 0,3V a 30 °C. Ne consegue che per raggiungere le tensioni calcolate sopra da inviare all’ADC si dovrà introdurre un’amplificazione di A = Vout/Vin = 2,941/0,3 = 9,8

CONVERTITORE CORRENTE TENSIONE

Con OP1 si ottiene una tensione fissa di -2,732 V regolabile con il timmer TR1. Sul pin non invertente di OP2 arriverà la differenza fra la caduta sulla r da 10K del sensore e i -2,732V di OP1 e cioè 10mV per °C. OP2, configurato come amplificatore non invertente, avrà una amplificazione A = 1+Rtot/Ri da cui A-1 = Rtot/Ri Rtot = (A-1) Ri - Fissando Ri = 10 K sarà Rtot =9,8 -1 x 10 x 10³ = 88 KOhm
Per una miglior regolazione del guadagno si suddivide Rtot in una resistenza fissa da 68 K e un trimmer TR2 da 47k. Pe la taratura regolare il trimmer TR1 da 1O KOhm per avere in uscita di OP1 una tensione negativa di -2,732V. Per regolare il guadagno di OP2 si dovrà applicare al posto del sensore una tensione di 0,3 volt (pari a 30 °C) e variare il trimmer TR2 affinché in uscita di OP2 si legga 2,941V. Considerato che la tensione massima misurabile con ADC dell'ST6 é di 5V la massima temperatura rilevabile sarà di 5V/9,8=0,51V sulla R da 10 K del sensore che sapendo essere 10mV/°C avremo °C = 0,51V/10mV/°C = 510/10 = 51 °C. Prima di convertire la tensione in un numero bisogna, come richiesto, interporre un circuito capace di mediare le tensioni V1 e V2 proporzionale alle due temperature T1 e T2. Si intende usare un sommatore invertente seguito da un amplificatore invertente con guadagno unitario per riportare in fase la tensione finale Vu utile per il convertitore ADC.

SOMMATORE INVERTENTE

Vo = - V1 x Rf/Ra1 - V2 x Rf/Ra2 per avere Vo = - (V1 + V2)/2 cioè la media dovrà essere Rf/Ra1= ½ = 0,5 fissando Ra1=Ra2= 20Kohm si avrà Rf = 20/2 = 10 K (è opportuno usare resistenze con tolleranza all’1%). Per una migliore stabilità dell’offset dovrà essere Rp = Ra1//Ra2/Rf Rp= 1/(1/20+1/20+1/10) = 5K valore commerciale 4K7 Vu= - Vo x A ma A è unitario pertanto Vu = (V1+V2)/2 come si voleva.

SENSORE DI UMIDITÀ

Per legare la variazione di capacità del sensore di umidità ad una proporzionale variazione di tensione si intende utilizzare un convertitore Frequenza Tensione per poter poi usare un ADC per ottenere la percentuale di umidità espressa in un numero digitale. Utilizzando il micro ST6225 la tensione d’ingresso all’ADC potrà variare da 0 V a 5 V e il valore numerico da 0 a 255. Essendo la capacità del sensore piuttosto esigua, da usare direttamente in un oscillatore ad onda quadra con operazionale, si intende utilizzare un moltiplicatore di capacità con operazionale con un fattore di moltiplicazione pari a 100. Pertanto la variazione della capacità così moltiplicata varierà da 15 nF per U=0% a 20 nF per U=100%.

MOLTIPLICATORE DI CAPACITÀ

Ceq = Csens x Rm/Rs = Csens x 100

Ne consegue che la variazione di capacità equivalente varierà tra 15 nF per una umidità U = 0% e i 20 nF per una umidità U = 100%.

OSCILLATORE AD ONDA QUADRA CON OP.

Imponendo una F = 1 KHz in corrispondenza della capacità di 15 nF e esaminando il circuito oscillatore ad operazionale, avremo : F = 1/T dove T= 2 R C logn (1+n)/(1-n) dove n = R2/(R2+R1) =15/(12+15) = 0,5555 (1+n)/(1-n) = 3,5 il logaritmo naturale di 3,5 = 1,252763

F = 1 / T = 1/(2 R C 1,252763) = 0,399/RC

per C=150 pF --> = 15 nF imponendo F = 1 KHz sarà :

Conoscendo la R quando si avrà C=200 pF --> = 20 nF la frequenza diventerà :

CONVERTITORE FREQUENZA/TENSIONE

Esaminando i dati applicativi dell’integrato RC4151, usato come convertitore Frequenza/Tensione, emerge la formula seguente :

Vo = F Rx Cx Ru 1,1 Vref/Rs dove Rs=14K Vref = 1,9V Ru=100K

Per una tensione d’uscita Vo massima di 5 volt e Fmax di 5 KHz       RxCx = 66,98 microS
Fissando Cx = 3,3 nF sarà :

Per la frequenza di 1KHz avremo Vo = 14,9285 F Rx Cx = 1V e per la frequenza di 750Hz
Vo = 14,9285 F Rx Cx = 0,75 V. Ritoccare eventualemnte il trimmer da 4k7 in serie alla 12K sul pin 2 dell'XR4151. Si nota che la tensione in uscita dal convertitore frequenza/tensione è inversamente proporzionale alla capacità del sensore . Inoltre si ha un deltaV di 250 mV per un deltaU del 100% con un valore numerico restituito dall’ADC che potrà andare 0 e 255 con una tensione da 0 a 5 volt. Ne consegue che la tensione dell' F/V va amplificata di un valore A = 5/0,25 = 20 volte. Utilizzando un amplificatore differenziale ad operazionale si potrà avere in uscita + 5V con Vin = 0,75V e 0V con Vin = 1V cosi da avere la proporzionalità diretta fra umidità e tensione, precisamente sarà : 255 : N(u) = 100% : U% ad esempio se ADC dà come Numero 185 sarà U%=(185 x 100) : 255 = 72,54 %

AMPLIFICATORE INVERTENTE

Fissando R = 27 K ed essendo il guadagno A = 20 = Rf/R sarà Rf = 20 x 27 x 1000 = 540 Kohm che suddivido in una fissa da 470 K e in un trimmer da 100K. Con Vin = 0,75 V regolo il trimmer da 10 K per avere Vu = 5V mentre con Vin = 1V regolo il trimmer da 100K per avere Vu = 0 V . Ripetere l’operazione per una migliore taratura.

MICROCONTROLLORE ST6225

Mediante i 4 pin della port_c (PC4-PC5-PC6-PC7) si pilotano le basi dei 4 transistori che a loro volta eccitano o no i relè che con i loro contatti attivano, secondo le esigenze del momento, i dispositivi di riscaldamento, raffreddamento, umidificazione e deumidificazione. Con due pin della port_b (PB0-PB1) si effettuerà la conversione analogica digitale delle tensione proporzionali alla temperatura e all’umidità. Con PB2 e PB3 si gestirà la scrittura di un byte da e per il modulo RTX. La port_a servirà sia come input che come output durante la comunicazione da e per la centrale con il modulo di trasmissione e ricezione attraverso la fibra ottica.

 

Allo START il programma dovrà configurare gli I/O secondo quanto già specificato in precedenza. Segnala alla centrale la presenza e si predispone a ricevere Tref e Uref e rimane ad aspettare questi dati. Esegue la conversione della tensione proporzionale alla temperatura in un numero contenuto in un byte, verifica se questo è maggiore della Tref (temperatura di riferimento) di 1,5 ° C e se sì deve attivare il relè che comanda il circuito di raffreddamento altrimenti deve verificare se è minore di Tref di 1,5 ° C e se sì deve attivare il relè che comanda il circuito di riscaldamento. Se la temperatura valutata è compresa nella fascia di ± 1,5 ° C rispetto alla Tref, allora deve spegnere gli eventuali circuiti di riscaldamento o raffreddamento che fino a quel momento erano attivi. Ricorda la temperatura massima misurata e quella minima, infatti se T misurato è maggiore del precedente Tmax, quest’ultimo diventa pari al nuovo valore di T appena valutato. Stessa cosa per Tminimo, se T misurato e inferiore a Tmin, quest’ultimo diventa pari al nuovo valore di T appena valutato. Dopo il controllo della temperatura si passa a quello dell’umidità; anche in questo caso si procede prima alla valutazione dell’umidità mediante la conversione della tensione e poi al confronto con la Uref. Il tema non chiede un controllo anche sull’umidità ma considerato che il valore numerico é comunque richiesto dalla centrale, si ritiene opportuno aggiungere anche questa parte del circuito che completa e migliora l’intero sistema. Se l’umidità U supera quella di riferimento Uref di 10 unità si deve eccitare il relè che attiva il deumidificaotre altrimenti verifica se il valore rilevato U è inferiore ad Uref di 10 unità e se si attiva l’umidificatore. Se l’umidità valutata è nella norma allora deve spegnere sia deumidificatore che umidificatore. A questo punto il programma deve verificare se sono trascorsi due secondi e se sì trasmette i dati di temperatura e di umidità, altrimenti ricomincia a valutare T e U.


LISTATO  ASSEMBLER  ST62

tref	.def	084h	;contiene il valore numerico della temperatura di riferimento 
trefpiu	.def	085h	;valore della temperatura di riferimento + 1.5°C  (val. num. +13 )
trefmen	.def	086h	;valore della temperatura di riferimento - 1.5°C  (val. num. -12 )
tmin	.def	087h	;valore minimo della temperatura misurata
tmax	.def	088h	;valore massimo della temperatura misurata
temp	.def	089h	;valore della temperatura misurata
uref	.def	08ah	;contiene il valore numerico dell’umidità di riferimento
urefpiu	.def	08bh	;valore dell’umidità di riferimento + 10U (val. num. +26)
urefmen	.def	08ch	;valore dell’umidità di riferimento - 10U (val. num. -25)
umidita	.def	08dh	;valore dell’umidità misurata
aa	.def	08eh	;per salvare momentaneamente il registro a
sec2	.def	08fh	;per valutare i due secondi
dura	.def	090h	;per contare le volte INT_TIM  per valutare 1 secondo

raff	.equ	4	;PC4 - numero bit di port_c per ON/OFF  raffreddamento
risc	.equ	5	;PC5 - numero bit di port_c per ON/OFF  riscaldamento
umid	.equ	6	;PC6 - numero bit di port_c per ON/OFF  umidificatore
deum	.equ	7	;PC7 - numero bit di port_c per ON/OFF deumidificatore
write	.equ	2	;PB2 - numero bit di port_b per segnalare WRITE
read	.equ	3	;PB3 - numero bit di port_b per valutare READ


ldi	pdir_a,11111111b	;port_a definita inizialmente come out 
ldi	popt_a,11111111b	;successivamente nel programma sarà o input o output
ldi	port_a,00000000b	;uscite tutte a livello 0

ldi	pdir_b,00000100b	;PB2 sempre out
ldi	popt_b,00000100b	;PB3 sempre input
ldi	port_b,00000000b	;PB0 e PB1 sempre input uno alla volta ADC

ldi	pdir_c,11110000b	;disponibili solo PC4-PC5-PC6-PC7 tutti output
ldi	popt_c,11110000b
ldi	port_c,00000000b

tim_int   			;INT TIMER     
	ld	aa,a			;salva reg. a
	ldi	wdog,255		;ogni 12 x 64 x 208/8.000.000 =19.9mS
	ld	tscr, 01011110b		;prescaler=64
	ldi	tcr,208          
	dec 	dura			;nr per ottenere un secondo
	jrnz 	ritor
dur	ldi 	dura,50
	inc	sec2
ritor	ld	a,aa			;riprende valore di a
	reti

portin				;PREDISPONE PORT_A COME INPUT  
	ldi	port_a,0
	ldi	popt_a,0
	ldi	pdir_a,0
	ret
portout				;PREDISPONE PORT_A COME OUT		
	ldi	pdir_a,255
	ldi	popt_a,255
	ldi	port_a,0
	ret
 outdati 				;USCITA DATI VERSO CENTRALE
	ld	port_a,a		;mette valore di a sul bus dati
	ld	a,port_b			
	set	write,a			;setta il bit di PB2 per segnalare invio primo byte
	ld	port_b,a		;write va alto
cfm	jrr	read,port_b,cfm		;apsetta conferma ricezione da parte della centrale
	ld	a,port_b			
	res	write,a			;restta il bit di PB2 
	ld	port_b,a		;write va alto
	ret

main				;PROGRAMMA PRINCIPALE
ldi	wdog,255	
	set	4,ior			;abilita INT del timer	
	ldi	tcr,208			;predispone timer - INT ogni 20 mS circa
	ldi	tscr,01011110b		;=64
	ldi	dura,50			;per avere circa un secondo
	ld	a,port_b			
	set	write,a			;setta il bit di PB2
	ld	port_b,a		;write va alto, segnala la presenza alla centrale
	call	portin			;configura port_a come input
inizio	clr	sec2			;azzera contatore dei 2 secondi
aspetta	jrr	read,port_b,aspetta	;aspetta che read venga messo alto 
	ld	a,port_a		;prende il primo byte (Tref) inviato dalla centrale
	ld	tref,a			;mette valore in Tref
	addi	a,13			;trova tref+1,5 gradi
	ld	trefpiu,a		;e salva in trefpiu
	subi	a,25			;trova tref-1,5 gradi
	ld	trefmen,a		;e salva in trefmen
	ld	a,port_b
	res	write,a			;resetta write
	ld	port_b,a			;write va basso
asp	jrs	read,port_b,asp		;aspetta che read vada basso per capire che è arrivato Uref
	ld	a,port_a
	ld	uref,a			;mette valore in Uref
	addi	a,26			;trova Uref  + 10
	ld	urefpiu,a		;salva in urefpiu
	subi	a,51			;trova Uref - 10
	ld	urefmen,a		;salva in urefmen
adc	ldi	port_b,00000001b	;PB0 = ADC   Temperatura
	ldi	pdir_b,00000100b
	ldi	popt_b,00000101b
	ldi 	adcr,00110000b		;abilita A/D 
att	jrr	6,adcr,att		;attende fine conversione
	nop
	ld	a,addr			;prende in a il valore della conversione
	ld	temp,a			;salva nuovo valore misurato della  temperatura
	cp 	a,trefpiu		;verifica se la temp misurata è superiore a Tref+1,5 gradi
	jrc	very1			;se inferiore salta
	set	raff,port_c		;altrimenti mette alto il bit PC4 per attivare il raffreddamento
	jp	offall1
very1	cp	a,trefmen		;verifica se minore di Tref-1,5 gradi
	jrnc	offall1			;se maggiore o uguale salta
	set	risc,port_c		;altrimenti mette alto il bit PC5 per attivare riscaldamento
	jp	verum			;va a verificare valori umidità
offall1	res	raff,port_c		;spegne se acceso raffreddamento
	res	risc,port_c		;spegne se acceso riscaldamento
	cp	a,tmin			;individua e ricorda Tmin e Tmax
	jrnc	max			;se maggiore o uguale salta
	ld	tmin,a			;altrimenti  ricorda nuovo valore minimo
max	cp	a,tmax
	jrc	verum			;se minore di Tmax salta
	ld	tmax,a			;altrimenti ricorda nuovo valore massimo
verum	ldi	port_b,00000010b	;PB1 = ADC umidità 
	ldi	pdir_b,00000100b
	ldi	popt_b,00000110b
attesa	jrr	6,adcr,attesa		;attende fine conversione
	nop
	ld	a,addr			;prende in a il valore della conversione
	ld	umidita,a		;salva valore umidità misurato
	cp	a, urefpiu		;verifica se l’umidità misurata è nel range previsto
	jrc	very2			;se minore di Uref + 10 salta
	set	deum,port_c		;altrimenti mette alto il bit PC7 per attivare deumidificatore
	jp	offall2
very2	cp	a,urefmen		
	jrnc	offall2			;se l’umidità misurata è maggiore a Uref - 10 salta
	set	umid,port_c		;altrimenti mette alto il bit PC6 per attivare umidificatore 
	jp	time
offall2	res	umid,port_c		;spegne se eventualmente acceso umidificatore
	res	deum,port_c		;spegne se eventualmente acceso deumidificatore
time	ld	a,sec2			;prende valore di sec2 per verificare se sono due secondi
	jrnc	invia
	jp	adc			;continua a verificare temperatura e umidità 
invia	call 	portout			;configura port_a come output
	ld	a, temp			;prende temperatura
	call 	outdati			;va ad inviare i dati verso la centrale
	ld	a,tmax			;prende temperatura massima
	call	outdati			;invia
	ld	a,tmin			;prende temperatura minima
	call	outdati			;invia
	ld	a,umidita		;prende umidita
	call	outdati			;invia
	call	portin			;configura port_a come input
rx	jrs	read,port_b,rx		;attende che read va basso
	ldi	a,255			;per un piccolo ritardo
	ldi	x,10
ldia	ldi	a,255			;per un piccolo ritardo (circa 50 ms)
indati	dec	a			
	jrz	decx			;se terminato ritardo salta
	jrr	read,port_b,indati	;se nel frattempo read non va alto salta a indati
	jp	inizio			;altrimenti la centrale vuole inviare nuovi Tref e Uref 
decx	dec	x
	jrz	norx			;terminato il ritardo salta 
	jp	ldia			;altrimenti continua ritardo 
norx	clr	sec2			;azzera contatore dei due secondi
	jp	adc		
 

(c) by Vittorio Crapella     [ Return ]