Tesina 5G Albi Riccardo ITIS E. Mattei Sondrio
Ricondizionamento a camera termostatica di un forno per la disidratazione dei sali
Indice: 1. 2. 3. 4. 5. 6. 7. 8.
Introduzione Sistema fisico Sistema di controllo Sensore Circuito elettronico Temperature rilevate Colture Considerazioni finali
Appendice: 9. Listato programma 10. Schema elettronico
1
1 - Introduzione Punto di partenza per la costruzione della camera termostatica è stato il forno per la disidratazione dei sali presente nel laboratorio di chimica del nostro istituto. A tale struttura "bastava" aggiungere un sistema di controllo retroazionato che mantenesse stabile la temperatura dell'aria al suo interno per permettere ai batteri di riprodursi al meglio. Il forno è costituito da una carcassa metallica interna con due resistori di potenza collegati in parallelo rispetto all'alimentazione che forniscono il calore necessario al riscaldamento, da uno strato esterno isolante in lana di roccia e da un guscio esterno in lamiera metallica con uno sportello per l'accesso al vano riscaldato. Essendo un forno per la disidratazione dei sali ha una buona potenza (1 KW) e raggiunge temperature abbastanza elevate (200 °C), questo introduce una difficoltà nel progettare il sistema di controllo perchè le temperature sono molto elevate rispetto a quelle volute per il nuovo uso: è come utilizzare una macchina per percorrere 10 metri quando si poteva benissimo andare in bici, non serve tanta potenza. Schema costruttivo forno
Frontale:
Inferiore: 4
5
6
1 2
7
2
8 10
3
9
Particolare camera riscaldata:
Legenda: 1. sportello apertura 2. carcassa 3. frontalino comandi 4. switch accensione e modo 5. lcd 6. potenziometro regolazione 7. circuito di controllo 8. circuito di potenza 9. morsettiere, fusibili, presa di rete 10. alimentatore circuito controllo 11. resistenza di potenza piana 12. resistenza di potenza verticale 13. sensore di temperatura
12 2
13
11
Il forno è stato modificato dal punto di vista estetico aggiungendo il frontalino e rimuovendo i precedenti comandi mentre per la struttura sostanziale non sono state apportate modifiche. I circuiti aggiuntivi per realizzare le nuove funzionalità sono stati aggiunti nel vano inferiore, dove c'era sufficiente spazio. La disposizione e la potenza degli elementi riscaldanti non è stata variata, rimangono collocate sul piano orizzontale in basso e verticale in fondo del forno. 2
2 - Sistema fisico
Parete
Qop
Qpa Aria box
Qrp
p : parete a : ambiente r : resistenza s : sensore o : out
R Qps
V
Qor
Circuito di controllo
I
Qos
Q : calore I : corrente V : tensione
Qoa
Calore uscente Calore entrante
Sensore
Il sistema fisico astratto che è stato scelto per modellare il forno è rappresentato in figura, le frecce rosse rappresentano il calore che aumenta la temperatura globale del forno mentre le frecce blu sono il calore uscente verso l'ambiente circostante. Il sistema di controllo agisce sulla tensione applicata al resistore che fornisce calore alla parete interna del forno che a sua volta cede calore verso l'aria racchiusa all'interno della camera, che riscaldandosi aumenta la propria temperatura mentre essa è monitorata dal sensore che invia una tensione proporzionale al circuito di controllo. Il controllo è ottenuto regolando la potenza dissipata dagli elementi riscaldanti per mezzo del monitoraggio della temperatura dell'aria tramite il sensore. Cercando di modellare il sistema si sono individuate una serie di equazioni, derivate da un modello concettuale di conduzione del calore, che possono descriverlo: dQi
=
P ∙ dt
(1)
dQi
=
kt ∙ (Ts1-Ts2) ∙ dt
dQo
=
k1 ∙ (Ti-T) ∙ dt
(2)
dQtotale
=
dQi - dQo
(3)
dTa
=
dQtotale / cm
(4)
Ts
=
(Ta – T) ∙ (1-℮
-τ∙t
(1b)
)+T
(5)
Breve descrizione delle equazioni riferite ad uno strato singolo (1÷4, esclusa la 5): 1. La quantità di calore in ingresso è la potenza dissipata nel resistore (1) o il calore ceduto per trasmissione da uno strato (1b) all'altro per intervallo di tempo 2. Quantità di calore in uscita = differenza di temperatura tra strato e strato, moltiplicato per una costante k (k grande determina una fuoriuscita maggiore di calore, ossia basso isolamento termico) e per l'intervallo di tempo. 3. Quantità di calore totale, ottenuto sommando il contributo del calore entrante e sottraendo il calore uscente. 4. Incremento di temperatura dello strato, ottenuto dividendo il calore totale dello strato per la capacità termica c e la massa m dello strato. 3
5. Adeguamento ad una variazione di temperatura ΔT=T–TAD590 della temperatura dell'ambiente nel quale è posto il sensore rispetto a quella del sensore. Dipende dal tempo t trascorso dall'istante in cui la variazione ha avuto effetto e da τ, costante che rappresenta l'inerzia termica del sensore. Vedi paragrafo sensore. Box indica la temperatura dell'aria interna alla camera mentre T è la temperatura ambiente. P si misura costante (quando il sistema non è retroazionato) e pari alla differenza di potenziale applicata agli estremi del resistore diviso per il valore del resistore stesso (2 resistori da 100 Ω in parallelo danno R=100/2=50Ω): P = Veff 2/R = 2302/50 = 1058 W Il sistema è composto da più di uno strato di questo tipo, possiamo individuare 3 macro-strati sicuramente presenti nel forno: Qoa
Qop
Qor
1. strato resistore Qi(P)
2. strato parete
Qrp
Resistore
Qpa
Parete
Aria
3. strato aria TR
>
>
TP
TA
Da tali strati avvengono simultaneamente acquisizione/cessione di calore, rendendo il sistema molto difficile da rappresentare matematicamente nel suo insieme. Questo modello si evince dalla risposta ad anello aperto del sistema, sottoposto a una variazione del tipo gradino unitario (100% potenza applicata): 200 190 180 170 160 150 140 130 120 110 Calcolata Rilevata
100 90 80 70 60 50 40 30 20 10 0 0
900
1800
2700
3600
4500
5400
6300
7200
8100
9000
9900
10800
Il sistema è di ordine sicuramente superiore al primo in quanto presenta una certa inerzia alla risposta del gradino, rappresentato dal punto di flesso a tangente obliqua individuabile nei primi minuti di funzionamento. La funzione matematica che descrive tale curva è la seguente: y = 21 + 180·(1 - ℮
- x/41
4
) - 5.1·x·℮
- 0.082·x
3 - Sistema di controllo B : bus dati I : corrente V : tensione I : corrente i : input o : output p : pwm
Circuito di condizionamento Via(T)
d : digitale a : analogico
Is(T)
Sensore di temperatura
Overtemp
Vi(T)
ADC Blocco
Manopola regolazione
Switch modalità
Via
Vid
Microcontrollore integrato MCLR
dispositivi di input
Vp(t)
Circuito di potenza
Bod
LCD
dispositivi di output
Il sistema di controllo è composto da una serie di circuiti tutti interfacciati con un microcontrollore integrato della serie PIC che si occupa di gestire gli input (digitali/analogici) e gli output (digitali) tramite un opportuno firmware che implementare il codice del regolare e altre utili funzioni. In particolare i dispositivi di input sono: il sensore, che dopo opportuno condizionamento (traslazione/amplificazione/filtro) giunge all'adc del pic che lo converte in un segnale digitale trattabile, la manopola di regolazione che comanda un potenziometro che invia un segnale di tensione proporzionale alla rotazione il quale letto dall'adc fornisce un segnale digitale e lo switch che permette di passare da una modalità di funzionamento all'altra: da camera per la disidratazione dei sali (temperature alte) a camera termostatata per la coltura batterica (temperature basse e stabili). I dispositivi di output sono invece: un lcd retroilluminato che mostra a intervalli di 1/1.5 secondi l'andamento della temperatura e altri parametri notevoli per il processo di regolazione e il circuito di potenza che riceve una tensione PWM che modula i resistori di potenza e ne fa variare il calore prodotto. Esiste inoltre un sistema di sicurezza (Overtemp) che a sonda inserita nella camera blocca la tensione di pilotaggio dei resistori in seguito al raggiungimento di una temperatura massima impostabile da un trimmer sul circuito e contemporaneamente accende un led rosso sul frontalino per segnalare l'allarme di sovratemperatura occorso. Caratteristiche di regolazione offerte dal sistema di controllo implementato: Modalità:
temperatura regolabile
potenza regolabile
Intervallo di regolazione:
Tambiente a +45 °C
0 / 100 %
con passi di 0.5 °C
a passo unitario
Regolazione:
PID
PWM
Stabilizzazione:
± 1.0 °C
± 0.01 %
Risoluzione sonda:
± 0.1 °C
Non usata
5
Il sistema di controllo impiega un generico regolatore PID, che presenta 3 azioni che combinate permettono di supervisionare processi anche non lineari. Esso si compone di: 1. azione proporzionale 2. azione derivativa 3. azione integrale Che è possibile riassumere nella seguente formula: R(t) = Kp ∙ e(t) + Kd ∙ e'(t) + Ki ∙ 0∫t e(t) L'errore rappresenta la differenza tra la variabile misurata e quella voluta, nel nostro caso il ∆T tra Ts (Tset) che è la temperatura impostata e Tr (Tread) che è la temperatura letta. La prima azione tiene conto semplicemente di questa differenza, ∆T = e nel nostro caso. La seconda azione tiene conto della velocità con la quale cambia l'errore (ossia la differenza di temperatura) ed è importante in quanto permette di rispondere ai cambiamenti rapidi della variabile da controllare. La terza azione tiene conto della risposta a regime, ossia regola il funzionamento e porta a 0 l'errore del sistema a regime, cioè per t ―› ∞. La somma delle tre azioni avviene in modo pesato per mezzo delle costanti Kp, Kd e Ki che nel nostro caso valgono 3, -50 e 100 rispettivamente.
4 - Sensore Dal datasheet del sensore, si ricava che il suo adeguamento alla temperatura dell'ambiente nel quale è posto può essere modellato con una funzione esponenziale con costante singola τ:
Tale figura rappresenta un adeguamento percentuale in base ad un brusco cambiamento di temperatura per t>0 che viene mantenuto per t ―› ∞. Per t<0, TAD590 = Ta . La variazione di temperatura ΔT = T–TAD590 ha ampiezza 100 in questo grafico di esempio. Tale comportamento può essere modellato con la seguente equazione: TAD590 = (T – TAD590) ∙ (1-℮
6
-τ∙t
) ∙ 100
Partendo da questa equazione base e adattandola si ottiene l'equazione (5). Il modello più generale usato nel nostro caso è: TAD590 = (T – Ta) ∙ (1-℮
-τ∙t
) + Ta
Dove Ta è la temperatura ambiente, T è la nuova temperatura raggiunta e TAD590 è la temperatura del sensore che inizialmente è pari alla Ta. Si ipotizza un brusco cambiamento di temperatura per t>0 che viene mantenuto per t ―› ∞. Per t<0, TAD590 = Ta . Ovviamente non solo questo sensore è caratterizzato da una risposta di questi tipo, ma ogni strumento in grado di misurare la temperatura si comporta adeguandosi alla temperatura da misurare con questo andamento esponenziale crescente che tende al valore di temperatura di equilibrio al quale il sistema + si stabilizza. Il termometro influisce sulla temperatura di un oggetto perchè esso stesso ha una temperatura e può cedere o fornire calore all'oggetto. L'importante è che il calore ceduto o fornito sia poco e faccia variare di poco la temperatura finale dell'oggetto. Inoltre è importante nei sistemi di misura dinamici della temperatura che il sensore sia pronto nel rispondere alla variazione di temperatura, altrimenti si rischia di non seguire fedelmente l'andamento del processo di riscaldamento, con conseguente malfunzionamento del sistema di regolazione e controllo dinamico.
5 - Circuito elettronico Per realizzare il sistema di controllo è stato creato un apposito circuito elettronico che contiene tutte le parti rappresentate nello schema a blocchi precedente e permette di svolgere le funzioni di regolazione e visualizzazione del processo. Riassiumo qui alcune delle parti più significative e impegnative nella progettazione dello stesso: 1. circuito di condizionamento 2. microcontrollore 3. pilotaggio di potenza
Circuito di condizionamento
Questo circuito si occupa di prelevare una corrente in uscita dal sensore che è proporzionale alla temperatura , di convertirla in una tensione, di amplificarla correttamente in un range che si adatta all'adc del microcontrollore. Simultaneamente opera un blando filtraggio sul segnale in modo da ripulirlo da eventuali spurie e limitando le interferenza con la tensione di rete. Particolare attenzione è stata posta nella progettazione in quanto l'elemento è fondamentale fonte di eventuali errori nella catena di controllo: la temperatura è la variabile fondamentale con cui si opera per regolare il sistema, si devono ridurre gli errori al minimo. Per errori si intendono variazioni non predicibili della tensione in uscita al circuito per variazioni imposte da cause esterne come: disturbi di rete o RF, variazioni di temperatura del circuito e non della sonda (tutti i componenti utilizzati hanno oltre alla loro tolleranza specifica anche una deriva termica non trascurabile), variazioni di carico del circuito ecc. Per questo motivo i componenti sono stati scelti con cura (per un elenco rifarsi allo schema o alla lista), gli accorgimenti adottati sono stati molteplici: utilizzo di cavo schermato per la sonda cavo, utilizzo di resistenze a basso coefficente di deriva termica (±50 ppm/°C), amplificatori-operazionali a bassa deriva, circuito di alimentazione ultra-stabile in smd, filtro e secondo amplificatoreoperazione in configurazione buffer in uscita per evitare di caricare il circuito e per adattare la tensione al'adc. Il circuito è tarabile mediante due trimmer multigiri a bassa deriva termica indicati con R2 e R5. La funzione di trasferimento del circuito è:
[
Via=Vref− T⋅10−6−
]
Vref ⋅[ R6R2 ] [ R1R5 ]
ove T è espresso in Kelvin che dopo opportuni passaggi e sostituzioni diventa:
7
Via=5−
T 10
ove T è espresso in gradi Celsius. Quindi il circuito restituisce una tensione proporzionale alla temperatura, che decresce quando la temperatura sale e cresce quando la temperatura si abbassa. A 5V corrispondono 0 °C e a 0 V corrispondono 50 °C.
Microcontrollore
In questo progetto si è impiegato un microcontrollore PIC con archittetura RISC ad 8 bit, comprendente una ROM, una RAM, un processore e altre periferiche utili al nostro progetto come un convertitore analogico digitale a 8 canali (adc). Il microcontrollore è la parte fondamentale di questo progetto perchè si occupa di gestire gli input e di fornire l'output implementando oltre a tali funzioni anche quella di regolatore PID. In esso viene caricato un progamma (firmware) che viene compilato con un pc e successivamente trasferito nella memoria EEPROM interna, una volta fornita tensione al PIC esso si comporta come scritto nel codice. Il codice è stato sviluppato in C con mikroC IDE in versione FREE, raggiungendo le dimensioni massime di compilazione (2 Kword) per oltre 500 righe di codice. Esiste un processo principale che si occupa di generare la tempistica necessaria alla produzione di un'onda quadra adatta al pilotaggio delle resistenze, molto precisa, che non ha mai fine, tranne nel caso di spegnimento. Contemporaneamente sono stati abilitati gli interrupt per gestire eventi esterni come la regolazione della temperatura o della potenza tramite il potenziometro.
Sopra è rappresentato il diagramma a blocchi del firmware.
Pilotaggio di potenza
Si utilizza una onda quadra in PWM per pilotare il carico resistivo. Per modulazione PWM si intende Pulse Width Modulation, ossia modulazione a larghezza d'impulso e consiste sostanzialmente nella generazione di un'onda con un duty cycle variabile che sia proporzionale alla potenza che vogliamo usare. Mediamente la tensione media ottenuta è proporzionale al 8
duty cycle e di conseguenza la potenza dissipata sarà proporzionale anch'essa al duty cycle (P = V∙I). Come attuatori si utilizzano dei triac, assimilabili a degli interruttori per la tensione alternata: moduliamo la tensione di rete con un'onda quadra in PWM per ricavarne una tensione media proporzionale al duty cycle, quindi ottenendo una potenza proporzionale al duty cicle dissipata negli elementi di riscaldamento.
Vm
Vm
DC : 50%
DC : 33% Vm
Vm DC : 66%
DC : 100%
Il circuito di potenza è isolato dal processore tramite optoisolatori per evitare interferenze o peggio ancora scariche a tensione di rete. Il microcontrollore può generare sol onde logiche con segnali di tipo alto/basso e non tensioni continue a meno che utilizzando un dac, per questo si impiega la tecnica PWM.
7 – Colture Per testare il funzionamento del forno si sono testate alcuni terreni di coltura seminati con diverse diluizioni di lactobacilli su un terreno di Hagar, appositamente adottato. Questo è il procedimento sperimentale adottato: CONTA VITALE MEDIANTE DILUIZIONI SERIALI Materiali: 1 vassoio + 1 tovaglietta di carta 6 provette lunghe con tappo sterili 7 siringhe monouso da 1ml con ago sterili 1 siringa da 10 ml con ago sterile 4 anse sterili in plastica 4 piastre con terreno di coltura sterili
soluzione fisiologica sterile yogurt bianco guanti in lattice camice pennarello vetrografico stufa con termostato
Attenzione alla sterilità. Batteri e muffe sono ovunque e non devono entrare nelle tue piastre. non toccare con le dita aghi, superficie delle piastre, anellino terminale delle anse non appoggiare sul bancone tappi delle provette, coperchi delle piastre, aghi e siringhe, anse non stare con il viso troppo vicino ai materiali sterili ( non respirarci sopra ) dopo l’uso appoggia il materiale dentro la vaschetta Attenzione a come maneggi gli aghi. Indossa i guanti Procedimento 1) Prelevare con la siringa grande la soluzione fisiologica sterile introducendo l’ago nel tappo di gomma ( non togliere la capsula di metallo) e capovolgendo il flaconcino, mettere 9 ml di soluzione fisiologica in ogni provetta grande stappando e ritappando rapidamente e senza appoggiare il tappo. Scrivere con il pennarello su ogni provetta la diluizione: 10-1; 10-2; 10-3; 10-4; 10-5; 10-6 2) Prelevare con una siringa piccola 1 ml di yogurt e introdurlo nella prima provetta, tappare rapidamente e agitare molto bene 9
3) Prelevare con una nuova siringa piccola con ago lungo (bisogna sostituire quello presente nella confezione) 1 ml della soluzione 10-1 appena preparata e trasferirlo nella provetta successiva, agitare molto bene 4) Ripetere l’operazione 3 per tutte le provette preparate, cambiando ogni volta la siringa 5) Marcare 4 piastre sterili con il pennarello riportando, oltre al numero del gruppo, la diluizione: 10-6; 10-5;10-4;10-3 6) Prelevare con una nuova siringa piccola 0,1 ml dall’ultima soluzione (quella più diluita) e distribuire sulla superficie del terreno utilizzando un’ansa sterile con delicatezza in senso rotatorio senza graffiare la superficie. Operare con rapidità senza sollevare completamente il coperchio della piastra e senza appoggiarlo al bancone. 7) Ripetere l’operazione 6 per le diluizioni10-5,10-4,10-3 usando sempre la stessa siringa. 8) Incubare le piastre capovolte a 37°C per 24 ore 9) Contare le colonie, che si considerano originate da un singolo batterio vitale, sulla piastra che ne contenga un numero compreso tra 30 e 300 10)Calcolare la concentrazione di cellule vitali contenute nello yogurt (espressa come unità formanti colonia CFU/ml) moltiplicando il numero di colonie per il fattore di diluizione: CFU/ml = n° colonie x 10 x 1/10-n I batteri contenuti nello yogurt sono Lactobacillus bulgaricus e Streptococcus thermophilus solitamente in proporzione 1:1.
8 - Considerazioni finali L'esperimento si può considerare concluso con successo, la stabilizzazione buona e le colture crescono con sufficente velocità. Il sistema è preciso e stabile entro i limiti dichiarati, sopratutto considerando che il progetto è basato su una struttura preesistente, quindi non costruito ex-novo per questo scopo e non ha mai presentato errori nel codice o guasti nelle fasi di test. Il sistema è passibile di ulteriori migliorie, in particolare per quanto riguarda la scelta dei parametri del regolatore, che potrebbero portare ad una precisione migliore ma che richiedono molto più tempo per la sperimentazione.
10
Appendice 9 – Listato programma /* * tc, v. 0.92 * Author: Albi Riccardo * Date: 5.5.10 */ // #pragma config
= 0x393E
/* * Pin assignment for adc, zero_riv, triac, lcd */ #define GONE sbit TRIAC2 at sbit TRIAC1 at sbit ZRIV at sbit VIN at sbit SW at sbit DEBUG at
ADCON0.2 RD0_bit; RD1_bit; RD2_bit; RD3_bit; RD4_bit; RD5_bit;
sbit sbit sbit sbit sbit sbit
LCD_RS LCD_EN LCD_D4 LCD_D5 LCD_D6 LCD_D7
RB2_bit; RB3_bit; RB7_bit; RB6_bit; RB5_bit; RB4_bit;
sbit sbit sbit sbit sbit sbit
LCD_RS_Direction LCD_EN_Direction LCD_D4_Direction LCD_D5_Direction LCD_D6_Direction LCD_D7_Direction
void void void void void void void void unsigned unsigned unsigned unsigned unsigned unsigned
at at at at at at
int int short short short int
at at at at at at
// // // // // //
pin pin pin pin pin pin
17 18 19 20 27 28
out out out out out out
TRISB2_bit; TRISB3_bit; TRISB7_bit; TRISB6_bit; TRISB5_bit; TRISB4_bit;
printn (int , unsigned short , unsigned short , unsigned short sign); perc(unsigned short ); delay1_sec(); delayp(); alert_vin(); alert_wdt(); salis(unsigned short ); bacteris(unsigned int , unsigned int , unsigned short , int ); get_ts(unsigned int ); get_tr(); get_pot(); get_pwm(unsigned short ); init_sali(); init_batteri();
unsigned short intz, mode; unsigned short T1, T2; // eeprom #define PWM_ADR #define dTS_ADR
0x0 0x1
#define EEPROM_START
0x2100
// costants #define #define #define #define
PWMMAX PWMMIN PWMSTEP1 PWMSTEP2
// * x 10 #define TMAX #define TMIN #define TSTEP1
100 0 5 1
450 150 30 11
#define TSTEP2
5
#define SALI #define BATTERI
0 1
// interrupt bits #define IPOT #define IVIN #define IWDT
0b00000001 0b00000010 0b00000100
#define number(n) #define TPWM #define TN
Lcd_Chr_Cp(n+48); 100 40
void interrupt( void) { if (INTF) { INTF_bit = 0; DEBUG = 1; intz = intz | IPOT; } } void main() { unsigned short i, n=0, pwm=0; unsigned int ts, tr, tp; int pre, deltaT, Tprimo, intT=0; /* default settings */ TRISA = 0xFF; TRISB = 0x01; TRISD = 0b00011100; OPTION_REG = 0b00001101;
// rimuovere 1 al terzo bit se da problemi
INTCON = 0b10010000; intz = 0; /* adc on */ ADCON0 = 0b10000001; /* portA as analog input */ ADCON1 = 0b10000000; PORTB = 0; TRIAC1 = 0; TRIAC2 = 0; DEBUG = 0; /* lcd intro */ delay_ms(10); Lcd_Init(); Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out_Cp("TC v. 0.92 pid"); delay1_sec(); Lcd_Cmd(_LCD_CLEAR);
if(VIN==0) { Lcd_Out_Cp("ZC error:"); Lcd_Cmd(_LCD_SECOND_ROW); Lcd_Out_Cp("connect cable"); 12
do { delay1_sec(); } while(VIN==0); Lcd_Cmd(_LCD_CLEAR); }
if(SW==SALI) pwm = init_sali(); else ts = init_batteri(); tp = get_tr(); while(1) { if(intz!=0) { GIE_bit = 0; TRIAC1=0; TRIAC2=0; if((intz&IPOT) != 0) if(mode==SALI) { pwm = get_pwm(pwm); salis(pwm); } else { ts = get_ts(ts); bacteris(ts, tr, 0, 0); } intz = 0; GIE_bit = 1; } if(mode==BATTERI) { tr = get_tr(); /* Calcolo dei parametri */ deltaT = ts-tr; Tprimo = tr-tp; intT += deltaT; #define A 3 #define B 50 #define C 200 // int limit: 32.000 e rotti, non di + if(intT > 32000) intT=32000; if(intT < -32000) intT=-32000; pre = (A*deltaT if(pre>100) pwm = 100; 13
B*Tprimo + intT/C)/10;
else if(pre<0) pwm = 0; else pwm = (unsigned int )pre; if(tr>ts) pwm = 0; bacteris(ts, tr, pwm, Tprimo); if(n>=4) { tp = tr; n=0; } else n++; } TRIAC1=0; TRIAC2=0; if(pwm!=100&&pwm!=0) for(i=0; i
14
Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_FIRST_ROW); Lcd_Out_Cp("Setting pwm: "); repeat: while(1) { pot = get_pot(); if(pot==4) if(pwm<=(PWMMAX-PWMSTEP1)) pwm+=PWMSTEP1; else pwm=PWMMAX; if(pot==3&&pwm<=(PWMMAX-PWMSTEP2)) pwm+=PWMSTEP2; if(pot==2) break; if(pot==1&&pwm>=(PWMMIN+PWMSTEP2)) pwm-=PWMSTEP2; if(pot==0) if(pwm>=(PWMMIN+PWMSTEP1)) pwm-=PWMSTEP1; else pwm=PWMMIN; Lcd_Cmd(_LCD_SECOND_ROW); perc(pwm); delay1_sec(); } pot = get_pot(); if(pot==2) Lcd_Out_Cp(" done."); else goto repeat; Eeprom_Write(PWM_ADR, pwm); delay1_sec(); Lcd_Cmd(_LCD_CLEAR); return pwm; } void perc(unsigned short T) { unsigned short n, p; p=100; while(p!=0) { n=T/p; n=n%10; number(n); p=p/10; } } void printn(int n, unsigned short cifre, unsigned short pos_virgola, unsigned short sign) { unsigned int p = 1; unsigned int c = 0; unsigned short i; unsigned short asd=0; if(sign!=0) if(n>=0) Lcd_Chr_Cp('+'); else Lcd_Chr_Cp('-');
15
for(i=1; i
} unsigned int get_ts(unsigned int temp) { unsigned short pot, tl, th; pot = get_pot(); if(pot==2) return temp; Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_FIRST_ROW); Lcd_Out_Cp("Setting temp: "); repeat: while(1) { pot = get_pot(); if(pot==4) if(temp<=(TMAX-TSTEP1)) temp+=TSTEP1; else temp=TMAX; if(pot==3&&temp<=(TMAX-TSTEP2)) temp+=TSTEP2; if(pot==2) break; if(pot==1&&temp>=(TMIN+TSTEP2)) temp-=TSTEP2; if(pot==0) if(temp>=(TMIN+TSTEP1)) temp-=TSTEP1; else temp=TMIN; Lcd_Cmd(_LCD_SECOND_ROW); printn(temp, 3, 2, 0); delay1_sec(); } pot = get_pot(); if(pot==2) Lcd_Out_Cp(" done."); else goto repeat; // ts = Eeprom_Read(dTS_ADR) + Eeprom_Read(dTS_ADR+1)*256; tl = temp&0xFF; th = (temp&0xFF00)>>8; Eeprom_Write(dTS_ADR, tl); Eeprom_Write(dTS_ADR+1, th); delay1_sec(); Lcd_Cmd(_LCD_CLEAR); return temp; } unsigned int get_tr(void) { unsigned int tr; // RA1 AD590 tr = ADC_Read(1); tr = 1024-tr; tr = tr*49; tr = tr/100; return tr; } void bacteris(unsigned int ts, unsigned int tr, unsigned short pwm, int Tprimo) { Lcd_Cmd(_LCD_FIRST_ROW); 17
Lcd_Out_Cp("Ts: "); printn(ts, 3, 2, 0); Lcd_Chr_Cp(0xDF); Lcd_Out_Cp(" G:"); printn(Tprimo, 2, 1, 1); Lcd_Cmd(_LCD_SECOND_ROW); Lcd_Out_Cp("Tr: "); printn(tr, 3, 2, 0); Lcd_Chr_Cp(0xDF); Lcd_Out_Cp(" P:"); Lcd_Out_Cp("%"); perc(pwm); } unsigned short init_sali() { unsigned short pwm; mode = SALI; pwm = Eeprom_Read(PWM_ADR); if(pwm>100) pwm = 100; Lcd_Out_Cp("Remove probe!"); delay1_sec(); Lcd_Cmd(_LCD_CLEAR); salis(pwm); return pwm; } unsigned int init_batteri() { unsigned int ts, tr; mode = BATTERI; ts = Eeprom_Read(dTS_ADR) + Eeprom_Read(dTS_ADR+1)*256; if(ts>TMAX) ts = TMAX; tr = get_tr(); bacteris(ts, tr, 0, 0); return ts; } void salis(unsigned short pwm) { Lcd_Cmd(_LCD_FIRST_ROW); Lcd_Out_Cp("PWM: "); perc(pwm); Lcd_Out_Cp("%"); }
10 – Schema elettronico Prima dello schema elettronico vero e proprio viene presentata la lista dei componenti utilizzati per il circuito, esportata direttamente dal CAD Eagle usato per disegnarlo: Exported from tc.sch at 08/06/2010 14.48.01 EAGLE Version 4.16r2 Copyright (c) 1988-2006 CadSoft Part Sheet
Value
Device
Package
Library
C1 C2 C3
220 uF 100 uF 4700 uF
CPOL-EUE3.5-8 CPOL-EUE3.5-8 CPOL-EUE3.5-8
E3,5-8 E3,5-8 E3,5-8
rcl rcl rcl
18
1 1 1
C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 D1 D2 D3 D4 D5 D6 D7 IC1 IC2 IC3 IC4 IC5 IC6 IC7 IC8 IC9 JP1 L1 LED1 LED2 LM7805 LM7812 OK1 OK2 OK3 Q1 Q2 Q3 Q4 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19
470 nF 100 V 470 nF 100 V 10 nF 10 nF 10 nF 10 nF 10 nF 220 uF 33 pF 33 pF 10 nF 0.1 uF 10 nF 470 nF 10 uF 10 nF 1N4004 1N4004 1N4004 1N4004 1N4004 1N4148 1N4148 PIC16F877P REF02 AD592CNZ LM311N TLE2021 LM358N LM358N LM358N 74LS86N 30 uH RED GREEN MOC3020M MOC3020M 4N35 BC547C BC547C 4 MHz BC547C 15 k 100 k 470 470 10 k 33 k 100 47 k 22 1/2 W 470 47 k 100 47 k 10 k 1 k 1 k 2 k 1 k 2 k
C-EU050-050X075 C-EU050-050X075 C-EU050-050X075 C-EU050-050X075 C-EU050-050X075 C-EU050-050X075 C-EU050-050X075 CPOL-EUE3.5-8 C-EU050-050X075 C-EU050-050X075 C-EU050-050X075 C-EU050-050X075 C-EU050-050X075 C-EU050-050X075 C-EU050-050X075 C-EU050-050X075 1N4004 1N4004 1N4004 1N4004 1N4004 1N4148 1N4148 PIC16F877P REF102U AD590ZR LM311N TL071P LM358N LM358N LM358N 74LS86N PINHD-1X16 L-USTJ6-U2 LED5MM LED5MM 78XXS 78XXS MOC3020M MOC3020M 4N35 BC337 BC337 XTAL BC337 R-US_0309/12 R-US_0309/12 R-US_0309/12 R-US_0309/12 R-TRIMM3006P R-TRIMM3006P R-US_0309/12 R-US_0309/12 R-US_0309/12 R-US_0309/12 R-US_0309/12 R-US_0309/12 PC16S R-US_0309/12 R-US_0309/12 R-US_0309/12 R-US_0309/12 R-US_0309/12 R-US_0309/12
C050-050X075 C050-050X075 C050-050X075 C050-050X075 C050-050X075 C050-050X075 C050-050X075 E3,5-8 C050-050X075 C050-050X075 C050-050X075 C050-050X075 C050-050X075 C050-050X075 C050-050X075 C050-050X075 DO41-10 DO41-10 DO41-10 DO41-10 DO41-10 DO35-10 DO35-10 DIL40 SO08 TO92 DIL08 DIL08 DIL08 DIL08 DIL08 DIL14 1X16 TJ6-U2 LED5MM LED5MM 78XXS 78XXS DIL06 DIL06 DIL06 SOT54A SOT54A Q SOT54A 0309/12 0309/12 0309/12 0309/12 RTRIM3006P RTRIM3006P 0309/12 0309/12 0309/12 0309/12 0309/12 0309/12 PC16S 0309/12 0309/12 0309/12 0309/12 0309/12 0309/12 19
rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl diode diode diode diode diode diode diode microchip burr-brown linear linear linear linear linear linear 74xx-us pinhead rcl led led v-reg v-reg optocoupler optocoupler optocoupler transistor-small-signal transistor-small-signal special transistor-small-signal rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl piher rcl rcl rcl rcl rcl rcl
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 R30 R31 S1 S2 T2 T3 TR1 X1 X2 X3
10 k 330 470 470 330 5 k 5 k 3.3 k 4.7 k 10 k 1 k 2 k BT134 BT134 220/12V 10VA
R-US_0309/12 R-US_0309/12 R-US_0309/12 R-US_0309/12 R-US_0309/12 R-TRIMM3006P R-TRIMM3006P R-US_0309/12 R-US_0309/12 R-US_0309/12 R-US_0309/12 R-US_0309/12 320-916 320-916 TIC225S TIC225S EI30-1 MPT2 MPT2 MPT2
0309/12 0309/12 0309/12 0309/12 0309/12 RTRIM3006P RTRIM3006P 0309/12 0309/12 0309/12 0309/12 0309/12 320-916 320-916 TO220DS TO220DS EI30-1 2POL254 2POL254 2POL254
20
rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl switch switch triac triac trafo con-phoenix-254 con-phoenix-254 con-phoenix-254
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1