Utilisation du Convertisseur Analogique-Numérique - IESE3 S6 Pierre Corbineau 2022-2023 - Utilisation du Convertisseur Analogique-Numérique

La page est créée Patrick Leduc
 
CONTINUER À LIRE
Utilisation du Convertisseur Analogique-Numérique - IESE3 S6 Pierre Corbineau 2022-2023 - Utilisation du Convertisseur Analogique-Numérique
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