VENTOLA CONTROLLATA DALLA TEMPERATURA CON LCD

ventola controllata da temperaturaSemplice Schema con Microcontrollore per Controllare la Velocità di una Ventola in Base alla Temperatura e Visualizzarla su LCD…

 
 
 
 




 

INTRO

Con il PWM si può regolare la velocità di una ventola. In particolare può risultare superfluo lasciare una ventola usata per raffreddare un sistema o un dissipatore sempre accesa. Può risultare una soluzione migliore accendere la ventola solo ad una certa temperatura, e farla girare sempre più veloce all’aumentare della temperatura. Si può anche pensare di farla girare al massimo superata una certa temperatura massima. Tutto questo può essere fatto con un microcontrollore, un LM35 come sensore di temperatura e un semplice codice.

Inoltre visto che si dispone di sensore di temperatura e microcontrollore, può risultare interessante visualizzare su display LCD il valore della temperatura e il valore della velocità della ventola, mostrando in particolare la percentuale della velocità rispetto la velocità massima.

 




 

CODICE

Il codice semplicemente inizializza il PWM e l’ADC, dopo di che legge il valore dell’ADC lo converte in gradi centigradi e in base al valore esegue delle operazioni. Se la temperatura è più bassa di una certa quantità (nell’esempio 30 gradi) la ventola rimane spenta, se è maggiore di un’altra certa quantità (80 gradi) la ventola è accesa alla massima potenza mentre tra questi due valori la velocità aumenta in modo lineare con la temperatura.  Inoltre il valore della temperatura letto dall’ADC viene convertito in gradi centigradi e mostrato sul display LCD, mentre il valore del duty cycle viene usato per ricavare la percentuale della velocità della ventola.

Il codice è:

sbit LCD_RS at RB5_bit;
sbit LCD_EN at RB4_bit;
sbit LCD_D4 at RB3_bit;
sbit LCD_D5 at RB2_bit;
sbit LCD_D6 at RB1_bit;
sbit LCD_D7 at RB0_bit;

sbit LCD_RS_Direction at TRISB5_bit;
sbit LCD_EN_Direction at TRISB4_bit;
sbit LCD_D4_Direction at TRISB3_bit;
sbit LCD_D5_Direction at TRISB2_bit;
sbit LCD_D6_Direction at TRISB1_bit;
sbit LCD_D7_Direction at TRISB0_bit;


unsigned int Temp;                //Variabile temperatura
unsigned short DuCy, Vel;              //Variabile duty cycle
char txt0[7];
char txt1[7];

void main() {                     //Programma principale

  TRISC = 0;                      //PORTC uscite
  PWM1_Init(6250);                //Frequenza PWM 6.25KHz
  PWM1_Set_Duty(0);               //PWM spento
  PWM1_Start();                   //PWM acceso

  ADC_Init();                     //ADC inizializzato
  
  Lcd_Init();                        // Initialize LCD

  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);

  while(1){                       //Ciclo infinito

    Temp = ADC_Read(1);           //Leggi valore ADC
    Temp = Temp * 0.48828;        //Converti in gradi centigradi

    if(Temp < 30){                //Se la Temp è minore di trenta...
      DuCy = 0;
      PWM1_Set_Duty(DuCy);           //Ventola spenta
    }

    else if(Temp > 80){          //Se la Temp è maggiore di ottanta...
      DuCy = 255;
      PWM1_Set_Duty(DuCy);        //Ventola accesa al massimo
    }

    else{                        //Se Temp è nel range 30-80 gradi allora...
      DuCy = Temp * 3.18;        //Moltiplica Temp per 255/TempMax (255/80=3.18)
      PWM1_Set_Duty(DuCy);       //Imposta il duty cycle calcolato
    }

    Delay_ms(400);               //Aspetta 0.5S prima di ricontrollare la Temp

    Lcd_Cmd(_LCD_CLEAR);
    
    Lcd_Cmd(_LCD_FIRST_ROW);
    Lcd_Out_Cp(" Temp  ");
    IntToStrWithZeros(Temp, txt0);
    Lcd_Out_Cp(txt0);
    Lcd_Out_Cp("^C   ");
    
    Lcd_Cmd(_LCD_SECOND_ROW);
    Lcd_Out_Cp(" Vel   ");
    DuCy = DuCy/2.55;
    IntToStrWithZeros(DuCy, txt1);
    Lcd_Out_Cp(txt1);
    Lcd_Out_Cp("%");
  }
}

