Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Commentez, partagez et proposez des Tutos en langage C !
Convertisseur Analogique-numérique
Jérémy
Administrateur du site
Administrateur du site
Messages : 2156
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » lun. 14 déc. 2015 12:42

Bonjour à tous,

Je vous propose ici un tutoriel pour vous expliquer comment lire une tension présente sur une broche du PIC avec le convertisseur A/N.


Image

Configuration :

- PIC18F46K22
- IDE : MikroC Pro for PIC Version 6.6.2
- Compilateur : Mikro prog suite fo PIC V 2.32
- Plaque Easy PIC V7
- LCD 16x2 en mode 4bits

fonctions utilisées:
- ADC_Read
- Sprintf



En effet certains PICs possèdent des convertisseurs analogique Numériques que nous appellerons ADC pour ( Analog-Digital Converter) ou CAN ( pour Convertisseur Analogique Numérique).

Attention!!
toutefois nous privilégierons le terme ADC afin de toujours bien spécifier qu'on parle du convertisseur car il existe un bus de communication qui s'appelle également CAN (Controller Area Network).

Il est vrai que dans certains cas cela peut s’avérer extrêmement utile d'avoir à sa disposition un convertisseur analogique/numérique :
  • Valeur de la position d'un potentiomètre
  • valeur de la tension d'une batterie/pile
  • Et différent capteur fournissant une valeur de tension analogique variable en sortie (capteur t°, thermistances etc ..)

Même si la lecture de cette tension est extrêmement simple, Il faut tout de même veiller à bien sélectionner et configurer notre entrée en analogique. Ça normalement vous devriez savoir le faire.

Image

RAPPEL :

- Pour le choix de la broche => rendez vous sur votre DS prenons ici comme exemple le PIC-18F46K22 en place sur ma carte EasyPIC7 .
En page 8 on trouve le sommaire succinct des broches E/S . On voit que RA1 est doté d'un convertisseur A/D, nommé ANA1 ( signifiant Analogique Channel-1).

- Ensuite en soft il nous faudra configurer cette broche en entrée analogique.
Pour cela nous utiliserons la syntaxe ANSELx:
ANalogique-SELection + nom du port
ANSELA = 0b00000010; met la broche RA1 en analogique.

- La valeur retournée sera sur 10 bits ( de 0 à 1023).

et voila le tour est joué !

Informations :

avec la fonction ADC_read il n'y a pas besoin d’initialisé le convertisseur ( contrairement à la fonction ADC_Get_Sample ).

Attention!!
Note : Cette fonction ne fonctionne pas avec une source de tension de référence externe , seulement avec une référence interne.

La précision :
Dans notre exemple le PIC est alimenté sous 5V. Avec un convertisseur sur 10bit cela nous donnera 5 / 1024 ~= 0.00488V par pas.

Donc suivant la valeur de la tension arrivant sur notre broche , le PIC nous renverra une valeur allant de 0 à 1023. Pour avoir la tension exact il nous suffira de multiplier ce chiffre par notre coefficient de 0.00488 (4.88mV sera notre précision).

Si une tension de 2.50 V est présente (soit la moitié de notre tension référence), l'ADC nous indiquera comme valeur 512 ( la moitié de 1024).

- La tension à mesurer sur la broche analogique, ne devra JAMAIS dépasser la tension Vcc ! Si votre tension est supérieur à Vcc il vous faudra utiliser un pont diviseur de tension pour ajuster votre tension afin de lui permettre dans le seuil de la tension d'alim du µC !
Précision apporté par Maï : en réalité la tension max sur une broche d'entrée se trouve dans les caractéristiques électriques de votre PIC ( voir tableau sur votre DS). En général il s'agit de (Vcc+0.3V) Image

L'exemple :

Voici un programme permettant de faire un petit voltmètre.

Nous recevons sur la broche RA1 une tension analogique, nous allons la lire avec le convertisseur puis nous allons l’enregistrer dans une variable, elle sera donc maintenant numérique.
Ensuite nous allons la convertir pour pouvoir afficher une tension approximative tout de même .

Pour des raisons de simplicité j'utilise ici la fonction sprintf pour afficher un nombre décimal (avec virgule).

Code : Tout sélectionner

/*##################################################################################
Programme de test d'un convertisseur analogique/numérique
Fait par Jérémy sur FantasPic.fr
- Version du "13-12-2015"
- MikroC version 6.6.2
- PIC 18F46K22 FOSC a 8MHZ , Quartz 8Mhz PLL disable
- Data-Shit du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
#################################################################################*/

// Connections de l'écran LCD
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Fin connections LCD

// Déclaration de nos variables utilisées tout au long du programme ---------------
 const float coef = 0.00488;   // Déclare une constante en Float
 float valeur_lue = 0;         // Initialisation d'une variable avec virgule flottante
 char buffer[16];             // Déclaration d'un tableau de 16 cases


