Vous êtes sur la page 1sur 9

Conversion Analogique Numérique

Mesures et Interfaçage des Capteurs


Objectifs
À la fin de ce chapitre, vous serez en mesure de :

 Comprendre le fonctionnement de l’ADC du µC ATmega328p


 Programmer l'ADC de l'AVR en C.
 Interfacer des capteurs au µC ATmega328p.

Caractéristiques de l’ADC
Dans cette section nous explorons l’ADC en général. Tout d'abord, nous décrivons certains aspects
généraux de l'ADC lui-même, puis nous nous concentrons sur la fonctionnalité de certaines broches
importantes de l'ADC.

Les convertisseurs analogique-numérique sont parmi les appareils les plus largement utilisés pour
l'acquisition de données. Les processeurs numériques utilisent des valeurs binaires (discrètes), mais
dans le monde physique, tout est analogique (continu). La température, la pression, l'humidité et la
vitesse sont quelques exemples de grandeurs physiques que nous traitons quotidiennement.

Une grandeur physique est convertie en signaux électriques (tension, courant) à l'aide d'un dispositif
appelé transducteur. Les transducteurs sont également appelés capteurs. Les capteurs de
température, de vitesse, de pression, de lumière et de nombreuses autres grandeurs naturelles
produisent une sortie qui est une tension (ou un courant). Par conséquent, nous avons besoin d'un
convertisseur analogique-numérique pour traduire les signaux analogiques en nombres numériques
afin que le microcontrôleur puisse les lire et les traiter.

Figure 3.1 – Connexion des capteurs au microcontrôleur

1
Quelques principales caractéristiques de l'ADC

Résolution
L'ADC a une résolution de n bits, où n peut être égal à 8, 10, 12, 16 ou même 24 bits. Les ADC à plus
haute résolution fournissent une taille de pas plus petite, où la taille de pas est le plus petit
changement qui peut être discerné par un ADC. Certaines résolutions largement utilisées pour les ADC
sont présentées dans le tableau 3-1. Bien que la résolution d'un ADC soit décidée au moment de sa
conception et ne puisse pas être modifiée, nous pouvons contrôler la taille du pas à l'aide de ce qu'on
appelle Vref.

n-bit Nombre de pas Taille du pas (mV)


8 256 5/256 = 19.53
10 1024 5/1024 = 4.88
12 4096 5/4096 = 1.2
16 65536 5/65536 = 0.076
Tableau 3.1 - Résolution par rapport à la taille de pas pour ADC (Vref = 5 V)

Temps de conversion
En plus de la résolution, le temps de conversion est un autre facteur majeur dans le choix d'un ADC. Le
temps de conversion est défini comme le temps nécessaire à l’ADC pour convertir l'entrée analogique
en un nombre numérique (binaire). Le temps de conversion est dicté par la source d'horloge connectée
à l'ADC en plus de la méthode utilisée pour la conversion des données et de la technologie utilisée telle
que la technologie MOS ou TTL.

Vref
Vref est une tension d'entrée utilisée pour la tension de référence. La tension connectée à cette
broche, ainsi que la résolution de l’ADC, donnent la taille du pas. Pour un ADC de 8 bits, la taille de pas
est Vref/256. Par exemple, si la plage d'entrée analogique doit être de 0 à 4 volts, Vref est connecté à
4 volts. Cela donne 4 V/256 =15,62 mV pour la taille de pas d'un ADC 8 bits.

Sortie numérique
Dans un ADC 8 bits, nous avons une sortie numérique 8 bits de D0-D7, tandis que dans l'ADC 10 bits,
la sortie numérique est D0-D9. Pour calculer la tension de sortie, nous utilisons la formule suivante :

𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡 𝑑𝑑′𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒é𝑒𝑒
𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠 𝑛𝑛𝑛𝑛𝑛𝑛é𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝐴𝐴𝐴𝐴𝐴𝐴 =
𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡 𝑑𝑑𝑑𝑑 𝑝𝑝𝑝𝑝𝑝𝑝
Exemple
Etant donné un ADC 8 bits, avec Vref = 2,56 V. Calculez la sortie D0-D7 si l'entrée analogique est :
(a) 1,7 V et (b) 2,1 V.
Solution
Étant donné que la taille du pas est de 2,56/256 = 10 mV, nous avons ce qui suit :
(a) Sortie numérique = 1,7 V/10 mV= 170 en décimal, ce qui nous donne 10101010 en binaire pour
D0-D7.
(b) Sortie numérique = 2,1 V/10 mV = 210 en décimal, ce qui nous donne 11010010 en binaire
pour D0-D7.

