Le CAN

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.

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