Schema per Realizzare un Misuratore di Tensione o Voltmetro con Display LCD per le Uscite degli Alimentatori ATX del Computer…
INTRO
Nei computer ad alte prestazioni risulta interessante monitorare le prestazioni dell’alimentatore visto che da esso dipendono le prestazioni di tutti gli altri componenti. Quindi risulta interessante conoscere tutte le tensioni di uscita in modo tale da monitorare come si comporta l’alimentatore sotto sforzo. In ogni caso, anche se non si ha un computer ad alte prestazioni è interessante e anche molto bello mostrare su display LCD i valori di tensione delle uscite dell’alimentatore ATX.
Per il seguente progetto si usa un microcontrollore PIC18F252 che serve come convertitore i valori logici, ad elaborarli e infine a mostrarli su display LCD. Il circuito è pensato per avere una misura con la massima precisione, inoltre utilizza uno stabilizzatore di tensione per generarsi una tensione priva di rumore e con un valore che non dipende dalla tensione erogata dall’ATX.
Il circuito misura le principali tensioni che vengono usate all’interno del PC e le mostra a due a due ogni secondo. In particolare si vanno a misurare i 5V positivi e negativi, i 3.3V e i 12V e in particolare la tensione di alimentazione del circuito di misura si ottiene con un l7805 a partire dai 12V.
CODICE
Il codice è il seguente:
sbit LCD_RS at RB0_bit; //Configurazione Pin LCD
sbit LCD_EN at RB1_bit; //RB0 -> RS
sbit LCD_D4 at RB2_bit; //RB1 -> EN
sbit LCD_D5 at RB3_bit; //RB2 -> D4
sbit LCD_D6 at RB4_bit; //RB3 -> D5
sbit LCD_D7 at RB5_bit; //RB4 -> D6
//RB5 -> D7
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;
unsigned char cifra; //Variabile cifra dei valori
unsigned int conversion; //Variabile valore convertito
long value; //varibile valore tensione corrente
unsigned short int kv533 = 2; //Costante conversione tensione
unsigned short int kv12 = 3; //Costante conversione tensione
bit high, low;
void visualizza (long value){
cifra = value / 10000; //Cifra decine di Volt
cifra = cifra + 48; //Trasformazione in codice ASCII
Lcd_Chr_CP(cifra); //Scrivi le centinaia
cifra = (value / 1000) % 10; //Cifra unità di Volt
cifra = cifra + 48; //Trasformazione in codice ASCII
Lcd_Chr_CP(cifra); //Scrivi le centinaia
Lcd_Chr_CP('.'); //Scrivi "."
cifra = (value / 100) % 10; //Cifra centinaia di mV
cifra = cifra + 48; //Trasformazione in codice ASCII
Lcd_Chr_CP(cifra); //Scrivi le centinaia
cifra = (value / 10) % 10; //Cifra decine di mV
cifra = cifra + 48; //Trasformazione in codice ASCII
Lcd_Chr_CP(cifra); //Scrivi le centinaia
Lcd_Chr_CP('V'); //Scrivi "V"
}
void main (){ //Programma principale
TRISA = 0b00011111; //AN0-AN4 ingressi
Lcd_Init(); //Inizializza LCD
Lcd_Cmd(_LCD_CURSOR_OFF); //Cursore non visibile
Lcd_Cmd(_LCD_CLEAR); //Pulisci LCD
while (1) { //Ciclo infinito
conversion = ADC_Read(0); //Converti AN0
value = (long)conversion * 5000; //*(5000/1023) = * 4.8876
value = value / 1023; //Trasformo il valore da binario a decimale
Lcd_Chr(1, 1, 'O'); //Scrivo "OUT 3.3 =" sulla prima
Lcd_Chr(1, 2, 'U'); //partendo dalla posizione 1
Lcd_Chr(1, 3, 'T');
Lcd_Chr(1, 4, ' ');
Lcd_Chr(1, 5, '3');
Lcd_Chr(1, 6, '.');
Lcd_Chr(1, 7, '3');
Lcd_Chr(1, 8, ' '); //Lascio uno spazio vuoto
Lcd_Chr(1, 9, '='); //Lascio uno spazio vuoto
Lcd_Chr(1, 10, ' '); //Lascio uno spazio vuoto
Visualizza(value); //Mostro valore di tensione
conversion = ADC_Read(1); //Converti AN1
value = (long)conversion * 5000; //*(5000/1023) = * 4.8876
value = value / 1023; //Trasformo il valore da binario a decimale
value = value * kv533; //Moltiplico per la costante di tensione
Lcd_Chr(2, 1, 'O'); //Scrivo "OUT +5" sulla seconda riga
Lcd_Chr(2, 2, 'U'); //partendo dalla posizione 1
Lcd_Chr(2, 3, 'T');
Lcd_Chr(2, 4, ' ');
Lcd_Chr(2, 5, '+');
Lcd_Chr(2, 6, '5'); //Lascio uno spazio vuoto
Lcd_Chr(2, 7, ' '); //Lascio uno spazio vuoto
Lcd_Chr(2, 8, '='); //Lascio uno spazio vuoto
Lcd_Chr(2, 9, ' ');
Lcd_Chr(2, 10, ' ');
Visualizza(value); //Visualizza valore
Delay_ms(1500); //Delay di 1.5Sec
conversion = ADC_Read(2); //Converti AN2
value = (long)conversion * 5000; //*(5000/1023) = * 4.8876
value = value / 1023; //Trasformo il valore da binario a decimale
value = value * kv533; //Moltiplico per la costante di tensione
Lcd_Chr(1, 1, 'O'); //Scrivo "OUT -5" sulla prima riga
Lcd_Chr(1, 2, 'U'); //partendo dalla posizione 1
Lcd_Chr(1, 3, 'T');
Lcd_Chr(1, 4, ' ');
Lcd_Chr(1, 5, '-');
Lcd_Chr(1, 6, '5');
Lcd_Chr(1, 7, ' ');
Lcd_Chr(1, 8, '='); //Lascio uno spazio vuoto
Lcd_Chr(1, 9, ' '); //Lascio uno spazio vuoto
Lcd_Chr(1, 10, '-'); //Lascio uno spazio vuoto
Visualizza(value);
conversion = ADC_Read(3); //Converti AN3
value = (long)conversion * 5000; //*(5000/1023) = * 4.8876
value = value / 1023; //Trasformo il valore da binario a decimale
value = value * kv12; //Moltiplico per la costante di tensione
Lcd_Chr(2, 1, 'O'); //Scrivo "OUT +12" sulla prima riga
Lcd_Chr(2, 2, 'U'); //partendo dalla posizione 1
Lcd_Chr(2, 3, 'T');
Lcd_Chr(2, 4, ' ');
Lcd_Chr(2, 5, '+');
Lcd_Chr(2, 6, '1'); //Lascio uno spazio vuoto
Lcd_Chr(2, 7, '2'); //Lascio uno spazio vuoto
Lcd_Chr(2, 8, ' '); //Lascio uno spazio vuoto
Lcd_Chr(2, 9, '=');
Lcd_Chr(2, 10, ' ');
Visualizza(value);
Delay_ms(1500); //Delay di 2Sec
}
}
Prima di tutto si inizializzano le connessioni con il display LCD e si inizializzano le variabili utili per il codice.
Il primo segmento di codice è un subroutine usata per visualizzare il valore di tensione; si va a scomporre il valore in decine, unità, decimi e centesimi e va a visualizzare una cifra alla volta seguita infine dalla lettera V che indica Volt.
Nel programma principale si inizializza LCD e ADC, poi si legge uno per volta l’ingressi analogici, si converte il valore letto in valore di tensione, si visualizza la stringa che indica cosa si sta leggendo e infine sulla stessa riga il valore letto. Stessa cosa succede per la seconda riga del display, poi si attendono 1.5 secondi e si vanno a visualizzare altri due valori di tensione.
Le operazioni di lettura e visualizzazione continuano finchè l’alimentazione fornisce una tensione opportuna.
SCHEMA
Lo schema è il seguente:
Le 4 tensioni ovvero 3.3V, 5V, -5V e 12V entrano nel circuito e la tensione a 12V viene portata a 5V grazie ad un L7805 che stabilizza la tensione e fa si che l’ADC interno al PIC riceva una tensione costante. La tensione di alimentazione esce dal 7805 e giunge al pin 20 del microcontrollore e al display oltre che alla retroilluminazione del display con una resistenza da 470 Ohm. Il contatto negativo invece è in comune per tutti gli elementi.
Il circuito di oscillazione è formato da un quarzo a 4MHz X1 e dai condensatori C1 e C2 mentre R1 mantiene in funzione il microcontrollore. RV1 Serve a regolare il contrasto del display.
Gli ingressi analogici del microcontrollore supportano una tensione massima di 5V, quindi solo la tensione a 3.3V giunge direttamente al microcontrollore, la tensione a 5V viene divisa per 2 con due resistenze identiche da 1kOhm mentre la tensione a 12V viene divisa per da 3 resistenze da 1kOhm.
Per quanto riguarda la tensione negativa, questa deve essere invertita ed essendo vicina a 5V divisa per due come fatto per la tensione positiva +5V. Si usa quindi U2A, R8 ed R7 per realizzare un amplificatore invertente con guadagno 0.5 per passare da -5V a una tensione di 2.5V che verrà letta in modo corretto dal microcontrollore e poi convertita in valore di tensione grazie alle costanti. Il circuito su breadboard è così realizzato:
Per quanto riguarda i collegamenti, per sicurezza prima si consiglia di usare un voltmetro e testare le tensioni in uscita dall’ATX in modo tale da trovare i fili giusti delle uscite che si vogliono misurare.
Per avere un sistema più preciso si consiglia di utilizzare un regolatore diverso dal 7805 e in particolare uno stabilizzatore a maggiore precisione o regolabile in modo tale da tarare il circuito.
DOWNLOAD
Potete scaricare la simulazione del circuito con PROTEUS e i codici scritti con MIKROC al seguente LINK!!!