2
ADC parallèle ou série
Les circuits ADC sont soit parallèles, soit série. Dans l'ADC parallèle, nous avons 8 broches ou plus
dédiées à la sortie des données binaires, mais dans l'ADC série, nous n'avons qu'une seule broche pour
la sortie des données. Cela signifie qu'à l'intérieur de l'ADC série, il y a un registre à décalage parallèle-
série chargé d'envoyer les données binaires un bit à la fois.
Les broches de données D0-D7 de l'ADC 8 bits fournissent un chemin de données parallèle 8 bits entre
la puce ADC et le CPU. Dans le cas de la puce ADC parallèle 16 bits, nous avons besoin de 16 broches
pour le chemin des données.
Afin d'économiser les broches, de nombreux ADC 12 et 16 bits utilisent les broches D0-D7 pour envoyer
les octets supérieurs et inférieurs des données binaires. Ces dernières années, pour de nombreuses
applications où l'espace est un problème critique, l'utilisation d'un si grand nombre de broches pour
les données n'est pas réalisable. Pour cette raison, les périphériques série tels que l'ADC série sont de
plus en plus utilisés. Alors que les ADC série utilisent moins de broches et que leurs boîtiers plus petits
occupent beaucoup moins d'espace sur la carte de circuit imprimé, il faut plus de temps CPU pour
obtenir les données converties de l'ADC car le CPU doit obtenir les données un bit à la fois, au lieu
d'une opération de lecture unique comme avec l'ADC parallèle. L'ADC848 est un exemple d'ADC
parallèle avec 8 broches pour la sortie de données, tandis que le MAX1112 est un exemple d'ADC série
avec une seule broche pour Dout.

Canaux d'entrée analogiques


De nombreuses applications d'acquisition de données nécessitent plusieurs ADC. Pour cette raison, on
voit des puces ADC avec 2, 4, 8, voire 16 canaux sur une seule puce. Le multiplexage des entrées
analogiques est largement utilisé. Dans l’ATmega328p, nous avons 6 canaux d'entrées analogiques,
nous permettant de surveiller plusieurs quantités telles que la température, la pression, le débit, etc.

Signaux de début de conversion et de fin de conversion


Le fait que nous ayons plusieurs canaux d'entrée analogiques et un seul registre de sortie numérique
crée le besoin de signaux de début de conversion (ADSC) et de fin de conversion (ADSC/ADIF). Lorsque
ADSC est activé, l'ADC commence à convertir la valeur d'entrée analogique présente sur l’entrée
analogique – canal ADCn(n=0..5) en un nombre numérique de n bits. Le temps nécessaire à la
conversion varie en fonction de la méthode de conversion. Lorsque la conversion des données est
terminée, le signal de fin de conversion (ADSC/ADIF) notifie à la CPU que les données converties sont
prêtes à être récupérées.

Programmation de l’ADC du µC ATmega328p

Dans cette section, nous discutons de la fonction ADC de l'ATmega328p et montrons comment elle est
programmée en C.

Caractéristiques de l’ADC du µC ATmega328p

Le périphérique ADC de l'ATmega328p a les caractéristiques suivantes :


(a) Il s'agit d'un ADC 10 bits.
(b) Il dispose de 6 canaux d'entrée analogiques multiplexés.
(c) Les données binaires en sortie sont conservées par deux registres appelés ADCL (A/D Result
Low) et ADCH (A/D Result High).
(d) Parce que les registres ADCH:ADCL nous donnent 16 bits et que les données ADC ne font que
10 bits, 6 bits sur les 16 sont inutilisés. Nous avons la possibilité de rendre inutilisés les 6 bits
supérieurs ou les 6 bits inférieurs.

3
(e) Nous avons trois options pour Vref : Vref peut être connecté à AVCC (Analog Vcc), à une
référence interne de 2,56 V ou à une broche AREF externe.
(f) Le temps de conversion est en fonction de la fréquence du cristal connecté au broches XTAL
(Fosc) et ADPS0:2 bits.
(g) Temps de conversion allant de 65 à 260μs.
(h) Interruption sur fin de conversion.

Considérations matérielles de l’ADC


Pour les signaux logiques numériques, une petite variation du niveau de tension n'a aucun effet sur la
sortie. Par exemple, 0.2V est considéré comme BAS, car dans la logique TTL, tout ce qui est inférieur à
0,5V sera détecté comme logique BAS. Ce n'est pas le cas lorsqu'il s'agit de tension analogique.

Exemple
Pour un ADC 10 bits, nous avons Vref = 2,56V. Calculez la sortie D0-D9 si l'entrée analogique est :
(a) 0,2 V et (b) 0 V. Quelle est la différence entre (a) et (b) ?

