CONTROLLO TEMPERATURA CON CELLA DI PELTIER

Schema per Realizzare un Controllo di Temperatura grazie a una Cella di Peltier…

 

 

 

 




 

INTRO

Una cella di Peltier è un elemento a semiconduttore formato da pezzi di silicio N e silicio P connesse tra loro da un pezzo di metallo. Grazie a una corrente che fluisce al suo interno, un lato si riscalda e  l’altro si raffredda, funge come una pompa di calore che preleva calore da un lato e lo trasferisce all’altro, facendo si che un lato si raffreddi e l’altro si riscaldi.

Di per se la cella di Peltier ha una bassa efficienza, quindi genera molto più calore di quello che trasferisce da un lato all’altro. In base al verso in cui scorre la corrente il lato che si raffredda e quello che si riscalda possono invertirsi.

Il seguente schema sfrutta questo principio per regolare la temperatura di un piccolo spazio (a meno che non si usano molte celle di Peltier con un consumo elevatissimo di potenza) ovvero mantenerla costante anche se la temperatura esterna varia.

È stato pensato per un contenitore di polistirolo di un metro cubo circa al cui interno la temperatura deve essere mantenuta costante per inserirvi un fermentatore per la birra. La cella di Pentier è chiusa tra due dissipatori con ventola in modo tale da riscaldare o raffreddare l’aria all’interno della scatola mentre la cella di Peltier con i dissipatori è montato all’interfaccia della scatola.

Il controllo è realizzato con microcontrollore, lo schema dispone di due pulsanti per regolare la temperatura voluta e le temperature all’interno della scatola e la temperatura settate vengono mostrate su un display LCD.

 




 

CODICE

Il codice è il seguente:

sbit LCD_RS at RC0_bit;                     // Configurazione Pin I/O
sbit LCD_EN at RC1_bit;                     //Indico alla libreria
sbit LCD_D4 at RC2_bit;                     //come è connesso l'LCD
sbit LCD_D5 at RC3_bit;
sbit LCD_D6 at RC4_bit;
sbit LCD_D7 at RC5_bit;

sbit LCD_RS_Direction at TRISC0_bit;        //Indico se ho ingressi o uscite
sbit LCD_EN_Direction at TRISC1_bit;
sbit LCD_D4_Direction at TRISC2_bit;
sbit LCD_D5_Direction at TRISC3_bit;
sbit LCD_D6_Direction at TRISC4_bit;
sbit LCD_D7_Direction at TRISC5_bit;

unsigned int short adcvalue;              //Variabile valore uscita da ADC
unsigned short int Tem1, Set_Temp;        //Variabile temperatura e settaggio
float Tem;                                //Valore convertito della temperatura
char Text[7];                             //Stringa contenente la temperatura
bit flag;

void print_temp(char text){        //Sottoprogramma per la visualizzazione della temperatura
  Lcd_Cmd(_LCD_SECOND_ROW);         //invia cursore sulla seconda riga
  Lcd_Out_Cp(text);                 //scrivi la parte intera della temperatura
  Lcd_Chr_Cp(223);                  //codice per scrivere il simbolo di grado °
  Lcd_Chr_Cp('C');                  //scrivi C
}

void EXT_INT() iv 0x0008 ics ICS_AUTO {    //0018h per bassa priorità, 0008h per alta priorità

 if(PORTB.B0==1){                          //Controllo tasto incremento
   if(Set_Temp < 50) Set_Temp ++;
 }
 else {                                    //Controllo tasto decremento
   if(Set_Temp > 0) Set_Temp --;
 }

 EEPROM_Write(0x00, Set_Temp);             //Salva valore su memoria
 Delay_ms(50);                             //Ciclo antirimbalzo


 INTCON.INT0IF = 0;                        //reset del flag int0
 INTCON3.INT1IF = 0;                       //reset del flag int1
}


void main(){                        //Programma principale

  Lcd_Init();                       // Initializza LCD
  Lcd_Cmd(_LCD_CLEAR);              // Pulisci LCD
  Lcd_Cmd(_LCD_CURSOR_OFF);         // Cursore non visibile

  ADC_Init();                       // Initializza il modulo ADC con valori di default

  TRISB.B0 = 1;                     //pin di ingresso per pulsante + set temp
  TRISB.B1 = 1;                     //pin di ingresso per pulsante - set temp
  TRISC.B6 = 0;                     //Uscita controllo peltier 1
  TRISC.B7 = 0;                     //Uscita controllo peltier 2

  RCON.IPEN = 0;                    //disabilito la priorità degli interrupt
  INTCON.GIE = 1;                   //attivo gli interrupt

  INTCON2.INTEDG0 = 1;              //interrupt sul fronte di salita  int0
  INTCON.INT0IE = 1;

  INTCON2.INTEDG1 = 1;              //interrupt sul fronte di salita  int1
  INTCON3.INT1IE = 1;

  Set_Temp = EEPROM_Read(0x00);     //Leggi valore su memoria

  while(1){                         //Ciclo infinito

    adcvalue = ADC_Get_Sample(0);      //Lettura da ADC
    Tem = 0.48828 * adcvalue;          //Conversione da Byte a Decimale
    Tem1 = Tem;                        //conversione in intero

    if (Tem1 < (Set_Temp-1)){
      PORTC.F6 = 1;                    //riscalda lato interno
      PORTC.F7 = 0;
    }
    else if (Tem1 > (Set_Temp+1)){
      PORTC.F6 = 0;                    //raffredda lato interno
      PORTC.F7 = 1;
    }
     else{
      PORTC.F6 = 0;                   //spegni cella
      PORTC.F7 = 0;
     }

    IntToStr( Tem1, Text );            //conversione in stringa
    Lcd_Cmd(_LCD_FIRST_ROW);           //invia cursore sulla PRIMA riga
    Lcd_Out_Cp("TEMPERATURA:    ");
    print_temp(text);                  //Invia i valori da visualizzare al sottoprogramma

    delay_ms(1000);                     //Ritardo visualizzazione temperatura

    IntToStr(Set_Temp, Text );         //conversione in stringa
    Lcd_Cmd(_LCD_FIRST_ROW);           //invia cursore sulla PRIMA riga
    Lcd_Out_Cp(" SET TEMPERATURA:");
    print_temp(text);                  //Invia i valori da visualizzare al sottoprogramma

    delay_ms(600);
  }
}

