Voltmètre numérique 3 digits avec PIC16F877


  Catégorie : Réalisation de cartes électroniques   Mise à jour le : 16/10/2017 13:54
  Ajouté par : Technologuepro   Lectures : 26280
  Commentaires : 0   [ Poster un commentaire ]   Note : Non évalué
  

Ce montage est un voltmètre 3 digits basé sur le microcontrôleur PIC16F877A. le calibre est de 0 à 48V DC avec une précision de 0.1V

Utile pour l’affichage de la tension dans vos applications qui ne nécessitent pas une grande précision, ce montage ne nécessite que 3 afficheurs 7 segments, un microcontrôleur et quelques résistances.

voltmetre numérique

Lecture de la tension par le microcontrôleur PIC16F877

La tension à mesurer est divisée par 10 grâce au montage pond diviseur de tension comme indiqué dans la figure suivante:

pond diviseur de tension

La tension qui entre au microcontrôleur est égale à R1/(R1+R2) * la tension à mesurer.

La diode D1 nous permet de protéger le microcontrôleur contre l’inversion de polarités de la tension à mesurer, toutefois cette diode crée une chute de tension équivalente à son seuil qui est égale à environ 0.6V dans notre cas. Cette chute de tension et la tolérance de précision des résistances étudiées devront être corrigées dans le programme du microcontrôleur par étalonnage.

La diode Zener D2 permet de protéger le microcontrôleur conte les surtensions. La tension sur la broche RA0 du microcontrôleur sera limité par la tension seuil de 4.7V de la diode Zener D2.

La tension du pond diviseur a besoin d'être interprétée par le microcontrôleur pour cela on a recours à un convertisseur analogique numérique (CAN), ou en anglais ADC (Analog to Digital Converter) dont la fonction est de traduire une grandeur analogique (tension) en une valeur numérique (codée sur plusieurs bits), proportionnelle au rapport entre la grandeur analogique d'entrée et la valeur maximale du signal.

ADC  convertisseur

Certains microcontrôleurs de type PIC (PIC16F876, PIC16F877,…) ont l'avantage de posséder un module convertisseur analogique numérique (CAN) interne à n bits.

Les microcontrôleurs PIC16F87x tel que le PIC16F876 et le PIC16F877 possèdent un convertisseur analogique numérique sur 10 bits, ce dernier permet de convertir une tension analogique comprise entre Vref- et Vref+ en une valeur numérique comprise entre 0 et 1023.

Pour exploiter ce convertisseur il est nécessaire de configurer certains registres dans le microcontrôleur, dans notre cas on s’intéressera uniquement au registre ADCON1 pour sélectionner et activer les entrées analogiques multiplexées avec le port A et le port E (PIC16F877).

registre ADCON1

Les bits PCFG3 … PCFG0 : Ces 4 bits permettent la sélection et la configuration des entrées analogiques à utiliser conformément au tableau ci-dessous :

configuration ADCON1

NB :

  • On s’intéressera uniquement au cas où VREF- = VSS = 0V et VREF+ = VDD = 5V (Cas des lignes colorées en rouge)
  • Les entrées analogiques du « PORTA » sélectionnées doivent être configurées en « Entrée » via le registre « TRISA »

Le bit ADFM : Le convertisseur CAN fournit un nombre binaire naturel de 10 bits (B9 B8 B7 B6 B5 B4 B3 B2 B1 B0).

Deux registres (2 x 8 bits) sont nécessaires pour stocker le résultat de la conversion.

Ce sont les registres :

  • ADRESH
  • ADRESL

Deux formats sont disponibles suivant la valeur du bit ADFM (bit 7 du registre ADCON1) :

Configuration ADFM

La fonction prédéfinie de mikropascal pro ADC_Init() permet de configurer automatiquement le module convertisseur analogique numérique du microcontrôleur avec les réglages suivants :

  • Vref- = 0V
  • Vref+ = 5V
  • Utilisation de l’horloge RC interne pour la conversion.

Cette fonction doit être appelée après avoir sélectionné les entrées analogiques avec le registre ADCON1

Deux autres fonctions ADC_Get_Sample(canal) et ADC_Read(canal) permettent de lire automatiquement le résultat de la conversion à partir des registres ADRESH et ADRESL

La fonction ADC_Get_Sample(canal) permet de lire le résultat de la dernière opération de conversion sur le canal fournit sous forme d’un mot sur 16 bits, la justification des 10 bits du résultat dépend du bit ADFM du registre ADCON1

Exemple : Lecture de la dernière valeur lue par le convertisseur analogique numérique sur le canal 0 (RA0/AN0)

var v : word

...

v := ADC_Get_Sample(0);

La fonction ADC_Read(canal) permet d’initialiser le convertisseur, démarrer une opération de conversion puis lire le résultat de conversion sur le canal fournit sous forme d’un mot sur 16 bits, la justification des 10 bits du résultat dépend du bit ADFM du registre ADCON1

Exemple :

Initialisation puis lecture de la valeur fournie par le convertisseur analogique numérique sur le canal 0 (RA0/AN0)

var v : word

...

