Je vous propose de voir ici le convertisseur Analogique/numérique avec référence de tension interne !
Configuration :
- PIC18F46K22
- Plaque EasyPIC V7
- IDE : MikroC Pro for PIC Version 7.0.0
- Compilateur : Mikro prog suite fo PIC V 2.5
Pré-requis :
- Lire le tutoriel Convertisseur analogique/numérique
Le but :
La fonction de mikroC Read_ADC, ne fonctionne pas avec une référence de tension interne. C'est pourquoi il faut faire sa propre routine. Je vous propose donc de voir les différents registres à "régler" ainsi que le lancement d'une mesure, pour obtenir un comportement correct de votre ADC avec une référence interne !
1/ Préambule:
La référence interne, appelée FVR pour Fixed Voltage référence, va nous permettre d'avoir une référence FIXE quelque soit la tension qui alimente notre PIC.
Bien évidemment la FVR devra toujours être inférieur à la tension d’alimentation de votre PIC (Vdd). Dur dur d'avoir une référence de 4.096V si on alimente notre PIC en 3.3V
La tension FVR de "base" est de 1.024V. En la multipliant en interne, on peut obtenir une tension 2.048 et 4.096V.
Cependant tous les PIC ne supporte pas cette FVR, il vous faut vous referez à sa feuille de données.
dans 90% des cas on utilise Vss et Vdd comme référence, pour une conversion analogique numérique standard, car nos cher pics sont alimentés derrière un régulateur de tension, propre , bien stable et bien découplé !
certains se diront :
mais a quoi peut bien servir une lecture analogique avec référence interne ?
Prenons un exemple très concret !
Imaginons un instant, que cette tension d'alimentation du pic ne soit pas stable, mais au contraire qu'elle évolue avec le temps ! Comme par exemple une alimentation en direct sur une batterie, qui se viderait au fil du temps.
Dans ce cas il est devient difficile de pouvoir lire une valeur correcte avec une référence qui bouge aussi !
ceci est un exemple parmi tant d'autre, mais plutôt parlant je trouve !
2/ La configuration
On va configurer notre PIC étape par étape.
- Les Ports I/O
- Le registre ADCON0
- Le registre ADCON1
- Le registre ADCON2
- Le registre De configuration de FVR
Sur le PIC choisi pour le tutoriel il y a trois registre ADCONx à paramétrer !. Suivant votre PIC cela peut éventuellement être différent.
Je travaillerais avec la broche RA0 pour effectuer ma lecture analogique dans mon exemple.
Voici ce que ça peut donner avec les commentaires sur chaque lignes et les pages de la DS!
Code : Tout sélectionner
ANSELA = 0b00000001; // RA0 en analogique
TRISA = 0b00000001; // RA0 en entrée
// Configuration de l'ADCON0 page 304 ------------------------------------
// bit 7 non utilisé
// CHS<4:0> = choix du canal AN0 = 00000
ADCON0 = 0b00000001; // Go/~DONE = 0 , stand-by pour la conversion
// ADON = 1, activation du module AD
// Configuration de l'ADCON1 page 305 --------------------------------------
// TRIGSEL = 0, non utilisé
// bit <6:4>= non utilisé
ADCON1 = 0b00001000; // PVCFG <1:0> = 10 , REF+ = FVR BUF2
// NVCFG <1:0> = 00 , REF- = GND
// Configuration de l'ADCON2 page 306--------------------------------------
// ADFM = 1, justification à droite
// bit 6 non utilisé
ADCON2 = 0b10101001; // ACQT<2:0> = 101, temps d'acquisition de 12 Tad
// ADCS<2:0> = 001, Fosc/8
// Configuration de Vref page 344-----------------------------------------
// FVREN_bit = 1; // Activation du Vref
// FVRST = 1; // Prêt à être utilisé
VREFCON0 = 0b11100000 ; // FVRS<1:0> = 10 , Vref = 2.048V
// bit 3, 2, 1 et 0 non utilisé
Voila pour mon PIC, suivant le votre ce sera forcement différent ! L'important est de bien suivre les étapes :
- Configuration des I/O et ana/num
- Activer le module ADC et choisir le canal de lecture analogique
- Régler la tension de référence(FVR) basse et haute
- Régler la valeur de la FVR haute
- Après tout ces réglages, bien veiller à activer la FVR !
Vous voila maintenant avec une notion de la configuration manuelle de votre convertisseur analogique numérique !
Pour toutes questions sur des points particuliers, dirigez-vous sur le Forum, les membres se feront une joie de vous répondre
3/ La fonction de lancement d'une lecture
Pour démarrer un cycle de conversion, rien de bien compliqué, il faut mettre le bit correspondant au lancement à "1" .
Sur mon PIC il s'agit du bit "GO/DONE" du registre ADCON0, voir explication page 304 . Une fois ce bit à "1" le PIC lance une analyse de conversion. Une fois la conversion terminé ce bit ce met à "0" tout seul .
Très pratique ça, pour savoir quand on à fini la conversion, vous ne trouvez pas ?
On va juste mettre ce bit à "1" puis attendre qu'il passe à "0" . et le tour est joué !
Cela donne :
Code : Tout sélectionner
ADCON0.B1 = 1; // On démarre la conversion en mettant le bit à "1"
while (ADCON0.B1==1); // // Tant que le bit est à "1" je reste ici. En gros j'attends qu'il passe à 0
C'est bien beau ça , mais elle est où notre valeur de conversion !
Bonne question ! Toujours d’après la DS, la valeur de la conversion est stockée dans les registres ADRESL ( Adresse Low) et ADRESH (Adres High).
Et oui la valeur est sur 10,12 voir 14 bit, il faut donc 2 registres pour la stocker . Une partie haute et une partie basse.
Le bit ADFM du registre ADCON2 sert a formater cette valeur avec une justification à droite ou non .
Prenons par exemple la valeur sur 10 bit de : 0b1101001000 avec une justification à droite les 8 bits de poids faibles seront stocké dans ADRESL et les 2 restantes ( celle de poids fort donc ... ), seront stockées dans ADREH . soit :
ADRESL = 0b01001000
ADRESH = 0b11
Pour retrouver notre valeur une petite formule s'impose:
On multiplie par 256 le registre des bits de poids fort et on l'additionne au bit de poids faible.
Je nomme "temp" la variable de stockage !
Code : Tout sélectionner
Temp = ((ADRESH)*256) + ADRESL;
PS: la multiplication est gourmande en ressource, un décalage de 8 sur la gauche fait la même chose
Code : Tout sélectionner
Temp = ((ADRESH<<8) + ADRESL;
Et voila normalement vous avez toutes les cartes en main, pour vous configurez et utiliser le convertisseur analogique numérique avec une tension de référence interne !
La vidéo est légèrement tronquée, car l'alimentation de ma carte Easypic est fixe. Mais le principe reste le même , une référence interne, est utilisée. On voit donc apparaitre une plage morte, quand la tension dépasse la FVR, la valeur reste bloquée à 2.048V.
http://www.dailymotion.com/video/x587zfj
Conseils :
Il est préférable de faire une suite de mesure pour en tirer une moyenne, rendant le résultat bien plus fiable. En générale une série de 8 ou 16 valeurs est suffisantes et cela permet par simple décalage de bit de trouver sa moyenne ( plutôt qu'une division)