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
- Repartir sur un nouveau projet nommé ADC1 à partir du projet du PWM3 dont vous supprimerez les lignes de la machines à états.
- 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.
- 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.
- Lancer la conversion et attendre la fin de la conversion en mettant en place une boucle testant le bit GO/DONE.
- Afficher la valeur du résultat de la conversion sur l'afficheur LCD.
- 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.
- Ajouter une variable de type float nommé Tension au début de la fonction main()
- A l'issue de la conversion, calculer la tension mesurée dont l'image est contenue dans ADRES.
- 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.
- 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
- Créer un nouveau projet nommé ADC2 à partir du projet précédent.
- Modifier le code pour mesurer la tension présente sur l'entrée RA0/AN0.
- Afficher la tension correspondante en volts.
- Tester.
2.2. Affichage de la température en °C
- A partir du test et en exploitant la datasheet du capteur, déduire la température mesurée.
- Dans la fonction main(), déclarer une variable de type float pour le calcul de la température.
- A la suite de la conversion, calculer la température en °C.
- Afficher la température sur l'afficheur LCD.