1- Caractéristiques du convertisseur ADC
ADC = Analog to Digital Converter = convertisseur analogique - numérique (CAN en français)
Le rôle du convertisseur analogique - numérique est de transformer une tension analogique en un nombre binaire (proportionnel à la tension analogique).
Pour en savoir plus sur la conversion analogique - numérique
Le microcontrôleur PIC 16F88 a l'avantage de posséder un module ADC interne, contrairement au PIC 16F84A ou 16F628A (il faut alors adjoindre un ADC externe, ce qui complique le schéma électrique et la programmation du PIC).
Caractéristiques principales du module ADC du PIC 16F88 :
Principaux registres relatifs au module ADC :
Etape 1 : Configuration
1-1- Choix des canaux d'entrées
On peut utiliser jusqu'à 7 canaux d'entrées (mais à un instant donné, un seul canal est relié à l'ADC).
Numéro
de canal
|
Broche
|
0
|
RA0/AN0
|
1
|
RA1/AN1
|
2
|
RA2/AN2/VREF-
|
3
|
RA3/AN3/VREF+
|
4
|
RA4/AN4
|
5
|
RB6/AN5
|
6
|
RB7/AN6
|
Supposons que l'on ait besoin de 4 des 7 canaux (canal 0, 1, 2 et 5).
Il faut configurer les 4 broches correspondantes comme entrée analogique :
On commence par configurer ces 4 broches en entrée avec les registres spéciaux TRISA et TRISB (banque 1), puis on configure les entrées comme entrée de type analogique avec le registre spécial ANCEL (banque 1).
bsf STATUS , RP0 ; passage en banque 1
bsf TRISA , 0 ; configuration de la broche RA0 en entrée
bsf TRISA , 1 ; configuration de la broche RA1 en entrée
bsf TRISA , 2 ; configuration de la broche RA2 en entrée
bsf TRISB , 6 ; configuration de la broche RB6 en entrée
movlw B'00101111' ; W = B'00100111'
movwf ANSEL ; (ANSEL) = B'00100111'
; bit 7 du registre ANSEL = X : non implémenté
; bit 6 du registre ANSEL = 0 : configuration de la broche RB7/AN6 comme entrée/sortie numérique
; bit 5 du registre ANSEL = 1 : configuration de la broche RB6/AN5 comme entrée analogique (canal 5)
; bit 4 du registre ANSEL = 0 : configuration de la broche RA4/AN4 comme entrée/sortie numérique
; bit 3 du registre ANSEL = 0 : configuration de la broche RA3/AN3/VREF+ comme entrée/sortie numérique
; bit 2 du registre ANSEL = 1 : configuration de la broche RA2/AN2/VREF- comme entrée analogique (canal 2)
; bit 1 du registre ANSEL = 1 : configuration de la broche RA1/AN1 comme entrée analogique (canal 1)
; bit 0 du registre ANSEL = 1 : configuration de la broche RA0/AN0 comme entrée analogique (canal 0)
N.B. Les broches RB7, RA3 et RA4 ne font donc plus parties du module ADC, et sont utilisables comme des entrées/sorties numériques classiques.
1-2- Choix des tensions de référence
Quatre combinaisons sont possibles.
Elles dépendent de 2 bits du registre spécial ADCON1 (banque 1) :
VCFG1
(bit 5 du registre ADCON1)
VCFG0
(bit 4 du registre ADCON1)
Tension analogique d'entrée (référence haute)
Tension analogique d'entrée (référence basse)
Remarques 0 0 VDD VSS 0 1 VDD RA2/AN2/VREF-La broche RA2 doit être configurée comme entrée analogique :
bsf TRISA , 2
bsf ANSEL , 2
Le canal 2 n'est plus disponible.
1 0 RA3/AN3/VREF+ VSSLa broche RA3 doit être configurée comme entrée analogique :
bsf TRISA , 3
bsf ANSEL , 3
Le canal 3 n'est plus disponible.
1 1 RA3/AN3/VREF+ RA2/AN2/VREF-Les broches RA2 et RA3 doivent être configurées comme entrée analogique :
bsf TRISA , 2
bsf TRISA , 3
bsf ANSEL , 2
bsf ANSEL , 3
Les canaux 2 et 3 ne sont plus disponibles.
VDD = broche d'alimentation positive du microcontrôleur PIC 16F88
VSS = broche de masse (0 V) du microcontrôleur PIC 16F88
Le microcontrôleur PIC 16F88 est alimenté avec une tension stabilisée de +5,00 V (VDD).
bsf STATUS , RP0 ; passage en banque 1
bcf ADCON1 , VCFG0 ; VCFG0 = 0
bcf ADCON1 , VCFG1 ; VCFG1 = 0
Avec VCFG1 = 0 et VCFG0 = 0, la plage d'entrée du convertisseur ADC est [VSS à VDD] = [0 V à 5,00 V].
Le convertisseur a une résolution de 10 bits, soit 2^10 = 1024 pas de 4,88 mV (5 V /1024).
0 mV à 4,88 mV => 0x000 (D'0')
4,88 mV à 9,77 mV => 0x001 (D'1')
...
4,995 à 5,000 V => 0x3FF (D'1023' ou B'11 11111111')
La broche RA3/AN3/VREF+ est alimentée avec une tension de référence de +3,000 V.
La broche RA2/AN2/VREF- est alimentée avec une tension de référence de +2,000 V.
bsf STATUS , RP0 ; passage en banque 1
bsf ADCON1 , VCFG0 ; VCFG0 = 1
bsf ADCON1 , VCFG1 ; VCFG1 = 1
Avec VCFG1 = 1 et VCFG0 = 1, la plage d'entrée du convertisseur ADC est [VREF- à VREF+] = [2,000 V à 3,000 V]
Le convertisseur a une résolution de 10 bits soit 1024 pas de 0,977 mV (= (3,000 V - 2,000 V)/1024)
2,000 V à 2,001 V => 0x000 (D'0')
2,001 V à 2,002 V => 0x001 (D'1')
...
2,999 à 3,000 V => 0x3FF (D'1023' ou B'11 11111111')
1-3- Choix du format du résultat de la conversion
Le convertisseur ADC fournit un nombre binaire naturel de 10 bits (b9 b8 b7 b6 b5 b4 b3 b2 b1 b0).
b0 = LSB (bit de poids faible)
b9 = MSB (bit de poids fort)
Deux registres (2 x 8 bits) sont donc nécessaires pour stocker le résultat de la conversion (10 bits).
Ce sont les registres :
Deux formats sont disponibles suivant la valeur du bit ADFM (bit 7 du registre spécial ADCON1, situé en banque 1) :
ADFM (bit 7 du registre spécial ADCON1) |
Instruction
|
Registre ADRESH
|
Registre ADRESL
|
Exemple
|
0
|
bcf ADCON1 , ADFM
|
(b9 b8 b7 b6 b5 b4 b3 b2)
|
(b1 b0 0 0 0 0 0 0)
|
D'758' = 0x2F6 (ADRESH) = 0xBD (ADRESL) = 0x80 |
1
|
bsf ADCON1 , ADFM
|
(0 0 0 0 0 0 b9 b8)
|
(b7 b6 b5 b4 b3 b2 b1 b0)
|
D'758' = 0x2F6
(ADRESH) = 0x02 (ADRESL) = 0xF6 |
ADFM = A/D Result Format select bit
1-4 - Choix de la fréquence d'horloge du convertisseur ADC
Le choix de la fréquence d'horloge du convertisseur ADC se fait avec 2 bits du registre spécial ADCON0 (banque 0) et 1 bit du registre spécial ADCON1 (banque 1) :
ADCS2 (bit 6 du registre ADCON1) |
ADCS1 (bit 7 du registre ADCON0) |
ADCS0 (bit 6 du registre ADCON0) |
F AD Fréquence d'horloge du convertisseur ADC |
T AD Période d'horloge du convertisseur ADC |
0
|
0
|
0
|
FOSC / 2
|
2 x T OSC
|
0
|
0
|
1
|
FOSC / 8
|
8 x T OSC
|
0
|
1
|
0
|
FOSC / 32
|
32 x T OSC
|
0
|
1
|
1
|
F RC
|
T RC
|
1
|
0
|
0
|
FOSC / 4
|
4 x T OSC
|
1
|
0
|
1
|
FOSC / 16
|
16 x T OSC
|
1
|
1
|
0
|
FOSC / 64
|
64 x T OSC
|
1
|
1
|
1
|
F RC
|
T RC
|
Par exemple, avec un oscillateur à quartz externe de 20 MHz et (ADCS2 ADCS1 ADCS0) = (010) :
F OSC = 20 MHz (T OSC = 50 ns)
F AD = F OSC / 32 = 625 kHz
T AD = 1,6 µs
N.B. Ne pas confondre T OSC avec la durée du cycle d'une instruction qui vaut : 4 x T OSC = 200 ns.
Pour une conversion plus rapide, on prendra (si possible) :
T AD = 1,6 µs
Cela impose une contrainte sur la fréquence de l'horloge du microcontrôleur PIC 16F88 :
ADCS2 (bit 6 du registre ADCON1) |
ADCS1 (bit 7 du registre ADCON0) |
ADCS0 (bit 6 du registre ADCON0) |
F OSC Maximum |
0
|
0
|
0
|
1,25 MHz (T AD = 1,6 µs)
|
0
|
0
|
1
|
5 MHz (T AD = 1,6 µs)
|
0
|
1
|
0
|
20 MHz (T AD = 1,6 µs)
|
1
|
0
|
0
|
2,5 MHz (T AD = 1,6 µs)
|
1
|
0
|
1
|
10 MHz (T AD = 1,6 µs)
|
1
|
1
|
0
|
20 MHz (T AD = 3,2 µs)
|
1-5- Mise en service de l'interruption du convertisseur ADC
Uniquement dans le cas où vous voulez utiliser la technique des interruptions (ce que je fais personnellement).
bcf STATUS , RP0 ; passage en banque 0
bcf PIR1 , ADIF ; on efface le drapeau de l'interruption du convertisseur ADC
bsf STATUS , RP0 ; passage en banque 1
bsf PIE1 , ADIE ; autorisation de l'interruption du convertisseur ADC
bsf PEIE , INTCON ; autorisation des interruptions des périphériques (dont le module ADC)
bsf GIE , INTCON ; autorisation globale des interruptions
Le drapeau ADIF est automatiquement mis à 1 à la fin de la phase de conversion.
Une interruption est alors déclenchée.
Dans la routine d'interruption, on pourra lire et traiter le résultat de la conversion (registres ADRESH et ADRESL).
On n'oubliera pas d'effacer le drapeau ADIF !
Etape 2- Mise en service du convertisseur ADC
Pour cela, il faut mettre à 1 le bit ADON du registre ADCON0 :
bcf STATUS , RP0 ; passage en banque 0
bsf ADCON0 , ADON ; ADON = 1
Remarque : Vous aurez compris qu'il faut mettre le bit ADON à 0 pour rendre hors service le convertisseur ADC :
bcf ADCON0 , ADON ; ADON = 0
Etape 3- Sélection du canal à échantillonner
La sélection du canal à échantillonner se fait avec 3 bits du registre spécial ADCON0 (banque 0) :
CHS2 (bit 5 du registre ADCON0) |
CHS1 (bit 4 du registre ADCON0) |
CHS0 (bit 3 du registre ADCON0) |
Canal sélectionné
|
0
|
0
|
0
|
canal 0 (broche RA0)
|
0
|
0
|
1
|
canal 1 (broche RA1)
|
0
|
1
|
0
|
canal 2 (broche RA2)
|
0
|
1
|
1
|
canal 3 (broche RA3)
|
1
|
0
|
0
|
canal 4 (broche RA4)
|
1
|
0
|
1
|
canal 5 (broche RB6)
|
1
|
1
|
0
|
canal 6 (broche RB7)
|
Exemple :
Pour échantillonner le canal 2 :
bcf STATUS , RP0 ; passage en banque 0
bcf ADCON0 , CHS2 ; CHS2 = 0
bsf ADCON0 , CHS1 ; CHS1 = 1
bcf ADCON0 , CHS0 ; CHS0 = 0
N.B. Pour échantillonner plusieurs canaux (canal 0, 1, 2 et 5), on utilise la technique du multiplexage :
Echantillonnage du canal 0, puis échantillonnage du canal 1, puis échantillonnage du canal 2, puis échantillonnage du canal 5, puis échantillonnage du canal 0 , etc ...
Etape 4- Attente pendant la phase d'acquisition
Vous devez programmer une temporisation de 19,7 µs (environ).
En effet, la phase d'acquisition consiste à charger le condensateur de maintien C HOLD avec la tension présente à l'entrée (V).
Mais la durée de charge du condensateur augmente avec la résistance interne RS de la source de tension.
Microchip recommande donc d'avoir une résistance interne de source inférieure à 10 kiloohms.
Dans ce cas, 19,7 µs suffisent à charger suffisamment le condensateur (> 99,95 % de V).
Etape 5- Lancement de la phase de conversion
Une fois la phase d'acquisition terminée (19,7 µs environ), vous pouvez lancer la phase de conversion en mettant à 1 le bit GO du registre ADCON0 :
bcf STATUS , RP0 ; passage en banque 0
bsf ADCON0 , GO ; GO = 1
La conversion dure 12 x T AD soit 19,2 µs dans le meilleur des cas (T AD = 1,6 µs).
Pendant la phase de conversion, l'interrupteur électronique est ouvert.
Le condensateur de maintien C HOLD conserve alors à ses bornes la tension V.
Cette tension est constante (aux fuites près) pendant toute la phase de conversion.
Etape 6- Attente de la fin de la phase de conversion
A la fin de la conversion, le drapeau ADIF de l'interruption du convertisseur ADC est automatiquement mis à 1.
Si vous utilisez cette interruption, le programme saute immédiatement vers la routine d'interruption.
Si vous n'utilisez pas la technique des interruptions, il faut tester le bit GO du registre ADCON0.
En effet, le bit GO est automatiquement remis à 0 en fin de conversion.
Etape 7 - Lecture du résultat de la conversion
On peut maintenant lire et traiter le résultat de la conversion (registres ADRESH et ADRESL).
Etape 8 - Attente avant une nouvelle acquisition
Microchip indique qu'il faut attendre 2 x T AD (3,2 µs) entre la fin de la phase de conversion et un nouveau cycle d'acquisition.
En interne, après 2 x T AD, l'interrupteur électronique de l'échantillonneur-bloqueur est fermé, et le processus d'acquisition commence :
Etape 9 - Nouvelle acquisition
On saute à l'étape 3 (pour un changement de canal).
Autrement, on recommence à l'étape 4.
3-1- Calcul de la période d'échantillonnage (TE)
19,7 µs (phase d'acquisition)
+ 12 x T AD = 19,2 µs (phase de conversion)
+ 2 x T AD = 3,2 µs (temps mort)
TE = 42,1 µs (avec T AD = 1,6 µs)
3-2- Echantillonnage de signaux rapides
FE = fréquence d'échantillonnage max. = 24 kHz (théorique)
(soit 24 000 échantillons de 10 bits par seconde).
En pratique, la fréquence d'échantillonnage max. est inférieure car il faut laisser du temps au PIC :
Le théorème de Shannon dit que la fréquence d'échantillonnage doit être au moins deux fois plus grande que la fréquence maximale du signal à échantillonner.
F < FE / 2
Ainsi, pour échantillonner correctement un signal audio (bande passante 20 Hz à 16 kHz), il faut une fréquence d'échantillonnage d'au moins 16 x 2 = 32 kHz.
On voit que le module ADC du PIC 16F88 n'est pas suffisamment rapide pour échantillonner correctement un signal sonore (il faut donc utiliser un convertisseur ADC externe).
Cependant, si on n'est pas trop exigeant sur la qualité du son (son de qualité "téléphonique"), le convertisseur du PIC 16F88 suffit (avec une fréquence d'échantillonnage de 8 kHz).
3-3- Echantillonnage de signaux lents
Le convertisseur du PIC 16F88 convient pour l'acquisition de signaux lents (par exemple, suivi de la température ambiante d'une salle à partir d'un capteur LM335).
On pensera à intercaler entre le capteur et le canal d'entrée de l'ADC du PIC, un filtre anti-repliement (filtre analogique passe-bas de fréquence de coupure FE / 2).
Il est également conseillé d'effectuer un filtrage numérique (passe-bas) de façon à enlever le maximum de bruit (en particulier le bruit de ronflement du secteur 50 Hz). Ce filtrage numérique est réalisé de manière logicielle par le PIC (pendant la phase de traitement du résultat de la conversion).
3-4- Fréquence d'échantillonnage et nombre de canaux
Supposons que le module ADC travaille avec une fréquence d'échantillonnage de F E = 8 kHz.
On obtient ainsi 8000 échantillons par seconde.
Si n canaux sont utilisés, cela fait 8000/n échantillons par seconde et par canal.
Ainsi, avec 7 canaux, chaque canal est échantillonné à seulement F E / n = 1,14 kHz.
Ce n'est pas gênant pour l'acquisition de signaux lents (on pourra connecter 7 capteurs de température), mais c'est rédhibitoire pour des signaux rapides (donc pas de son stéréo car cela fait 2 canaux au lieu d'un seul pour un son mono).
(C) Fabrice Sincère