v := ADC_Read(0);

Affichage de la tension par le microcontrôleur PIC16F877

Pour afficher la tension sur 3 digits avec un chiffre après la virgule (00.0 à 48.0) on a besoin de trois afficheurs 7 segments.

Dans notre cas on n’aura pas besoin de décodeurs 7 segments car les afficheurs seront directement liés au microcontrôleur PIC16F877 (il y a suffisamment de PINs libres)

Pour des raisons de simplification du routage de la carte j’ai relié les PIN des afficheurs 7 segments aux Pin du microcontrôleur pas dans l’ordre mais de façon à minimiser au maximum les croisements des fils sur le typon.

 Schéma de simulation de la carte

 

 Programme 

program MyProject;
const A1B: array[10] of byte = (%01011111,%00000110,%01101011,%00101111,%00110110,
                                %00111101,%01111101,%00000111,%01111111,%00111111);
const A1C: array[10] of byte = (%00000000,%00000000,%00000000,%00000000,%00000000,
                                %00000000,%00000000,%00000000,%00000000,%00000000);
const A1D: array[10] of byte = (%00000000,%00000000,%00000000,%00000000,%00000000,
                                %00000000,%00000000,%00000000,%00000000,%00000000);
const A2B: array[10] of byte = (%00000000,%00000000,%00000000,%00000000,%00000000,
                                %00000000,%00000000,%00000000,%00000000,%00000000);
const A2C: array[10] of byte = (%11010011,%00000010,%01010001,%01000011,%10000010,
                                %11000011,%11010011,%01000010,%11010011,%11000011);
const A2D: array[10] of byte = (%00010000,%00010000,%10010000,%10010000,%10010000,
                                %10000000,%10000000,%00010000,%10010000,%10010000);
const A3B: array[10] of byte = (%00000000,%00000000,%00000000,%00000000,%00000000,
                                %00000000,%00000000,%00000000,%00000000,%00000000);
const A3C: array[10] of byte = (%00100000,%00100000,%00000000,%00100000,%00100000,
                                %00100000,%00100000,%00100000,%00100000,%00100000);
const A3D: array[10] of byte = (%01001111,%01000000,%01100111,%01100101,%01101000,
                                %00101101,%00101111,%01000100,%01101111,%01101101);
var tension : longint;
    centaine : byte;
    dizaine : byte;
    unite,i: byte;
begin
trisb:=0;
trisc:=
0;
trisd:=
0;
portB:=A1B[
8] or A2B[8] or A3B[8] ;
portc:=A1C[
8] or A2C[8] or A3C[8] ;
portd:=A1D[
8] or A2D[8] or A3D[8] ;
delay_ms(
1000);
adcon1:=
$80;
adc_init();
while true do
begin
   tension:=adc_read(0);
   tension:=tension * 486;
   tension:=tension/1024;
   centaine := (tension div 100) mod 10;
   dizaine  := (tension div 10) mod 10;
   unite := tension  mod 10;
   
   
portB:=A1B[centaine] or A2B[dizaine] or A3B[unite] ;
   portc:=A1C[centaine] or A2C[dizaine] or A3C[unite] ;
   portd:=A1D[centaine] or A2D[dizaine] or A3D[unite] ;
   delay_ms(100);
   portB:=A1B[centaine] or A2B[dizaine] or A3B[unite] ;
   portc:=A1C[centaine] or A2C[dizaine] or A3C[unite] or 4 ;
   portd:=A1D[centaine] or A2D[dizaine] or A3D[unite] ;
   delay_ms(100);
end;
end.

Réalisation pratique

Pour simplifier encore la carte j’ai diviser le schéma en deux parties qui feront à leur tour deux carte séparées qui seront liées ensemble par des connecteurs de type SIL

schéma de la carte

 

Routage

typon de la carte

typon de la carte en 3D

image du voltmetre

Vidéo :

Téléchargement :

Carte électronique + Routage

Programme Mikropascal + simulation


  

   Lectures recommandées sur ce thème :

Cours

Cours Mesure - Catégorie : Cours Electricité

Annuaire

EduLabo -  (18/08/2013)

Forums

programmes general -  (16/04/2013)
voltmétre numérique a base de pic 16f877 -  (13/02/2013)

Tags

                                       


  Commentaires



Aucun commentaire dans la base de données
*Poster un commentaire :
Uniquement les membres peuvent poster des commentaires

Haut de page

© 2024 Technologue pro, cours électricité électronique informatique · © 2007 - 2024 Technologue pro - Ressources pédagogiques pour l'enseignement technologique en Tunisie
Usage dans un cadre strictement académiqueMontages electroniques simples, pour les amateurs et pro de l'électronique, offre de montage electronique et cours en ligne gratuit: programmateurs de PIC USB, chargeur pour batteries, insoleuse 3 tubes ultra violet pour circuits imprimés et carte développement microcontrôleur PIC

Licence - Sitemap - Qui somme nous ? - confidentialité- Tunisie Index
J'accepte
Ce site web utilise des cookies. Nous utilisons des cookies pour vous offrir la meilleure expérience sur notre site Web. Plus d'infos