Le CAN

Icône de l'outil pédagogique Le convertisseur analogique-numérique

Un convertisseur analogique-numérique transforme une tension présente sur une entrée analogique du micro-contrôleur en nombre entier utilisable dans le programme. La conversion suit une loi linéaire.

Notre micro-contrôleur est équipé d'un convertisseur 10 bits, c'est-à-dire que le résultat entier de la conversion sera compris entre 0 et 210-1 =1023.

Entre les entrées analogiques du micro-contrôleur et le convertisseur analogique-numérique, on trouve un multiplexeur analogique pour aiguiller le signal à convertir.

Une conversion analogique-numérique prend un certain temps, son résultat n'est pas obtenu immédiatement.

Pour effectuer une conversion analogique-numérique, il faut donc :

  • positionner le multiplexeur analogique sur la voie à convertir

  • attendre le temps d'acquisition nécessaire pour que la tension soit stabilisée

  • lancer la conversion

  • attendre la fin de la conversion

  • lire le résultat de la conversion

L'ensemble de ces opérations dure environ 27µs.

Une bibliothèque de fonctions est fournie pour configurer correctement le convertisseur analogique-numérique puis pour effectuer des conversions sur les différentes voies sans avoir à détailler toutes les étapes nécessaires.

Pour utiliser la bibliothèque du convertisseur analogique-numérique, il faut d'abord placer les fichiers suivants dans le répertoire du projet :

iut_adc.h

iut_adc.c

puis les ajouter au projet.

Après avoir inclus le fichier d'entêtes de la bibliothèque, il faut initialiser son utilisation par un appel à la fonction adc_init au début du programme. Le paramètre à passer à cette fonction d'initialisation correspond au numéro du dernier canal analogique utilisé. On passera « zéro » pour se servir seulement du canal AN0 sur lequel est connecté un potentiomètre.

Exemple :

#include <18f4550.h>

#include "iut_adc.h"

void main(void)

{

adc_init(0);

...

}

Pour effectuer une conversion, il suffit d'appeler la fonction adc_read avec comme paramètre le numéro du canal à convertir (0 pour AN0, par exemple) et de ranger le résultat dans une variable. Un appel à la fonction dure environ 27µs.


Voici un exemple qui effectue la conversion de la voie du potentiomètre (AN0) et affiche le résultat sur l'écran LCD sous deux formes :

en entier (de 0 à 1023) et en volts (de 0 à 5V)

#include <p18f4550.h>

#include "iut_lcd.h"

#include "iut_adc.h"

void main(void)

{

int potar = 0;

float v;

// initialisation

lcd_init();

adc_init(0);

lcd_position(0, 2);

lcd_putrs("IUT en ligne");

// boucle infinie

while (1) {

potar = adc_read(0);

lcd_position(1, 0);

lcd_printf("%4d", potar);

v = potar * (5.0 / 1023);

lcd_position(1, 10);

lcd_printf("%5.3fV", v);

}

}

Remarquez l'utilisation de la fonction lcd_printf pour les affichages :

  • Pour une variable de type int dont la valeur tient toujours sur 4 caractères (0 à 1023), on utilise le format %4d

  • Pour une variable de type float dont la valeur est toujours positive et comprise entre 0 et 5, si on souhaite un affichage à 3 chiffres après la virgule, il faut au maximum 5 caractères, on utilise le format %5.3f