VOLTMETRO CON DISPLAY 7 SEGMENTI

Schema di un Voltmetro Realizzato con un Display 7 Segmenti a 3 o 4 Cifre e un Microcontrollore PIC16F o PIC18F…


 
 
 
 



 

INTRO

Con il seguente schema è possibile realizzare un voltmetro con due cifre decimali e due cifre prima della virgola. Permette quindi di misurare una tensione da 00.00V ad un massimo di 99.99V grazie ad un partitore resistivo in ingresso. Con una modifica può essere anche usato a tre cifre per tensioni da 000V a 999V. Per la visualizzazione viene usato un display 7-Segmenti vista la sa semplicità di utilizzo e viene usato il modulo ADC di un microcontrollore PIC16F o 18F per convertire il valore di tensione in digitale. Il programma è scritto in C con MIKROC e può essere compilato per qualsiasi microcontrollore che supporti la routine di lettura ADC.
 



 
CODICE

Il codice è il seguente:

unsigned int conversion;                    //Variabile valore convertito
long value;                                 //varibile valore tensione
unsigned char cifra;                        //Variabile cifra dei valori

unsigned short int kv = 2;                  //Costante conversione tensione
char segm[10] = {0xC0, 0xF9, 0xA4, 0xB0,    //vettore sette segmenti anado comune
                0x99, 0x92, 0x82, 0xF8,
                0x80, 0x90};
                
/*char segm[10] = {0xC0, 0xF9, 0xA4, 0xB0,  //vettore sette segmenti catodo comune
                0x99, 0x92, 0x82, 0xF8,     //da sostituire al precedente
                0x80, 0x90}; */             //se si usa in 7-seg a catodo comune

void sette_seg_4_cifre(long numero){        //sottoprogramma scrittura 7-seg 4 cifre

  cifra = numero / 10000;                   //Cifra decine di Volt
  PORTC = 0b00000001;                       //Accendi cifra decine
  //PORTC = 0b00001110;                     //Accendi cifra decine catodo comune
  PORTB = segm[cifra];                      //inizializza la cifra unità

  cifra = (numero / 1000) % 10;             //Cifra unità di Volt
  PORTC = 0b00000010;                       //Accendi cifra unità
  //PORTC = 0b00001101;                     //Accendi cifra unità catodo comune
  PORTB = segm[cifra];                      //inizializza la cifra unità
  PORTB.F7 = 0;                             //inserisci il punto dopo l'unità
  //PORTB.F7 = 0;                           //inserisci punto (catodo comune)

  cifra = (numero / 100) % 10;              //Cifra decimi di V
  PORTC = 0b00000100;                       //Accendi cifra decimi
  //PORTC = 0b00001011;                     //Accendi cifra decimi catodo comune
  PORTB = segm[cifra];                      //inizializza la cifra unità
        
  cifra = (numero / 10) % 10;               //Cifra centesimi di V
  PORTC = 0b00001000;                       //Accendi cifra centesimi
  //PORTC = 0b00000111;                     //Accendi cifra centesimi catodo comune
  PORTB = segm[cifra];                      //inizializza la cifra centesimi
}

void main (){                               //Programma principale

  TRISA = 0b00000001;                       //AN0 ingress0
  TRISB = 0b00000000;                       //PORTB uscite
  TRISC = 0b00000000;                       //PORTC uscite
  ADC_Init();

  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
    value = value * (long)kv;               //Moltiplico per la costante di tensione
        
    sette_seg_4_cifre(value);               //richiama il sottoprogramma di vusializzazione
  }
}

Il codice è scritto considerando di usare un display 7-segmenti ad anodo comune anche se nei commenti è scritta la soluzione per implementare il codice per un display a catodo comune. Prima di tutto si inizializzano le variabili per la conversione e per la visualizzazione della cifra e viene inizializzata un variabile KV per determinare il rapporto tensione in ingresso tensione convertita come vedremo successivamente. . Infine viene inizializzato il vettore che contiene la configurazione dell’uscita per visualizzare le cifre su display 7-segmenti da 0 a 9 per anodo comune.

La subroutine “sette_seg_4_cifre” riceve in ingresso il valore di tensione da visualizzare, estrae il valore delle decine di volt con una divisione e il modulo, accende la cifra corrispondente e  poi configura l’uscita per visualizzare la cifra che corrisponde al valore delle decine di volt. La stessa operazione viene fatta successivamente per le unità, decimi e centesimi di volt. Questa subroutine usa la tecnica di modulazione del tempo per visualizzare il valore completo, ovvero viene accesa una cifra alla volta molto velocemente in modo tale che venga visualizzato il valore completo. Questa subroutine è illustrata nella guida sui display 7-segmenti.

Nel programma principale si inizializza l’ADC, l’ingresso analogico e gli I/O digitali, in particolare PORTC e PORTB come uscite, le prime usate per accendere le cifre, le seconde per accendere i segmenti. Nel ciclo infinito viene letto il valore analogico dall’ingresso AN0, successivamente il valore viene convertito da binario in valore di tensione moltiplicando il valore convertito per 4.88 che è il passo di quantizzazione. Il valore di tensione viene infine inviato alla subroutine di visualizzazione su display 7-segmenti.

 





 
SCHEMA

Lo schema è il seguente:

Nello schema è utilizzato un PIC18F252 alimentato a 5V continui e stabilizzati con basso ripple con la massa connessa ai pin 8 e 19 e il terminale positivo connesso al pin 20. Il circuito di generazione del clock è formato da due capacità C1 e C2 da 22pF e da un cristallo al quarzo da 4MHz X1. La resistenza R9 evita che il microcontrollore si resetti.

La tensione da misurare entra dalle boccole Vin con il positivo connesso come da figura. Grazie al partitore R11 e R12 la tensione da misurare viene divisa per 2 vin modo tale da misurare una tensione massima di 10V. Portando il valore di R11 a 90Kohm si possono misurare tensioni fino a 100V. La partizione della tensione in ingresso giunge all’ingresso dell’ADC RA0.

Se si utilizza un display 7 segmenti a bassa corrente (3mA per ogni segmento massimo) non serve un buffer per accendere le cifre, ma il loro anodo in comune può essere connesso direttamente al microcontrollore e in particolare in questo caso direttamente alle uscite PORTC.

Essendo a bassa corrente e visto che ogni segmento ha una caduta di circa 2.5V come resistenza di protezione si può usare una resistenza con valore 1Kohm, le resistenze di protezione sono quindi quelle denominate da R1 a R8.

Se si usa un display 7-segmenti con corrente maggiore le resistenze di protezione vanno scelte più piccole e inoltre bisogna usare 4 buffer per accendere le cifre come si può vedere nella figura sottostante:

Se non si ha a disposizione un buffer, possono essere usati 4 transistor PNP connessi come in figura:

I buffer devono essere alimentati con la stessa tensione usata per il microcontrollore.

Per evitare di convertire anche del rumore in ingresso, si può collegare un condensatore da 10nF tra il pin RA0 e la massa.

 

DOWNLOAD

Potete scaricare il codice scritto con MIKROC e la simulazione fatta con PROTEUS al seguente LINK!!!




 

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

2 pensieri su “VOLTMETRO CON DISPLAY 7 SEGMENTI

Lascia un commento

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