//##################################################################################
//#########################      PROGRAMME PRINCIPAL       #########################
//##################################################################################
void main() {

    ANSELA = 0b00000010 ;       // Configure la broche RA1 en Analogique
    ANSELB = 0 ;                // Configure le PORTB en digital pour le LCD

    TRISA = 0b00000010;         // Met RA1 pin en entrée
    TRISB = 0;                  // PORTB en sortie

    Lcd_Init();                 // Initialisation du LCD
    Lcd_Cmd (_LCD_CLEAR);       // On efface l'écran
    Lcd_Cmd (_LCD_CURSOR_OFF);  // On arrête le clignotement du curseur
    delay_ms(100);              // Petite pause

    Lcd_Out (1,1, "Valeur sur RA1 :" ) ;       // Affichage d'un texte
    
//#######################    BOUCLE INFINIE     ####################################
 while (1) {                       // Boucle infinie

  valeur_lue = ADC_Read(1) ;      // On enregistre la valeur lue grâce à la fonction (ADC_Read)  dans une variable
  valeur_lue = valeur_lue * coef; // On convertit la valeur numérique en tension

  sprintf(buffer,"%.2f V",valeur_lue) ; // Avec sprintf on convertit notre nombre décimal en string.
  Lcd_Out (2,1, buffer ) ;              // Affichage sur la deuxième ligne du LCD
  delay_ms(100);            // pause entre deux lectures
 }
}


Bien évidemment ce code n'est pas optimisé, et mérite certainement quelques retouches par un expert ( que je ne suis pas).
On peut par exemple moyenner notre valeur car on voit quelques petits sur-sauts à l'affichage ( du à la grande quantité de mesure et la position du potar entre deux valeurs).

Il y a encore beaucoup de choses à dire, qui se feront certainement à la suite, quand ma propre expérience me le permettra ( et mon emploi du temps :D ). Comme les sources de tension référence externe ou les ADC en 12bits voir 16bits afin améliorer la précision ...

La vidéo de démonstration
http://www.dailymotion.com/video/x3i25vf

Le schéma :
Image

Sur ce montage qui n'est que la recopie de celui de ma carte EasyPIC_V7, la résistance de 220ohms n'est présente que pour éviter un accident lors des connexions du potar. Son rôle est de limiter le courant arrivant sur le l'entrée analogique du PIC en cas de court-circuit. ( Si le potar est mis en résistance variable en butée à 0 Ohms). Cette résistance est optionnelle .

Astuces :
Précision apporté par Mazertoc:
Les condensateurs permettent de filtrer (passe-bas) :
- s'affranchir des "gratouillis" d'un potar bas de gamme
- diminuer les "parasites"
- diminution apparente de la résistance de sortie du diviseur
Comme d'hab vos commentaires, remarques, ou corrections sont toujours le bienvenu !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Convertisseur Analogique-numérique
mazertoc
Passioné
Passioné
Messages : 201
Enregistré en : juillet 2015
Localisation : Auvernha

#2 Message par mazertoc » lun. 14 déc. 2015 15:28

Sur ce montage n'oubliez pas la résistance talon de 220ohms. Son rôle est d'éviter un court-circuit si votre potar est mis à 0 (donc un fil). Ceci fausse un peu tout petit peu la mesure qui n’attendra jamais Vcc car il y aura une petite tension aux bornes de cette résistance.


Pas de court-circuit, simplement 0V sur RA1. Cette résistance nuisible pour la mesure.

Pas Vcc mais GND.

Convertisseur Analogique-numérique
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#3 Message par Guest » lun. 14 déc. 2015 17:31

Petit rectification si tu le permets
La tension à mesurer sur la broche analogique, ne devra JAMAIS dépasser la tension Vcc ! Si votre tension est supérieur à Vcc il vous faudra utiliser un pont diviseur de tension pour ajuster votre tension afin de lui permettre dans le seuil de la tension d'alim du µC !

la tension entrée analogique VAin est de:

MIN= VSS - 0.3V
MAX= (VREF+) +0.3V, si (VREF+) =VCC donc MAX= VCC+0.3

donc dans ton cas la tension d'entrée peut allez a 5.3V

voir tableau 15.12 section 15.0 sur un 16F87XX du datasheet

Convertisseur Analogique-numérique
Jérémy
Administrateur du site
Administrateur du site
Messages : 2156
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#4 Message par Jérémy » mar. 15 déc. 2015 00:00

C'est mieux pour le schéma ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Convertisseur Analogique-numérique
mazertoc
Passioné
Passioné
Messages : 201
Enregistré en : juillet 2015
Localisation : Auvernha

#5 Message par mazertoc » mar. 15 déc. 2015 08:34

Jérémy a écrit :C'est mieux pour le schéma ?

Pourquoi la R 220 ohm ?
Il n'y a pas lieu de limiter le courant pour le CAN, c'est nuisible au temps de charge du condensateur d'entrée.

