Progettazione ed esecuzione di un prototipo circuitale per la rilevazione della temperatura ambiente. Lavoro eseguito da alunni della spec.ne Elettronica e Telecomunicazioni Corso El/Te C RILEVATORE DI TEMPERATURA CON TRASDUTTORE LM35 Contenuti Introduzione e descrizione circuito Trasduttore LM35 Circuito di condizionamento Convertitore ADC 0800 Generatore di clock NE555 Buffer 74HC541 Microcontrollore PIC 16F84 INTRODUZIONE E DESCRIZIONE CIRCUITO Schema elettrico R8 1.2K R1 10k -12V +5V U5 LM741/NS + R4 1.8k R2 100k 40% 3 + 2 +12V U1 LM741/NS 7 D1 1N4732 +5V Vi 6 4 +15V R5 22K R3 2.2k 40% +5V -5V U6 LM741/NS + -5V R9 10k U3 ADC0800 1 D4 Vdd 18 2 D5 D3 17 3 D6 D2 16 4 D7 Vref+ 15 5 Vref- D1 14 6 SC D0 13 7 OE Vin 12 8 Vgg Clk 11 9 EOC Vss 10 -5V +5V R10 10k +5V 5V +5V 74HC541 270 ohm U2 555 1 Gnd 2 Trg 3 Out 4 Rst R6 270 ohm Vcc 8 Dis 7 Thr 6 Ctl 5 D3 1N4148 R7 270 ohm C2 100nF C1 5.6nF 5V +V PIC 16f84 +5V R11 10k 1 2 3 4 5 6 7 8 9 18 17 16 15 14 13 12 11 10 22pF XTAL1 22pF Componenti utilizzati: Trasduttore di temperatura LM35, 3 Amplificatori operazionali μA741, Convertitore ADC0800, Generatore di clock NE555, Buffer 74HC541, Microcontrollore PIC16F84, Diodo zener 1N4732, Diodo 1N4148, Trimmer: 2.2K e 100K, Condensatori: 100nF , 5,6nF, 2 da 22pF; Resistenze: 1,8K, 18K, 10 da 270ohm, 4 da 10K; 8 led ad anodo comune, Quarzo da 4MHz. Trasduttore di temperatura LM35 L’LM35 è un trasduttore di temperatura che presenta tre terminali: +Vs (tensione positiva), Vout (tensione che fornisce in uscita) e GND (massa). Esso ci consente di rilevare una temperatura in un campo di escursione che va da 0°C a 100°C e fornisce in uscita una tensione che va da 0V a 1V. La caratterica di questo trasduttore è quella di fornire in uscita una tensione che è data dal prodotto tra la temperatura rilevata e una costante K pari a 10*10-3: Vout=K*T=10*10-3*T Ad esempio, se abbiamo una temperatura di 20°C, il trasduttore fornirà in un uscita una tensione di 200mV: T=20°C Vout=10*10-3*20=200mV Circuito di condizionamento Il convertitore ADC 0800 può convertire segnali con una escursione che va da -5V a +5V per questo motivo è necessario realizzare un circuito di condizionamento che ci consente di avere in ingresso al convertitore una tensione compresa nel range. A tale scopo, usando un amplificatore operazionale μA741, abbiamo progettato il seguente circuito di condizionamento: R8 1.2K R1 10k +5V D1 1N4732 + U5 LM741/NS R4 1.8k +5V 3 + 2 U1 LM741/NS 4 R2 100k 40% R3 2.2k 40% -5V . Vi 7 +15V R5 22K -5V 6 Vo T1=0°C VO(T1)=-5V Vi(T1)=10*10-3*0=0V T2=100°C VO(T2)=+5V Vi(T2)=10*10-3*100=1V Vo=-R2/R1*Vref+(1+R2/R1)*Vi -5=-R2/R1*Vref+(1+R2/R1)*0 -5=-R2/R1*Vref +5=-R2/R1*Vref+(1+R2/R1)*1 +5=-R2/R1*Vref+(1+R2/R1) 10=1+R2/R1; R2/R1=9; R2=9R1 Abbiamo scelto: R1=2K R2=9*R1=9*2*103=18K -5=-R2/R1*Vref; -5=-9*Vref; Vref=5/9=0.555V . Per ottenere questa tensione di riferimento abbiamo utilizzato un diodo zener 1N4732, una resistenza da 10K e un trimmer da 4,7K che, tarato opportunamente ci ha permesso di ottenere una Vref=0,555V Non essendo disponibile in commercio una resistenza da 2K, abbiamo utilizzato una resistenza da 1,8K con in serie un trimmer da 1K; montando il circuito ci siamo resi conto dell’impossibilità di avere in uscita dall’operazionale la tensione da noi desiderata per questo motivo abbiamo inserito prima del circuito di condizionamento un buffer in modo da non caricarlo troppo; infatti il buffer presenta guadagno unitario, elevatissima resistenza di ingresso e bassissima resistenza di uscita, esso quindi funge da adattatore di impedenza. Convertitore ADC 0800 Abbiamo utilizzato l’ ADC 0800 per trasformare il segnale analogico in uscita al circuito di condizionamento in un codice binario che abbiamo utilizzato per visualizzare il valore binario della temperatura rilevata dall’LM35 sui led. L’ ADC 0800 è un convertitore A/D monolitico ad 8 bit che utilizza la tecnologia MOS. Esso utilizza la tecnica della conversione ad approssimazioni successive, accetta in ingresso una tensione che va da -5 a +5V e presenta 18 piedini: Pin 1: 2-4 Pin 2: 2-3 Pin 3: 2-2 Pin 4: 2-1 (MSB) 74HC541 per visualizzare sui led Pin 5: R-NET-WORK BOTTON (-Vrif=-5V ‘inverter’), Pin 6: START (RA0 uscita Pic) Pin 7: OUTPUT ENABLE (+5V per abilitare le uscite) Pin 8: VGG (-12V). Pin 9: EOC (RA1 ingresso Pic) Pin 10: VSS (+5V). Pin 11: Clock (NE555 270KH) Pin 12: VIN Pin 13: 2-8 (LSB) Pin 14: 2-7 Pin 15: R-NET-WORK (Vrif=+5V), Pin 16: 2-6 Pin 17: 2-5 Pin 18: VDD (GND). Per alimentare il convertitore abbiamo collegato il pin 10 (Vss) a +5V, il pin 18 (Vdd) a massa, il pin 8 (Vgg) a -12V. Per abilitare le uscite abbiamo collegato il pin 7 (Output Enable) a +5V. Per fornire lo Start alla conversione abbiamo collegato il pin 6 (Start Convertion) all’uscita Ra0 del Pic e il pin 9 (End Of Convertion) all’ingresso Ra1 del Pic. Al piedino 12 abbiamo inserito il segnale analogico in uscita dal circuito di condizionamento, mentre i piedini 4,3,2,1,17,16,14,13 sono stati collegati all’integrato 74HC541 per visualizzarne sui led i valori binari. Abbiamo impostato la velocità di conversione dell’ADC 0800 a 270 KHz collegando al pin 11 il generatore di clock NE555. Per fornire al convertitore la tensione di riferimento è stata applicata al pin 15 (Vref+) la tensione di +5V e al pin 5 (Vref-) la tensione di -5V; per ottenere questa tensione negativa abbiamo utilizzato un inverter, cioè un amplificatore operazionale in configurazione invertente, mandando al morsetto invertente +5V e utilizzando due resistenze da 10K, ottenendo il circuito sotto riportato: 10k +12V + +5V U1 LM741/NS -5V 10k -12V Generatore di clock NE555 Il timer 555 può essere utilizzato sia come multivibratore astabile (generatore di onda quadra), sia come monostabile (temporizzazione). Noi lo abbiamo utilizzato come generatore di onda quadra per pilotare la velocità di conversione del convertitore A/D. Trigger V2 Soglia V6 Uscita V3 TR Trigger attivo <1/3Vcc <2/3Vcc H OFF Soglia attiva >1/3Vcc >2/3Vcc L ON Nello schema dell’ NE555 illustrato in figura si nota che oltre ai terminali di alimentazione (Vcc, pin 8) e di massa (GND, pin 1), il circuito presenta due ingressi, il trigger (TRIG, pin 2) e la soglia o threshold (THRES, pin 6), ed il terminale di uscita (OUT, pin 3). Un altro terminale, quello di scarica o discharge (DISH, pin 7), è collegato internamente a massa tramite un transistore TR che funge da interruttore. Lo stato chiuso (ON) o aperto (OFF) del transistore è regolato da livelli di tensione presenti sugli ingressi di trigger e di soglia. Sono presenti inoltre due terminali, il reset (pin 4) ed il controllo (CONT, pin 5). Quando la tensione sul trigger scende al di sotto di 1/3Vcc e contemporaneamente la tensione di soglia è inferiore a 2/3Vcc, l’uscita dell’integrato va al livello alto (H) ed il transistore interruttore (TR) passa in OFF. Viceversa quando la tensione di soglia supera 2/3Vcc e contemporaneamente la tensione di trigger è maggiore di 1/3Vcc l’uscita passa al livello basso (L) ed il transistore si porta in ON. Il reset, quando viene attivato (livello basso), porta l’uscita al livello basso e chiude l’interruttore TR. Il terminale di controllo a sua volta viene usato in applicazioni particolari per variare le soglie di attivazione degli ingressi. Quando non è utilizzato questo terminale deve essere terminato a massa tramite un condensatore da 10nF. All’accensione la tensione Vc sul condensatore è nulla e pertanto è verificata la condizione rappresentata nella prima linea della tabella: l’uscita è alta e il transistor TR è OFF. Successivamente il condensatore inizia a caricarsi con legge esponenziale attraverso Ra ed Rb, finchè Vc non arriva a 2/3Vcc. A questo punto interviene l’ingresso di soglia del 555 che porta l’uscita al livello basso e chiude (ON) l’interruttore TR. Incomincia quindi la scarica a massa del condensatore attraverso Rb e TR, che dura finché la tensione Vc, giungendo ad 1/3Vcc, non determina la commutazione al livello alto dell’uscita e l’apertura (OFF) di TR. Il condensatore C riprende allora a caricarsi dando avvio al nuovo ciclo. Le forme d’onda sul condensatore (Vc) e sull’uscita (Vo) sono riportate in figura. Applicando l’equazione che rappresenta analiticamente l’andamento di una curva esponenziale, si ricavano per i due semiperiodi le seguenti espressioni: T1=0,7RBC T2=0,7(RA+RB)C Pertanto il periodo T del segnale vale: T=1/f=T1+T2=0,7(RA+2RB)C Buffer 74HC541 Il 74HC541 è un circuito integrato che utilizza la tecnologia microCMOS; esso è costituito esternamente da 20 piedini e internamente da 8 buffer. Abbiamo utilizzato questo integrato, buffer per i led in modo tale da non sovraccaricare il circuito. Per alimentarlo si è collegato il piedino 20 a +5V e il 10 a massa. I pin 1 e 19 sono stati collegati a massa per attivare le uscite. Infine le uscite dell’adc sono state collegate ai piedini di ingresso 2,3,4,5,6,7,8,9 ottenendo le uscite sui piedini 11,12,13,14,15,16,17,18. Microcontrollore PIC I PIC sono dei circuiti integrati prodotti dalla Microchip Technology Inc., che appartengono alla categoria dei microcontrollori, cioè quei componenti che integrano in un unico dispositivo tutti i circuiti necessari a realizzare un completo sistema digitale programmabile. Al loro interno vi è una CPU elementare (microprocessore), una Ram molto piccola, una Eprom o Eeprom, un ADC, una comparatore analogico, tutto ciò si trova in un singolo integrato. Nei microcontrollori il microprocessore è di tipo RISC (Riduced, Instruction, Set, Computer), cioè computer con un set di istruzioni ridotto (30,40 istruzioni) e tutte le istruzioni vengono eseguite nello stesso intervallo di tempo. •La RAM (Random Access Memory, cioè memoria ad accesso casuale) è molto piccola, dell’ordine dei byte . •La Eeprom o Eprom (Elettrically Programmable Read Only Memory) è una memoria di sola lettura programmabile elettricamente, la differenza tra le due sta nella lettera E che rappresenta il termine inglese Erasable, cioè cancellabile. La Eprom è di tipo OTP (One Time Programmable), cioè programmabile una sola volta; mentre la Eeprom può essere programmata più volte perché ha una memoria cancellabile elettricamente, questa memoria, in genere, è di tipo flash, ma, ci sono anche delle versioni UV che sono programmabili solo dopo la cancellatura con raggi ultravioletti Esistono in commercio diversi tipi di Pic, che si differenziano per la quantità di memoria disponibile o per la quantità di timer a disposizione o per il tipo di memoria che utilizzano. PIC16F84 Il PIC da noi utilizzato è il PIC16f84, che si presenta come un normale circuito integrato, ma internamente dispone di tutti i dispositivi tipici di un sistema a microprocessore: •Una CPU, cioè un’unità centrale di elaborazione il cui scopo è interpretare le istruzioni del programma; •Una memoria flash riscrivibile più volte, in cui sono registrate le istruzioni del programma da eseguire; •Una memoria RAM utilizzata per memorizzare le variabili adoperate dal programma; •Una serie di linee input/output; Una seri di dispositivi ausiliari al funzionamento (generatori di clock, bus, contatori). PIEDINATURA Il PIC 16f84 è dotato di 18 pin disposti su due file parallele di nove pin ciascuna PIN 1-2-17-18: sono linee di I/O della porta A, programmabili in ingresso o in uscita PIN 3: è un pin multifunzione che può essere programmato come linea di I/O della porta A, oppure come linea di clock verso il contatore RTCC; PIN 4: svolge la funzione di reset, azzera quindi il funzionamento del microcontrollore e cancella la memoria Ram, può essere collegato anche ad un circuito esterno di reset o al fisso positivo; inoltre quando il pic è in fase di programmazione viene utilizzato come ingresso per la tensione VPP. La linea reset normalmente si trova a livello alto, il reset è attivo quindi al livello basso; PIN 5: è il pin a cui va connesso il negativo dell’alimentazione (massa); PIN 6: è una linea di I/O della porta B, programmabile in ingresso o in uscita dall’utente o può essere programmato per generare interrupt; PIN 7-8-9-10-11-12-13: sono linee di I/O della porta B, programmabili in ingresso o in uscita dall’utente; PIN 14: è il terminale positivo dell’alimentazione; PIN 15-16: sono pin di connessione nel caso venga utilizzato un quarzo o un circuito RC per generare il clock. Organizzazione della memoria Memoria per il programma EEPROM 00h – 3FFh Memoria per i dati EEPROM 00h – 3FFh 64 byte RAM REGISTRI FUNZIONI SPECIALI 00h – 0Bh 80h – 8Bh . REGISTRI DI USO GENERALE 0Ch – 2Fh . Memoria Programma Il PIC 16F84 dispone di una memoria programma separata dalla memoria dati. La memoria programma e' lunga 1024 locazioni con indirizzi da 0 a 1023, ed è formata dalla seguente struttura: 3FF = 1023 Il PIC all'accensione (o dopo un reset) inizia a leggere il programma dall'indirizzo 000h. All'indirizzo 004h però vi è il vettore di interrupt, infatti se, tramite la linea INT si riceve un’interruzione, il microcontrollore mette nel programm counter (che contiene l’indirizzo dell’istruzione da eseguire) l’indirizzo 004H, quindi, l’indirizzo 000h conterrà un’istruzione di salto all’inizio del programma, altrimenti il programma potrebbe contenere soltanto quattro istruzioni: 000H istruzione di salto all’inizio del programma 004H interrupt vector | | | 020H istruzione di ritorno interrupt 021H inizio programma principale Memoria Dati La memoria dati è lunga 80 locazioni (indirizzi da 0 a 79) e prende il nome di register file in quanto ogni locazione può essere considerata come un registro a 8 bit. I primi 12 indirizzi (0..11) servono per il controllo dell'hardware del PIC, i seguenti 68 indirizzi (12..79) sono usabili dall'utente per memorizzare i propri dati di lavoro. Inoltre i primi 12 indirizzi dispongono di due banchi di registri, alcuni dei quali sono visibili in entrambi i banchi, mentre altri sono presenti solo in un banco. Il registro STATUS per esempio è visibile in entrambi i banchi, può cioè essere letto o scritto sia se il banco attivo è lo 0, sia se è l' 1. La commutazione da un banco all'altro avviene settando il bit 5 di STATUS (bit RP0), se vale 0 è attivo il banco 0, se vale 1 è attivo il banco 1. I 68 registri utente dall'indirizzo 12 (0CH) in poi sono invece sempre visibili e non sono influenzati dal banco attivo. Il registro STATUS contiene anche i flags, il bit 0 è il flag C, il bit 2 è il flag Z. ISTRUZIONI Il PIC 16f84 dispone di un set di 35 istruzioni elementari, e og ni istruzione occupa una sola locazione della memoria programma. Quasi tutte le istru zioni vengono eseguite in 4 cicli di clock, un PIC cloccato a 4Mhz è perciò in grado di eseguire 1 milione di istruzioni al secondo (1 mips) e ogni istruzione dura 1µS. Le istruzioni di branch (salto) possono richiedere 8 cicli di clock anziché 4. Nella terminologia Microchip un gruppo di 4 cicli di clock è detto "ciclo", per cui le istruzioni vengono eseguite in uno o due cicli. Le aree di memoria su cui si può agire sono i registri dell a memoria dati e il registro accumulatore W (che non fa parte dell'area dati, ma è un ulteriore registro hardware interno al PIC utilizzato nelle operazioni aritmetico l ogiche). ISTRUZIONI MAGGIORMENTE UTILIZZATE MOVLWK MOV (sposta) L (il valore del campo letterale espresso da k) in W (accumulatore) MOVWF MOV (sposta) W (accumulatore) in F (file register di indirizzo F) MOVF, MOV (sposta) F (file register di indirizzo F) in W (d=0) o nel file register di indirizzo f (d=1) (ovvero copia sé stesso) ADDWF, ADD (somma) W (l’accumulatore) a F (file register di indirizzo F) ponendo il risltato in W (d=0) o nel file register di indirizzo F (d=1) BCF, (bit) di ordine b, C (clear=azzera), F (file register di indirizzo F), azzera il bit b (b=07) del file register con indirizzo F BSF, (bit) di ordine b, S (set=setta, porta ad uno), F (file register di indirizzo F), azzera il bit b (b=07) del file register con indirizzo F BTFSS (bit) di ordine b, T (test), F (file register di indirizzo F), S (skip=salta), S (set=posto ad uno). Fa il test del bit b del file register di indirizzo F e salta l’isruzione successiva se esso è uguale ad uno CLRWAzzera l’accumulatore GOTOKSalta all’indirizzo K. Il campo letterale K può essere un indirizzo numerico o un’etichetta RITARDI SOFTWARE In alcuni programmi può essere necessario regolare con precisione la durata temporale di una routine software, inserendo delle apposite istr uzioni che hanno l'unico scopo di creare un piccolo ritardo. Usando l'istruzione NOP e' possibile inserire un ritardo di 1µS (con clock di 4Mhz), se serve un ritardo di 2µS possono essere scritte due NOP una dietro l'altra, oppure, per risparmia re memoria programma, si può usare una goto fittizia che salta all'istruzio ne successiva, una goto infatti dura sempre 2µS e occupa una sola locazione della memoria programma, l'uso delle goto fittizie è però uno stile di programmazione un po’ scorretto, e va usato solo se e' assolutamente necessario risparmiare quelle poc he locazioni di memoria, altrimenti e' sicuramente preferibile usare due NOP Ritardo 1µS: Ritardo 2µS: oppure: nop nop nop goto $+1 PROGRAMMA UTILIZZATO Il programma da noi realizzato ci ha consentito di fornire il segnale di Start all’ADC 0800 ogni qual volta il Pic riceveva in ingresso il segnale dell’avvenuta conversione EOC (End Of Conversion). Per fare ciò abbiamo configurato la porta A in modo tale che la linea RA0 fosse uscita (Start) e la linea RA1 fosse ingresso (EOC); inoltre abbiamo impostato le 8 linee della porta B tutte come ingresso, per inviare al Pic gli otto bit in uscita al convertitore A/D. Per fornire lo Start abbiamo realizzato un ciclo (Test) in cui il Pic andava a testare continuamente la linea RA1 della porta A e, quando arrivava il segnale di fine conversione (EOC), tramite un’istruzione di salto (go to), il programma usciva dal ciclo e andava a fornire il segnale di Start per una durata di 3sec, per tornare poi nuovamente al ciclo. PROCESSOR 16F84 processore RADIX DEC INCLUDE "P16F84.INC" ORG 0X00 BSF STATUS,5 MOVLW 2 MOVWF TRISA MOVLW 255 MOVWF TRISB BCF STATUS,5 START BSF PORTA,0 NOP BCF PORTA,0 ; è una direttiva del compilatore che ; consente di definire per quale ; è stato scritto il seguente programma. ; serve ad informare il compilatore che i ; numeri senza notazione sono decimali. ; è una direttiva che comunica al ; compilatore di includere il file ; P16F84.inc. ; ci consente di definire l' indirizzo da cui ; vanno allocati i dati in esecuzione ; il secondo pin della porta A viene ; impostato come linea di ingresso. ; (RA0=Start, RA1=End of conversion). ; tutti i pin della porta B vengono ; impostati come linea di ingresso ;setta il bit 0 della porta A (RA0). ; resetta il bit 0 della porta A (RA0), ; otteniamo un ritardo di 3sec. TEST BTFSS PORTA,1 GOTO TEST MOVF PORTB,W MOVWF 0Ch GOTO START END ; testa RA1,se è zero svolge l'istruzione ; successiva altrimenti salta un'istruzione ; torna a TEST ; sposta il contenuto di PORTB nell'accumulatore. ; sposta il contenuto dell' accumulatore ; nella locazione di memoria ram 0Ch ; torna a START ; è una direttiva che indica al compilatore ; la fine del programma