Utilisation du Convertisseur Analogique-Numérique - IESE3 S6 Pierre Corbineau 2022-2023 - Utilisation du Convertisseur Analogique-Numérique
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
Microcontrôleurs II - S6 Utilisation du Convertisseur Analogique-Numérique Pierre Corbineau IESE3 S6 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Variables C et classes de stockage Qu’est-ce qu’une variable C du point de vue d’un microprocesseur ? Une variable est un nom qui désigne une donnée, et aussi son adresse mémoire si cette donnée est placée dans une mémoire. Le langage C distingue trois types de variables en fonction de leur classe de stockage (storage class). I Les variables de classe static I classe par défaut des variables globales I Les variables de classe auto I classe par défaut des variables locales I Les variables de classe extern I accès à l’espace mémoire des périphériques du système La classe de stockage détermine deux choses : I où la variable est placée en mémoire. I comment et quand la variable est initialisée. Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Variables statiques et sections de données Les variables de classe static sont placées en mémoire à une adresse fixée à la compilation et initialisées au chargement du programme : I Les static const sont placées dans la mémoire Flash. (section .rodata) et n’ont pas besoin d’être initialisées. I Les static mutables (non constantes) sont placées en RAM (section .data). I On stocke dans la Flash leur valeur d’initialisation et on la recopie dans la RAM au moment du reset. I Si la valeur d’initialisation est 0, la variable est placée en section .bss (section initialisée à 0 au reset). Remarque : On peut déclarer une variable locale statique, elle se comporte comme une variable globale à portée locale. uint32_t compteur() { static uint32_t c=0; return (c++); } Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Variables automatiques et pile Les variables de classe auto (variables locales) sont placées dans les registres du CPU ou dans la pile, ou les deux (au choix du compilateur). I Elles sont initialisées pendant l’exécution du programme I Pas de différence de placement entre const et mutables. I Certaines variables intermédiaires peuvent être éliminées du calcul par les optimisations du compilateur. I Conséquence : il est difficile de connaître à l’avance l’adresse d’une variable locale. Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Variables externes et périphériques Les variables de classe extern ne sont pas placées en mémoire ni initialisées par le compilateur. Leur adresse est déterminée lors de l’édition de liens. On distingue deux utilisations : I Partage de variables globales déclarées dans d’autres fichiers ou bibliothèques I Déclaration de variables pour représenter des objets présents dans l’espace mémoire du système : (périphériques GPIOA, SysTick ...) I Les zones mémoires modifiées par le matériel doivent être déclarées volatile pour forcer le compilateur à les relire. Exemple tiré de sys/devices.h : extern const uint16_t TS_CAL2; /∗ valeurs programmées d’usine ∗/ extern const uint16_t TS_CAL1; extern const uint16_t VREFIN_CAL; . . . extern volatile struct GPIO_registers GPIOA; /∗ périphériques ∗/ Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion La conversion analogique/numérique Principe : Conversion d’une tension en valeur numérique exploitable par un programme. Les questions à résoudre : I Que veut-on mesurer ? I Quand veut-on mesurer ? Pendant combien de temps ? I Comment sont codés les résultats ? I Où sont stockés les résultats ? Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Avant de commencer : Allumage Pour utiliser les convertisseurs ADC1, ADC2, ADC3 : Il faut valider leurs horloges (ex : ADC1) enable_ADC1(); Il faut aussi allumer la partie analogique du convertisseur : ADC1.CR2|=1; /∗ ADON=1 ∗/ ADC2.CR1|=1
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Avant de commencer : les horloges Les convertisseurs analogique-numérique ADC1-3 sont reliés au bus APB2. I En TP, ce bus est cadencé à 84MHz. Les convertisseurs utilisent l’horloge ADCCLK pour leur parties analogiques. I Selon la datasheet, il faut que fADCCLK ≤ 36MHz. ADCCLK est une division de l’horloge PCK2 du bus APB2 par un prédiviseur configurable. ADC_common.CCR On va donc choisir une division par 4 (ADCPRE=01). Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Que veut-on mesurer ? (1) Un convertisseur peut mesurer une tension à la fois. Elle est choisie parmi un ensemble de sources de signaux (les canaux) : I canaux internes I capteur de température TS I tension de référence Vrefint I canaux externes I GPIO en mode analogique (MODER=0b11) Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Que veut-on mesurer ? (2) En général, on programme le convertisseur pour effectuer plusieurs mesures successives sur des canaux différents : ADC1.SQR1 ADC1.SQR2 ADC1.SQR3 Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Que veut-on mesurer ? (3) Exemple : On veut mesurer les canaux 3, 4, 5, 3 (à nouveau) , 7, 9, 10, 12. ADC1.SQR1=7
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Quand veut-on mesurer ? ADC1.CR2 La séquence de mesure peut être déclenchée : I Par logiciel : écriture d’un 1 sur le bit SWSTART (ou JSWSTART pour la séquence injectée). I Par matériel : détection d’un évènemement matériel TIMER ou EXTI. I EXTEN ou JEXTEN pour valider les fronts actifs I EXTSEL ou JEXTSEL pour choisir le signal source I Indéfiniment : CONT=1 indique le mode continu où les mesures sont relancées à chaque fin de séquence. Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Pendant combien de temps mesurer ? (1) Pour chaque canal, on peut programmer la durée d’échantillonnage pendant laquelle on mesure la tension d’entrée. La durée d’échantillonnage est un compromis : I Plus courte, elle permet de prendre des échantillons plus rapidement, et donc plus fréquemment. I Plus longue, elle permet de rester précise même pour des sources d’impédance trop forte. Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Pendant combien de temps mesurer ? (4) La durée d’échantillonnage se configure en périodes par rapport à l’horloge ADCCLK@21MHz. ADC1.SMPR1 ADC1.SMPR2 Exemple : on veut mesurer le canal 18 (TS) avec une durée supérieure à 10µs, soit au moins 10*21=210 cycles ADC, on choisit donc SMP18=0b111 (480 cycles). Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Quand sait-on que la mesure est terminée ? ADC1.SR rc_w0 = read, clear by writing 0 I Les indicateurs EOC et JEOC permettent de savoir si une séquence normale ou injectée s’est achevée. I Les indicateurs STRT et JSTRT permettent de savoir si une séquence normale ou injectée a été lancée. Exemple : attendre la fin d’une séquence injectée (JEOC=1) while((ADC1.SR & 4) == 0); /∗ ne pas oublier ; ou {} ∗/ Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Comment ? Résolution de la mesure I Une tension mesurée est codée sous la forme d’un nombre binaire sur r bits (résolution). I Une tension V donne un résultat x lorsque x V x+1 2r ≤ VDDA ≤ 2r . I Réduire la précision de mesure permet de rendre celle-ci plus rapide. I La valeur numérique mesurée est inversement proportionnelle à la tension de référence VDDA . La résolution peut être configurée dans le registre CR1 : Exemple : On mesure 123410 sur un canal avec une résolution de 12 bits et VDDA = 3, 3V ; la tension mesurée est donc environ 3, 3V ∗ 1234/4096 = 0, 994V . Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Comment ? Codage de la mesure I Les r bits significatifs d’une mesure sont rangés dans les 16-bits de poids faible d’un registre de données 32 bits. I On peut choisir de placer ces bits en position de poids fort (alignement à gauche) ou de poids faible (alignement à droite). I Le choix d’alignement se fait avec le bit 11 (ALIGN) du registre CR2. I ALIGN=0 : à droite (poids faible) I ALIGN=1 : à gauche (poids fort) Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Où ? Résultats d’une séquence Les résultats d’une séquence injectée : I disponibles après la fin de séquence dans ADC1.JDR1 à ADC1.JDR4. Les résultats d’une séquence ordinaire sont stockés dans un unique registre de données ADC1.DR. I Si une seule mesure dans la séquence (L=0 ou SCAN=0) I Le résultat est disponible dans ADC1.DR I Sinon, chaque nouveau résultat efface le précédent : I il faut recopier ailleurs chaque résultat avant qu’il ne soit effacé par le suivant (Overrun). I On peut utiliser le contrôleur DMA (Direct Memory Access) pour effectuer ces transferts de données automatiquement sans intervention logicielle. I On peut aussi faire le transfert à l’aide d’une boucle logicielle. I En configurant EOCS=1 (CR2), le bit EOC indiquera la fin de chaque mesure. I On vérifie l’absence d’overrun (OVR=0) à chaque mesure. Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Où ? Transfert des résultats Exemple : Séquence de mesure avec transfert des résultats par logiciel. uint32_t ADC_convert_sequence (volatile struct ADCx_registers *ADCx, uint32_t *data_buffer) { uint32_t len=((ADCx->SQR1>>20)&15) + 1; uint32_t i=0; ADCx->SR = 0; /∗ clear all SR flags ∗/ ADCx->CR2|=(1
C embarqué ADC Quoi ? Quand ? Comment ? Où ? Conclusion Chaîne d’acquisition complète Dans une application réelle : I Un timer génère un signal périodique. I Ce signal déclenche des mesures dans un ou plusieurs convertisseurs. I Le contrôleur DMA transfère les données acquises dans un tampon mémoire. I Le DMA signale le remplissage du tampon à une routine de traitement des données (par interruptions). Microcontrôleurs II - S6 — P. Corbineau Cours 7 IESE3 S6 — 2022–2023
Vous pouvez aussi lire