Prima di tutto si settano due variabili, una per il duty cycle, l’altra per la temperatura. Poi si inizializzano le PORTC come uscite, si setta il PWM con frequenza 6250Hz e lo si avvia, infine si setta l’ADC.

Nel ciclo infinito si legge il canale 1 dell’ADC e si moltiplica per 0.48828 ovvero il valore per 100 del quanto di conversione dell’ADC ((5/1023)*100)=0.48828) in modo tale da passare da bit a valore in gradi centigradi. Con questo valore si controlla se è minore di 30°C, e si setta nel PWM un duty cycle 0%, se invece è maggiore di 80°C si setta un duty cycle del 100%.

Se invece non è minore di 30°C o maggiore di 80°C, il duty cycle cresce con la temperatura e il fattore moltiplicativo, 3.18, è tale da far si che nell’intorno degli 80°C il duty cycle sia prossimo al 100%. Se si cambia la temperatura massima bisogna cambiare il valore di 3.18 con il valore 255/(temperatura massima scelta) .

Alla fine di tutto ciò si aspettano 0.5s prima di far iniziare le istruzioni per la scrittura dell’ADC, prima di tutto si pulisce LCD dalle scritte precedenti, pio si manda il cursore sulla prima riga e si scrive “Temp”, poi si converte la temperatura in stringa con gli zeri aggiuntivi e si visualizza anch’essa in successione, e infine sempre sulla stessa riga il simbolo per visualizzare che sono gradi centigradi. Poi si usa il comando per andare sulla seconda riga e si eseguono le stesse operazioni per la velocità.
 

SCHEMA

Lo schema è il seguente:

schema-ventola-temperatura-lcd

Il cristallo X1 è un quarzo da 8MHz e con i due condensatori da 22pF formano il circuito di oscillazione. La resistenza R4 serve per evitare che il PIC12F252 si resetti, mentre ai pin 20 si hanno 5V e ai pin 19 e 8 la massa dell’alimentazione.

Per ottenere i 5V si usa un integrato L7805 che prende in ingresso 12V utili ad alimentare la ventola. La capacità C4 serve per eliminare rumore e ripple dei 5V. il sensore di temperatura LM35 può essere alimentato sia a 5V sia a 12V, nello schema è alimentato a 5V, mentre la capacità C3 evita il rumore sull’uscita del sensore.

Dal pin 13 esce il segnale PWM che giunge alla base del transistor Q1 tramite la resistenza di protezione R1. Questo transistor funge da interruttore on/off e può essere sostituito da un mosfet per una maggiore efficienza. La ventola dovrebbe avere internamente un diodo contropolarizzato, per sicurezza si può inserire un 1N4001 con il catodo verso la tensione positiva e l’anodo verso il collettore del transistor.

L’LCD è alimentato a 5V e si utilizza un trimmer per generare la tensione per regolare il contrasto. Si utilizza la configurazione a 4 bit e tutti i pin non utilizzati sono connessi a massa. Il Katodo della retroilluminazione è connesso a massa e l’Anodo invece a VCC ovvero 5V con una resistenza da 470ohm.

La configurazione dei fuses è la seguente:

fuses-controllo-ventola-LCD

È tutto disabilitato tranne il brownout reset e l’oscillatore è in configurazione HS con quarzo a 8MHz.

ventola-controllata-da-temperatura-breadboard
 

DOWNLOAD

È possibile scaricare la simulazione, il file .hex e il file .c al seguente LINK!!!



 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

Lascia un commento

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