VOLTMETRO PER ALIMENTATORE ATX

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!!!





 

[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 *