Prima di tutto nel codice bisogna inizializzare l’LCD e le variabili necessarie per il programma. Poi si crea una sotto porzione di codice per pilotare l’LCD, questa sotto funzione (print_temp) riceve una stringa che contiene il dato di temperatura e vi aggiunge “°C”.

Dopo di che vi è una routine di interrupt che controlla quale tasto è stato premuto e modifica la soglia del termostato, inoltre la memorizza nella memoria permanente per evitare che in caso di reset la soglia cambi.

Nel programma principale si inizializza LCD, ingressi e uscite, ADC e Interrupt e si legge dalla memoria un eventuale soglia salvata. La cella di Peltier viene pilotata da un ponte ad H, quindi servono due uscite per controllarla, se le uscite PB6, PB7 sono 10 allora si riscalda l’interno, se 01 l’interno si raffredda mentre se 00 la cella è spenta.

Inoltre si converte il valore della temperatura in stringa e si visualizza sul display LCD prima la stringa della temperatura e poi quella della soglia.

I fuses sono così configurati:

SCHEMA

Lo schema totale è composto da tre parti, l’alimentazione, il controllo con microcontrollore e il ponte ad H per pilotare la cella di Peltier.

Lo schema della sezione di alimentazione è il seguente:

Il trasformatore utilizzato è un trasformatore con potenza di 50VA vista la potenza della cella di Peltier da 60W ovvero 12V, 5A. Il primario è da 230Vrms e il secondario da 9V. Per l’alimentazione del microcontrollore servono 5V continui, e si generano grazie a D5, C3 e U3.

Per la cella di Peltier servono un minimo di 7V fino ad un massimo di 12V. Utilizzando il trasformatore da 9Vrms e 4 diodi Schottky con almeno una tolleranza di corrente superiore a 10A.

Questa tensione è a doppia semionda non filtrata con picchi di circa 11.5V, se si vuole si filtra con un condensatore vicino al ponte ad H.

Lo schema del controllo è:

Il sensore LM35 è alimentato con una tensione di 5V e l’uscita del sensore è connesso al PIN2 che è il primo canale dell’ADC. Il PIN1 bisogna portare un livello logico alto per evitare che il PIC18F252 si resetti, questo viene fatto con una resistenza di pull-up da 10KΩ. Il circuito di oscillazione è composto dal risuonatore al quarzo X1 da 4 MHz e dai condensatori C1 e C2.

La resistenza variabile RV1 serve per la regolazione del contrasto dell’LCD che viene alimentato anch’esso a 5V. Nello schema manca l’alimentazione della retroilluminazione dell’LCD che viene fatta collegano il catodo a massa e l’anodo a VCC interponendo però una resistenza da 470Ω.

Il PIC18F252 viene alimentato a 5V collegando i PIN8 e PIN19 a massa e il PIN20 a VCC. I tasti hanno una resistenza di pull-up ciascuno e sono R3 e R2.

Le uscite PB6 e PB7 ovvero pin 17 e 18 vanno connesse al ponte ad H per controllarlo.

Il ponte ad H è così fatto:

L’alimentazione arriva dallo schema precedente e se si vuole si filtra con il condensatore C4. Senza filtro la potenza della cella è dio 30W, con un condensatore da 4700uF si arriva a 36W mentre con uno da 10mF si arriva a 42W mentre per arrivare al massimo dei 60W serve un trasformatore da 10V. Se si usa un ponte di diodi al silicio va usato un trasformatore da 10V di secondario per avere stessi valori di potenza mentre da 11V se si vuole il massimo della potenza con un ponte di diodi al silicio.

R5 pilota un transistor NPN che fa si che sui gate del primo ramo vi sia una tensione di 0V o pari alla tensione di alimentazione del ponte ad H. La stessa cosa succede sul ramo con R6, Q5, Q1B e Q3. Se controll1 è ad un valore alto e controll2 a livello basso allora sui gate dei transistor Q1A e Q2 vi sono 0V mentre sui gate degli altri due Mosfet vi è una tensione pari alla tensione di alimentazione. Q1A e Q3 sono accesi, gli altri spenti, quindi si ha una corrente che fluisce da + a -. Nel caso contrario ovvero controll2 alto e controll1 basso, fa si che Q2 e Q1B siano accesi, gli altri spenti facendo scorrere la corrente dal – al + invertendo la pompa di calore. Se controll1 e controll2 sono a 0 è tutto spento. Se uno dei due pin di controllo è a livello alto D6 e D7 portano il livello alto sul gate di Q6 accendendolo e facendo si che le ventole si accendano.

Il circuito montato su breadboard e la cella di Peltier sono così fatti:

 

DOWNLOAD

Potete scaricare la simulazione del circuito con PROTEUS al seguente LINK!!!




 

[Voti Totali: 1 Media Voti: 5]
Segui la Nostra Pagina Facebook: Facebook

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *