TP 4 : Conversion analogique/numérique

1. Mesure de tension

Nom du projet : ADC1 (Correction disponible dans la zone de téléchargement pour les utilisateurs enregistrés)

L'objectif est de mesurer la tension issue du potentiomètre POT et appliquée sur RA1/AN1.

Le potentiomètre étant connecté entre \(0v\) et \(+V_{CC}\), le potentiel \(V_{POT}\) sur son plot central évolue entre ces mêmes limites et on a : $$ V_{POT}=\alpha.V_{CC}$$ où \(\alpha \in[0;1]\) est représentatif de la position du curseur du potentiomètre (0 si en butée d'un côté et 1 de l'autre).

1.1. Travail préparatoire

  1. Repartir sur un nouveau projet nommé ADC1 à partir du projet du PWM3 dont vous supprimerez les lignes de la machines à états.
  2. S'ils sont absents, ajouter les fichiers lcd.c et lcd.h dans le dossier de votre projet et la ligne #include "lcd.h" dans la liste des includes de votre projet. Puis ajouter la ligne LCD_init(); avant la boucle infinie de la fonction main().

1.2. Configuration du convertisseur Analogique/Numérique

La configuration est celle du TD sur le convertisseur Analogique/Numérique. Elle concerne les registres ADCON0, ADCON1 et ADCON2 dont les valeurs doivent être fixées dans la zone de configuration de la fonction main(), c'est à dire avant la boucle infinie de celle-ci et avant la configuration des interruptions.

  1. Ecrire le code correspondant.

1.3. Traitement dans la boucle infinie. Résultat brute de conversion

On se limite à une acquisition toutes les 500 ms. Il faut donc utiliser l'indicateur Indicateur500ms déjà exploité dans le TP sur les timers.

  1. Lancer la conversion et attendre la fin de la conversion en mettant en place une boucle testant le bit GO/DONE.
  2. Afficher la valeur du résultat de la conversion sur l'afficheur LCD.
  3. En s'inspirant du TP PMW, utiliser les 8 bits les plus significatifs de ADRES pour faire varier la luminosité de LED1 en fonction de la position du potentiomètre.

Note : utiliser la fonction LCD_printd pour afficher un entier sur 16 bits.

1.4. Complément : affichage de la tension mesurée

Les registres ADRESH et ADRESL regroupés sous l'intitulé ADRES ont fourni le résultat de conversion brute sur 10 bits justifiés à droite.

A partir de cette valeur, il s'agit maintenant de calculer la tension correspondante et de l'afficher.

  1. Ajouter une variable de type float nommé Tension au début de la fonction main()
  2. A l'issue de la conversion, calculer la tension mesurée dont l'image est contenue dans ADRES.
  3. Enrichir la bibliothèque lcd avec une fonction nommée LCD_printf32(float v) pour afficher un float avec 3 décimales derrière la virgule.
  4. Utiliser cette fonction pour afficher la tension mesurée.

Note : pour ajouter une fonction à une bibliothèque, il faut penser à écrire son prototype dans le fichier d'entête (ici lcd.h) et son code dans le fichier code (ici lcd.c).

Aide : pour isoler la partie entière d'un float sous la forme d'un uint16_t, il faut utiliser un transtypage comme suit : PE = (uint16_t)(floor(v)); avec PE de type uint16_t .

2. Mesure de température

Nom du projet : ADC2 (Correction disponible dans la zone de téléchargement pour les utilisateurs enregistrés)

La carte de travaux pratiques dispose d'un capteur de température analogique de référence LM19CIZ connecté sur l'entrée RA0/AN0 du uC. 

2.1. Acquisition sur 10 bits de la tension issue du capteur

  1. Créer un nouveau projet nommé ADC2 à partir du projet précédent.
  2. Modifier le code pour mesurer la tension présente sur l'entrée RA0/AN0.
  3. Afficher la tension correspondante en volts.
  4. Tester.

2.2. Affichage de la température en °C

  1. A partir du test et en exploitant la datasheet du capteur, déduire la température mesurée.
  2. Dans la fonction main(), déclarer une variable de type float pour le calcul de la température.
  3. A la suite de la conversion, calculer la température en °C.
  4. Afficher la température sur l'afficheur LCD.