Dans ce cas de figure (mesure de variations de tension lentes) je suggère de placer un condensateur 1 µF
entre curseur et GND et 100 nF auplus près µC entre RA1 et GND

Convertisseur Analogique-numérique
Jérémy
Administrateur du site
Administrateur du site
Messages : 2156
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » mar. 15 déc. 2015 09:01

Comme j'ai également changer d’éditeur de schéma ( DIPTRACE que je conseille ), en fait j'ai seulement recopier le schéma de ma plaque d'essai.

J'ai cherché à comprendre et j'ai trouvé que c’était une résistance talon, qui permet que lorsque que le potard est en butée de 0 ohms , il se se comporte comme un fil. Si on remplace le potard par fil, on voit que Vcc est relié à la masse, donc cout-circuit non ?

Le but de la R 220 n'est pas de limiter le courant mais d’empêcher de brancher Vcc à la masse directement. Ce qui fausse la mesure je l'accorde un peu car au lieu d'aller de 0 à 10k ohms , le minimum sera de 220 et le maxi à 10k220 ohms. 220 par rapport à 10k n’amène pas une grande erreur.

Image


Sur ma vidéo on voit que j’arrive à obtenir 0V , mais pas les 5V de vcc. Au max j'ai 4.91V .
je suggère de placer un condensateur 1 µF entre curseur et GND et 100 nF au plus près µC entre RA1 et GND

Pour lisser le signal ? éliminer les parasites ?

Je cherche à comprendre, ainsi mon tuto ne sera que meilleur, mais je dois pouvoir répondre à ce que je marque pour ne pas mettre trop de grosses bêtises sur les tutos.

ne prends pas mes questions pour des contradictions , hein !!! juste que je cherche à comprendre :D
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Convertisseur Analogique-numérique
Jérémy
Administrateur du site
Administrateur du site
Messages : 2156
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#7 Message par Jérémy » mar. 15 déc. 2015 09:15

Petit rectification si tu le permets

Évidemment , c'est pour moi primordiale .
Sorry d'avoir été un peu long à répondre. je viens de vérifier ( toujours pour comprendre), et effectivement on trouve dans les caractéristiques électriques que la tension sur les entrées peuvent être de +0.3V .

Sur la DS ( lien en haut du post) de mon PIC d'essai, la tension max sur une entrée est également de +0.3V .

Image

Maintenant, sur un tuto de base comme le mien, je pense que je vais plus emmêler les gens avec ça. Mes tutos sont plus dédiés à des débutants, donc il faut aller au plus simple.

Je vais tout de même approtés une modifs pour ne pas mentir par omission, maintenant que moi même je suis au courant ! je ne pourrais pas dire que je ne savais pas Merci !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Convertisseur Analogique-numérique
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#8 Message par Guest » mar. 15 déc. 2015 09:48

Bonjour

Je ne souviens d'un post ou on clamait, haut est fort que la ref est la DS je ferme la parenthèse.
Ma remarque est quand même importante car le calcul du pas quantitatif en dépend et il se fait comme cela:

Q=(VREF+ - VREF-)/1024

la valeur en sorti se calcul comme ça:
N=valeur entier de (VA-Vref-)/Q

Pour ton cas :
VREF+ = +5v et que VREF- =0 On a donc 5/1024= 0.0048828125
Avec VA de 4V par exemple
(4-0)/0.0048828125=819

ON AURA pour 4V -> 819 en sortie du CAN

Sans expliquer le temps acquisition, temps de conversion,(rentre comme données dans le registre ADCON0), fréquence échantillonnage qui lors d'un tuto un peu plus approfondi est nécessaire. Au moins donner les calculs clef pour un CAN. Pas quantitatif et Valeur en sortie du CAN

Mais c'est ton tuto et bien sur, reste de simples suggestions

A+

Convertisseur Analogique-numérique
Jérémy
Administrateur du site
Administrateur du site
Messages : 2156
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#9 Message par Jérémy » mar. 15 déc. 2015 10:03

Yes , j'ai modifié un peu, le tuto suite à ta précision. J'attends les remarques de mazertoc pour changer le schéma, car il m'a mis le doute avec la R de 220 :D ;

dans 99.999% des cas la REF- sera la masse !

d'un tuto un peu plus approfondi est nécessaire

j'ai demandé une réflexion sur la possibilité de classer les Tutos par niveau de complexité. j'entends par la , si un jour un volontaire, se lance pour faire un Tuto très précis, il pourrait se voir attribué un repère EXPERT par exemple , tout comme débutant ou confirmé . A réfléchir , si le forum récupère encore du monde .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Convertisseur Analogique-numérique
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#10 Message par Guest » mar. 15 déc. 2015 10:29

je ne vais pas répondre pour lui mais ily a de très forte chance qu'il est raison ;)


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité