Semplice 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:
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:
È tutto disabilitato tranne il brownout reset e l’oscillatore è in configurazione HS con quarzo a 8MHz.
DOWNLOAD
È possibile scaricare la simulazione, il file .hex e il file .c al seguente LINK!!!