Étant donné que la taille du pas est de 2,56/1024 = 2,5 mV, nous avons ce qui suit :
(a) Sortie numérique = 0.2V/2.5mV = 80 en décimal, ce qui nous donne 1010000 en binaire.
(b) Sortie numérique = 0V/2.5mV = 0 en décimal, ce qui nous donne 0 en binaire.
La différence est de 1010000, soit 7 bits !

Nous pouvons utiliser de nombreuses techniques pour réduire l'impact de la tension d'alimentation
de l’ADC et de la variation de Vref sur la précision de la sortie du CAN.

Découplage AVCC de VCC


La broche AVCC fournit l'alimentation des circuits ADC analogiques. Pour obtenir une meilleure
précision de l’ADC, nous devons fournir une source de tension stable à la broche AVCC. La figure 3-2
montre comment utiliser une inductance et un condensateur pour y parvenir.
Connexion d'un condensateur entre AREF et GND
En connectant un condensateur entre la broche AREF et GND, vous pouvez rendre la tension Vref plus
stable et augmenter la précision de l'ADC.

Figure 3.2 – Connexion recommandée pour l’ADC

Programmation en C
Dans le microcontrôleur AVR, cinq registres principaux sont associés à l'ADC. Ce sont ADCH (données
du poids fort), ADCL (données du poids faibles), ADCSRA et ADCSRB (registres de contrôle et d'état
ADC), ADMUX (registre de sélection de multiplexeur ADC) et DIDR0 (Registre de désactivation d'entrée
numérique).

