Cours/TD d informatique embarquée Utilisation d un microcontrôleur MBED Partie 2 Entrées et Sorties (E/S) analogiques Analog input and output Plan du cours 2.1. Introduction 2.2. Conversion Analogique Numérique (CAN ou ADC) 2.3. Entrées Analogiques de la plateforme LPC1768 2.4. Lire une donnée sur une entrée analogique (CNA ou DAC) 2.5. Conversion Numérique Analogique 2.6. Ecrire une donnée analogique sur la plateforme LPC1768 CV C/TD INFO2 - Partie 2 page 1
2.1. Introduction Il est souvent nécessaire de coupler un microcontrôleur avec des signaux analogiques (ex : microphone en entrée, ampli audio en sortie) est donc nécessaire Conversion Analogique => Numérique : ( en anglais) Conversion Numérique=> Analogique : ( en anglais) 2.2. Conversion Analogique Numérique Un convertisseur analogique numérique est un circuit électronique dont la sortie est une donnée numérique proportionnelle à la tension (analogique) d entrée. La tension d entrée est mesurée et (sur 8 bits, ou 10, ou 16 cela dépend du circuit). La gamme de tension d entrée possible est généralement déterminée par une tension de référence ou (3.3V, ou 5V, 10V, cela dépend du circuit). Cas du LPC1768 : / La tension d entrée doit être comprise entre et La valeur de sortie codée sur est comprise entre et La conversion est démarrée par un signal binaire appelé SC (start conversion) Lorsque la conversion est terminée le circuit l'indique avec le signal EOC (end of conversion) La donnée numérique peut être lue sur le bus de données. Lorsque le microcontrôleur est prêt pour la lire il agit sur le signal OE (output enable), le convertisseur impose la valeur des bits sur le bus. CV C/TD INFO2 - Partie 2 page 2
Relation entre l entrée et la sortie : exemple d une conversion sur 3 bits (courbe en marche d escalier) : Quantum (également appelé "pas de quantification") En analogique entre 0 et Vmax il y a une infinité de valeurs En numérique sur n bits il y possibilités La conversion provoque donc une erreur (la valeur lue en binaire ne peut pas être rigoureusement égale à la tension d'entrée. ex : 0,0002723V donnera 0000 0000 0000 en binaire). Un nombre binaire correspond à (largeur des marches de l escalier = quantum) Cas du LPC1768 ( V / bits) 2 12 possibilités pour une plage de 3.3V Largeur des marches = quantum = plage de tension/nb possibilités AN: quantum = / = mv Rq : l erreur de mesure la plus grande est donc de ±q/2 soit ± mv Rq : Plus le nombre de bits est important, meilleure sera la précision mais la donnée consommera plus de place en mémoire. Echantillonnage La lecture de la grandeur analogique est avec une certaine période. A chaque fois on prend un nouvel échantillon de la grandeur d entrée. exemple : un échantillon toutes les T = 200µs Plus la période d échantillonnage est petite, plus la lecture de la donnée sera «précise». CV C/TD INFO2 - Partie 2 page 3
Fréquence d échantillonnage On parle d échantillonnage à une fréquence f ech. = 1/T f=1/(200µs) = 5 khz La fréquence d échantillonnage doit être choisie en fonction du type de signal à lire Un signal variant lentement pourra être échantillonné à une fréquence (ex : température d une pièce) Un signal variant rapidement nécessitera une fréquence Rq : Le critère de Nyquist/Shannon impose que la fréquence d échantillonnage soit supérieure au double de la plus grande fréquence du signal d entrée. 2.3. Entrées Analogiques de la plateforme LPC1768 Le LPC1768 dispose de entrées analogiques broches à Les méthodes associées au type AnalogIn sont dans le tableau ci-dessous : AnalogIn / Utilisation Fonction AnalogIn Crée une variable de type AnalogIn associée à une broche Permet la lecture d une entrée, la valeur lue est convertie en un nombre de read type float compris dans [ 0 ; 1.0 ] Permet la lecture d une entrée, la valeur lue est du type entier non signé codé read_u16 sur 2 octets dans la gamme [ 0x0 ; 0xFFFF ] =variable_analog = est le raccourci de la fonction read() CV C/TD INFO2 - Partie 2 page 4
2.4. Lecture d'une entrée analogique Le potentiomètre délivre sur la broche 20 une tension comprise entre 0 et V out L alimentation du montage est assurée par l USB La valeur lue est affichée sur le PC via la communication série (TX,RX) // Reads input through the ADC, // and transfers to PC terminal #include "mbed.h" Serial pc(usbtx, USBRX); AnalogIn Ain(p20); float ADCdata; int main() { pc.printf("adc Data Values... \n\r"); while (1) { ADCdata=Ain.read(); pc.printf("%f \n\r",adcdata); wait (0.5); Exercice 1 : Réaliser et tester le programme ci-dessus. Faites varier le potentiomètre, expliquer. Exercice 2 : En utilisant les 4 LEDs présentes sur la carte, écrire un programme qui allume les LEDs en fonction de la tension issue du potentiomètre. CV C/TD INFO2 - Partie 2 page 5
2.5. Conversion Numérique Analogique Nous pouvons représenter le CNA comme un bloc comportant une entrée numérique et une sortie analogique V 0 La plage de tension de sortie est généralement fixée par la tension de référence. Le bus de contrôle permet au microcontrôleur de communiquer avec le CNA (initialisation, échantillonnage ) La tension de sortie V 0 est proportionnelle au nombre D. V 0 =V réf x D / ( 2 n ) 2.6. Ecrire une donnée analogique sur le LPC1768 La plateforme LPC1768 a un CNA 10 bits / V réf. = 3.3V disponible sur la broche numéro Il y a donc valeurs possibles en sortie, soit un quantum de mv. CV C/TD INFO2 - Partie 2 page 6
Les méthodes associées au type AnalogOut sont dans le tableau ci-dessous : AnalogOut / Fonction AnalogOut write write_u16 Utilisation Crée une variable de type AnalogOut associée à une broche Permet l écriture, la valeur écrite est un pourcentage de type float compris dans [ 0 ; 1.0 ] Permet l écriture, la valeur écrite est du type entier non signé codé sur 2 octets dans la gamme [ 0x0 ; 0xFFFF ] Renvoie la tension actuellement écrite, la valeur est un pourcentage de type float compris dans l'intervalle [ 0 ; 1.0 ] read =variable_analog = est le raccourci de la fonction read() variable_analog= = est le raccourci de la fonction write() Le programme ci-dessous vous permettra de vérifier le fonctionnement du CNA à l oscilloscope : #include "mbed.h" int main() { AnalogOut Sortie(p18); while(1) { Sortie.write(0.25); // 0.25*3.3V = 0.825V wait(1); Sortie.write(0.5); // 0.5*3.3V = 1.65V wait(1); Sortie.write(0.75); // 0.75*3.3V = 2.475V wait(1); Exercice 3 : Réaliser et tester le programme ci-dessus. Reproduisez le chronogramme relevé à l'oscilloscope. Exercice 4 : Tester le programme qui réalise génère un signal dent de scie sur la sortie analogique. CV C/TD INFO2 - Partie 2 page 7
//Sawtooth waveform on DAC output to view on oscilloscope #include "mbed.h" AnalogOut Aout(p18); float i; int main() { while(1) { for (i=0;i<1;i=i+0.1) { Aout.write(i); wait(0.001); Exercice 5 : Améliorer le programme précédent pour avoir un signal "lisse" Exercice 6 : CV C/TD INFO2 - Partie 2 page 8
Réaliser un programme permettant de générer un signal triangle. Exercice 7 : Modifier le programme précédent pour que l'amplitude du signal soit réglée par le potentiomètre connecté à la broche p20. Questions de cours : CV C/TD INFO2 - Partie 2 page 9
Q1) Combien de signaux analogiques d'entrée peut-on connecter sur le LPC1768? Combien y a-t-il de sorties analogiques? Q2) Définissez une entrée analogique thermo connectée sur la broche p16. Q3) Définissez une sortie analogique sound. Q4) A quelle fréquence (min ou max?) faut-on échantillonner un signal issu de la bande FM (87,5 108 MHz)? Q5) La valeur d'un objet de type AnalogOut peut-il être lu par le programme? si oui, comment? Q6) La valeur d'un objet de type AnalogIn peut-il être imposé par le programme? si oui, comment? Q7) Quel est le quantum d'un CAN 5V / 8 bits? Q8) A quoi servent les CAN et CNA? CV C/TD INFO2 - Partie 2 page 10