4
bits 7:6 – REFS1:0 : Bits de sélection de référence
Ces bits sélectionnent la référence de tension pour l’ADC, comme indiqué dans le Tableau 3-2. Si ces
bits sont modifiés lors d'une conversion, la modification n'entrera en vigueur qu'une fois cette
conversion terminée (l'ADIF dans ADCSRA est mis à 1).

REFS1 REFS0 Sélection de la tension de référence


0 0 AREF – (VREF interne est désactivée)
0 1 AVCC avec condensateur externe sur la broche AREF
1 0 -
1 1 Tension de référence interne 1.1V avec condensateur
externe sur la broche AREF
Tableau 3.2 - Sélection de la tension de référence
bit 5 - ADLAR : Ajustement à gauche du résultat de conversion
Le bit ADLAR affecte la présentation du résultat de la conversion ADC dans le registre de données
ADC. Écrire un 1 sur ADLAR ajuste le résultat à gauche. Sinon, le résultat est ajusté à droite.

bits 3:0 – MUX3:0 : Bits de sélection du canal analogique


La valeur de ces bits sélectionne les entrées analogiques connectées à l’ADC.

MUX3..0 Canal
0000 ADC0
0001 ADC1
0010 ADC2
0011 ADC3
0100 ADC4
0101 ADC5

bit 7 - ADEN : Activer l’ADC


L'écriture d’un 1 sur ce bit active l'ADC. En l'écrivant à zéro, l'ADC est désactivée.
bit 6 – ADSC : Démarrage de la conversion
Ecrire un 1 sur ce bit à un pour effet de démarrer la conversion. La première conversion prendra 25
cycles d'horloge ADC au lieu du 13 cycles en normal. Cette première conversion effectue
l’initialisation de l'ADC. ADSC sera lu comme 1 tant qu'une conversion est en cours. Lorsque la
conversion est terminée, il revient à zéro.
bit 5 - ADATE : Activation du déclenchement automatique de la conversion
Lorsque ce bit est écrit à un, le déclenchement automatique de l'ADC est activé. L'ADC commencera
une conversion sur un front positif du signal de déclenchement sélectionné. La source de
déclenchement est sélectionnée en définissant les bits de sélection de déclenchement ADTS dans
ADCSRB.

5
bit 4 - ADIF : Indicateur d'interruption ADC
Ce bit est mis à 1 lorsqu'une conversion ADC est terminée et que les registres de données sont mis
à jour. Une interruption est exécutée si le bit ADIE et le bit I dans SREG sont activés. ADIF est mis à
0 par le matériel lors de l'exécution de la ISR de l’interruption correspondante. Alternativement,
ADIF est remis à 0 en écrivant un 1 logique.
bit 3 – ADIE : Activation de l'interruption ADC
Lorsque ce bit est mis à 1 et que le bit I dans SREG est mis à 1, l'interruption conversion terminée
est activée.
bits 2:0 – ADPS2:0 : Bits de sélection du prédiviseur ADC
Ces bits déterminent le facteur de division entre la fréquence d'horloge du système et l'horloge
d'entrée de l’ADC.
ADPS2 ADPS1 ADPS0 Facteur de division
0 0 0 2
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128

Lorsqu'une conversion ADC est terminée, le résultat se retrouve dans ces deux registres.
Lorsque ADCL est lu, le registre de données ADC n'est pas mis à jour tant que ADCH n'est pas lu. Par
conséquent, si le résultat est laissé ajusté et pas plus d'une précision de 8 bits n'est requise, il suffit
de lire ADCH. Sinon, ADCL doit être lu en premier, puis ADCH.
Le bit ADLAR dans ADMUX et les bits MUXn dans ADMUX affectent la façon dont le résultat est lu
dans ces registres. Si ADLAR est mis à 1, le résultat est ajusté à gauche. Si ADLAR est désactivé (par
défaut), le résultat est ajusté à droite.

bit 2:0 – ADTS2:0 : Source de déclenchement automatique ADC


Si ADATE dans ADCSRA est mis à 1, la valeur de ces bits sélectionne la source qui déclenchera une
conversion ADC.

6
Si ADATE est mis à 0, les valeurs ADTS2:0 n'auront aucun effet. Si ADEN dans ADCSRA est mis à 1,
cela lancera une conversion.

bit 5:0 – ADC5D..ADC0D : Désactivation de l'entrée digitale ADC5..0


Lorsque ce bit est mis à 1, le tampon d'entrée digitale sur la broche ADC correspondante est
désactivé. Lorsqu'un signal analogique est appliqué à la broche ADC5..0 et l'entrée digitale de cette
broche n'est pas nécessaire, ce bit doit être mis à 1 pour réduire la consommation d'énergie dans le
tampon d'entrée digitale.

Étapes de programmation de l’ADC


Pour résumer, les étapes suivantes doivent être suivies pour effectuer une conversion
Analogique/Numérique :

1. Configuration du module ADC :


–Configurer les broches analogiques/référence de tension (ADMUX)
–Sélectionner le canal d'entrée analogique (ADMUX)
–Sélectionner l'horloge de conversion - prédiviseur (ADCSRA)
–Activer le module ADC, bit ADEN (ADCSRA)
2. Configurez l'interruption ADC (si vous le souhaitez).
3. Démarrez la conversion :
–Mise à 1 du bit ADSC (ADCSRA)
4. Attendez que la conversion soit terminée, soit :
–vérification du bit ADSC/ADIF ; OU ALORS
–Attente de l'interruption ADC
5. Lisez la paire de registres de résultats (ADCL et ADCH), effacez le bit ADIF si nécessaire.
6. Pour la conversion suivante, passez à l'étape 1 ou à l'étape 2, selon le cas.

7
Exemple de programmation
Dans cet exemple, nous allons convertir la tension présente sur le canal ADC0 et l’afficher sous forme
numérique sur les PORTs D et B. A cet effet deux fonctions adc_init() et adc_read(uint8_t
canal) ont été développées pour initialiser l’ADC et convertir le canal sur lequel la
tension analogique est appliquée.

#define F_CPU 16000000UL


#include <avr/io.h>
#include <util/delay.h>

void adc_init();
uint16_t adc_read(uint8_t ch);

int main()
{
uint16_t adc_result;

// initialiser l’ADC et les PORT B et D en sortie


adc_init();
DDRD = 0xFF;
DDRB = 0x03;
_delay_ms(100);

while(1)
{
adc_result = adc_read(0); // Lire la tension sur PC0/ADC0
PORTD = adc_result ;
PORTB = adc_result >> 8;

_delay_ms(500);
}
return 0;

}
void adc_init()
{
// AREF = AVcc
ADMUX = (1<<REFS0);

// Activer l’ADC avec prédiviseur de 128


// 16000000/128 = 125000 < 200000Hz
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}

uint16_t adc_read(uint8_t canal)


{
// Sélection du canal 0-7
canal &= 0b00000111;
ADMUX = (ADMUX & 0xF8)|canal;

// Démarrer la conversion
ADCSRA |= (1<<ADSC);

// Attendre la fin de la conversion


while(ADCSRA & (1<<ADSC));

return (ADC);
}

8
Une simulation sous Proteus est donnée sur la figure 3.2.

Figure 3.2 – Simulation du circuit sous Proteus


Résultat
Pour une tension de 3.5V présente sur le canal ADC0, nous avons en sortie la valeur numérique
1011001101.
Vérification
Nous avons AREF = AVcc = 5V et une résolution de 10bits, donc une taille de pas de :
5 𝑉𝑉
= 4.88𝑚𝑚𝑚𝑚
210
La tension à l’entrée = 3.5V, ce qui donne comme valeur numérique :
3.5 𝑉𝑉
= 717
0.00488 𝑉𝑉

717 convertie en binaire, donne : 10 1100 1101.

Vous aimerez peut-être aussi