Ordinateurs

Comment utiliser les ADC dans dspic30f et dspic33f

L’auteur a terminé son projet d’ingénierie de dernière année avec les microcontrôleurs dsPic, acquérant ainsi une connaissance approfondie de ces dispositifs.

microcontrôleur dsPic30f4011 accompagné de son programmateur.

Les appareils dsPic offrent un puissant module ADC (convertisseur analogique-numérique) qui peut échantillonner à des vitesses allant jusqu’à 1 Msps. Il peut être utilisé de différentes manières et modes pour répondre aux besoins de votre projet.

Ce tutoriel a pour but d’enseigner les bases des modules de conversion A/N à tous ceux qui débutent leurs projets avec les dsPics.

Comment donner une entrée à l’ADC

La première étape consiste à configurer le matériel requis pour fournir une entrée à l’ADC.

Échantillonnage d’un signal CC

Pour les tests initiaux, vous pouvez utiliser un potentiomètre connecté sur une alimentation 5 V et donner directement une entrée aux broches analogiques ADC.

Échantillonnage d’un signal AC avec ADC

Pour échantillonner un signal alternatif (tensions ou courants de ligne), vous devrez :

  1. Abaissez le signal au niveau de tension requis à l’aide de transformateurs.
  2. Décalez le niveau du signal de sorte que les valeurs négatives inférieures à zéro soient décalées vers le haut. Les ADC dans Pics ne sont pas capables d’échantillonner les signaux négatifs.

Cette conception de circuit de référence peut vous aider avec les circuits de décalage de niveau :

Échantillonnage d'un signal AC avec ADC.  (Le gain de l'ampli-op peut être réglé via la résistance variable pour obtenir une sortie dans la plage de 0 à 5 V, j'utilise cependant une valeur de 2,7 kOhms à sa place.) (Cliquez pour agrandir).

Échantillonnage d’un signal AC avec ADC. (Le gain de l’ampli-op peut être réglé via la résistance variable pour obtenir une sortie dans la plage de 0 à 5 V, j’utilise cependant une valeur de 2,7 kOhms à sa place.) (Cliquez pour agrandir).

Test de l’ADC

Après avoir configuré le code et le matériel requis, il doit y avoir un moyen de tester si l’ADC échantillonne correctement ou non de la manière requise. Étant donné que vous ne pouvez pas jeter un coup d’œil à l’intérieur du MCU pour voir si tout se passe correctement, je suggère deux façons :

  1. Vous pouvez connecter un débogueur avec le Pic comme celui illustré ci-dessus. En mode débogage, vous pouvez vérifier la valeur dans les registres ADCBUF0 à 10 pour voir s’ils sont chargés avec des valeurs correctement échantillonnées.
  2. Vous pouvez envoyer les valeurs du registre ADCBUF via UART et les surveiller sur un PC à l’aide d’un moniteur série.
A lire aussi :  10 animations d'arrière-plan JavaScript que vous pouvez rapidement ajouter à votre site

Exemple de code ADC pour dsPic

#include "xc.h"

#define FCY 20000000
#define FPWM 3600

#include 
#include 
#include 
#include 
#include 
#include 

_FOSC( CSW_FSCM_OFF & XT_PLL8 ); // External Oscillator, PLLx8
_FWDT( WDT_OFF );                // Watchdog timer off
_FBORPOR( MCLR_DIS );            // Disable reset

int ADCValue;

void init_ADC( void )
{
    TRISB = 0xFFFF;   //Set as Input Port
    ADPCFG = 0x0000;  //Selecting all analogue pins to analogue mode
    
    ADCHSbits.CH0SA = 1;
    ADCHSbits.CH0NA = 0;
    //ADCHSbits.CH123SA = 0;
    //ADCHSbits.CH123NA = 0;
     
    IEC0bits.ADIE = 1;       //Enable ADC Interrupt       
    IPC2bits.ADIP = 1;       //set interrupt priorty-6  
                    
    ADCSSLbits.CSSL0 = 0;    //Skip input scan for analoge pin AN0,AN1,AN2
    ADCSSLbits.CSSL1 = 0;
    ADCSSLbits.CSSL2 = 0;
     
    ADCON3bits.SAMC = 0;     //Auto sample time 6TAD//max sample time
    ADCON3bits.ADRC = 0;     //selecting Conversion clock source derived from system clock
    ADCON3bits.ADCS = 9;     //Selecting conversion clock 6Tcy
     
    ADCON1bits.ADSIDL = 0;   //Selecting continue mode operation in idle mode
    ADCON1bits.FORM = 1;     //Selecting data output in signed integer format
    ADCON1bits.SSRC = 0;     //Selecting Motor Control PWM interval ends sampling and starts conversion
    ADCON1bits.SIMSAM = 0;   // Samples CH0, CH1, CH2, CH3 simultaneously 
    ADCON1bits.ASAM = 0;     //Selecting Sampling begins immediately after last conversion completes. SAMP bit is auto set
    ADCON1bits.SAMP = 0;     // At least one A/D sample/hold amplifier is sampling
     
    ADCON2bits.VCFG = 0;     //Voltage Reference Configuration bits
    ADCON2bits.CSCNA = 0;    //Disable input scan
    ADCON2bits.CHPS  = 0;    //Selecting conversion channel CH0
    ADCON2bits.SMPI = 0;     //Selecting 1 conversion sample per interrupt
    ADCON2bits.ALTS = 0;     //Uses MUX A input multiplexer settings
    ADCON2bits.BUFM = 0;     // Buffer configured as one 16-word buffer ADCBUF(15...0)
     
    ADCON1bits.ADON = 1;     //A/D converter is ON  
}
    
void readADC( )
{                      
    //ADCON1bits.SAMP = 1;  // start sampling, automatic conversion will follow
    //__delay_ms( 100 );
    ADCON1bits.SAMP = 0;        // start sampling, automatic conversion will follow
    while ( !ADCON1bits.DONE ); // wait to complete the conversion
    ADCValue = ADCBUF0;         // read the conversion result
}

void main( void ) 
{     
    init_ADC();
    int data;
    
    while( 1 )
    {
        readADC();
        data = ADCValue;      
    } 
}

Configuration du module ADC

Le module ADC peut être initialisé et configuré à l’aide du code donné ci-dessus. Un guide étape par étape suit.

Les étapes 1 à 7 sont essentielles. Après 7, tout ou partie d’entre eux peuvent être ignorés.

1. Définissez le port comme entrée et en mode analogique

  1. Le port B, sur lequel les broches d’entrée ADC sont présentes, doit être défini comme port d’entrée. (ligne – 21).
  2. Ils doivent être réglés en mode d’entrée analogique par le registre ADPCFG. (ligne-22).

2. Sélectionnez les entrées analogiques pour l’échantillonnage

Les entrées analogiques doivent être connectées à un « canal ADC » pour l’échantillonnage. Il y a généralement plus d’entrées analogiques que de canaux ; par exemple, dsPic30f4011 a 09 entrées analogiques mais seulement 04 canaux ADC. Par conséquent, vous devez maintenant sélectionner quelle broche d’entrée analogique est connectée à quel canal ADC. Ceci est fait avec l’aide du registre ADCHS.

Faites défiler pour continuer

  • Ici, AN1 est sélectionné comme entrée de broche analogique pour le canal 0. (ligne – 2).
  • Le nombre de canaux détermine le nombre d’échantillons simultanés possibles.
  • Le contrôleur peut échantillonner alternativement entre Mux A et Mux B.

Sélection de différentes combinaisons d’entrées analogiques ADC et de canaux pour les appareils dspic30f.
(les appareils dspic33f peuvent avoir plus de canaux et d’entrées disponibles)

Configurations possibles de l’ADCHSLigne de code de configuration des broches d’entrée analogique résultante

Canal 0 -> Mux A

Toute broche anlouge de AN0 à AN8 peut être sélectionnée pour donner une entrée au canal 0 via Mux A.

ADCHSbits.CH0SA = 1 ; ou tout autre numéro selon la broche

Canal 1, 2 et 3 -> Mux A

L’entrée du canal 1 est AN3, Canal 2 -> AN4, Canal 3 -> AN5

ADCHSbits.CH123SA = 1 ;

Canal 0 -> Mux B

Toute broche anlouge de AN0 à AN8 peut être sélectionnée pour donner une entrée au canal 0 via Mux B

ADCHSbits.CH0SB = 1 ; ou tout autre numéro selon la broche

Canal 1, 2 et 3 -> Mux B

L’entrée du canal 1 est AN3, Canal 2 -> AN4, Canal 3 -> AN5

ADCHSbits.CH123SB = 1 ;

3. Sélectionnez la référence de tension

Une référence de tension doit être sélectionnée pour correspondre à la plage d’entrée des entrées analogiques. Il y a deux options pour cela :

  1. Vcc et Gnd peuvent être des limites de référence supérieures et inférieures.
  2. Une tension de référence externe peut être appliquée sur la broche AVref.

Cela se fait à l’aide du bit VCFG dans le registre ADCON2. (ligne – 47)

VCFGVref (supérieur)Vref (inférieur)

0

AVdd

AVss

1

Vréf externe +

AVss

2

AVdd

Vréf externe –

3

Vréf externe +

Vréf externe –

4. Sélectionnez le format de sortie des données

Le format de sortie des données échantillonnées via ADC peut également être spécifié à l’aide du bit FORM dans le registre ADCON1, selon le tableau ci-dessous :

Format de sortie FORMData

0

entier

1

entier signé

2

fractionnaire

3

fractionnaire signé

5. Sélectionnez la source du déclencheur de conversion

La conversion analogique-numérique à l’intérieur du module ADC peut être initiée par un certain nombre de sources de déclenchement, déterminé par les bits SSRC dans le registre ADCON1 selon le tableau suivant :

Source du déclencheur de conversion SSRC

0

L’effacement manuel du bit SAMP met fin à l’échantillonnage et démarre la conversion.

1

La transition active sur la broche INT0 termine l’échantillonnage et démarre la conversion.

2

La minuterie 3 compare la correspondance termine l’échantillonnage et commence la conversion.

3

La fin du cycle PWM met fin à l’échantillonnage et démarre la conversion.

sept

Conversion automatique déclenchée par compteur interne.

6. Sélectionnez le mode d’échantillonnage

L’échantillonnage sur les canaux ADC peut être initié avec l’une des actions suivantes :

  1. Réglage manuel du bit SAMP dans le code.
  2. Automatiquement après la fin de la dernière conversion.

Ceci est décidé par le bit ASAM dans le registre ADCON1.

ModeASAM

0

L’échantillonnage commence lorsque le bit SAMP est défini

1

L’échantillonnage commence immédiatement après la fin de la dernière conversion.

7. Sélectionnez l’horloge de conversion

Toute conversion analogique-numérique avec le module A/N nécessite 12 périodes d’horloge. La période d’un seul cycle d’horloge peut être configurée à l’aide des bits ADCS dans le registre ADCON3. La valeur placée dans ADCS est une valeur à six bits. Celle-ci peut être calculée à partir des formules suivantes :

comment-utiliser-adcs-dans-dspic30f-et-dspic33f

La valeur minimale de Tad utilisable est de 154 nanosecondes.

8. Décidez si l’échantillonnage simultané est requis ou non (facultatif)

L’échantillonnage simultané peut être activé par le bit SIMSAM dans le registre ADCON1. L’échantillonnage simultané capture les échantillons de tous les canaux d’entrée précisément au même instant. Si l’échantillonnage simultané est désactivé, les canaux seront échantillonnés les uns après les autres.

9. Sélectionnez la source d’horloge de conversion (facultatif)

Dans la plupart des cas, la source d’horloge de conversion est sélectionnée pour être l’horloge système en définissant le bit ADRC du registre ADCON3 sur 0.

10. Déterminer si la numérisation des entrées est requise (facultatif)

  • Cette étape peut être ignorée dans la plupart des applications.
  • La scrutation des entrées peut être activée par le bit CSNA dans le registre ADCON2.

Le canal 0 du module ADC peut être configuré pour scanner plusieurs entrées analogiques. Cela peut être utilisé s’il y a plusieurs sources d’entrée et qu’elles ne sont pas toutes actives en même temps.

L’interruption ADC dans dspic30f et dspic33f

Au lieu d’utiliser la fonction readADC() dans le corps principal pour lire les valeurs du module ADC, une interruption est utilisée pour exécuter la même fonction dans la plupart des applications avancées.

Pour plus d’informations sur les interruptions, reportez-vous à ce didacticiel détaillé : Comment utiliser les interruptions dans les microcontrôleurs Pic

Code basé sur les interruptions pour les ADC dans dspic30f et dspic33f

#define FCY 30000000

#include 
#include 
#include 
#include 
#include 
#include 


_FOSC(CSW_FSCM_OFF & FRC_PLL16); // Fosc=16x7.5MHz, i.e. 30 MIPS
_FWDT(WDT_OFF);                  // Watchdog timer off
_FBORPOR(MCLR_DIS);

void Interrupt_Init( void )
{
    IEC0bits.ADIE = 1;       //Enable ADC Interrupt       
    IPC2bits.ADIP = 6;       //set interrupt priority = 6
}

void __attribute__((interrupt, auto_psv))_ADCInterrupt (void) 
{                      
    while ( !ADCON1bits.DONE );   // wait to complete the conversion
    sample.Va = ADCBUF0;
    sample.Vb = ADCBUF1;
        
    IFS0bits.ADIF = 0;
}

int main( void )
{
    // Make RD0 a digital output
    _TRISD0 = 0;

    Interrupt_Init();
    ADC_Init();
    
    while( 1 )
    {
        _LATD0 = 1;
        __delay32(15000000);
        _LATD0 = 0;
        __delay32(15000000);
    }
}
  • Une source de déclenchement de conversion doit être sélectionnée pour que l’interruption ADC fonctionne correctement comme indiqué à l’étape 5.
  • L’échantillonnage doit être effectué en mode automatique. (peu ASAM)
  • La fréquence de déclenchement de l’interruption ADC peut être contrôlée à l’aide de bits SMPI dans le registre ADCON2. (ligne 50).

Cet article est exact et fidèle au meilleur de la connaissance de l’auteur. Le contenu est uniquement à des fins d’information ou de divertissement et ne remplace pas un conseil personnel ou un conseil professionnel en matière commerciale, financière, juridique ou technique.

© 2017 StormsHalted

StormsHalted (auteur) de Pullman, Washington, États-Unis le 08 mai 2020 :

Les lignes de code affichées dans cet article sont testées pour fonctionner, si vous les copiez et les collez, ce sera la même chose que si je vous envoyais le code.

Vous voudrez peut-être revérifier le modèle MCU et ses bits de configuration. Celui-ci est pour dsPic30f4011.

Lucas Felfoldic le 28 mai 2019 :

Bonjour!

Tout d’abord, merci de partager vos connaissances !

Pourriez-vous expliquer un peu le code [ADCS = 9] (sur « Code d’exemple ADC pour dsPic ») ?

Dans les commentaires, vous avez dit que la conversion d’horloge est de 6Tcy, mais selon la fiche technique, Temps de conversion = (Tcy/2) * (ADCS + 1)..

.

alors,

Temps de conversion = (Tcy/2) * (9 + 1) = 5Tcy…

Ai-je tort?

Merci

AS73 le 28 avril 2019 :

Merci beaucoup. Vous avez vraiment sauvé ma journée !!

StormsHalted (auteur) de Pullman, Washington, États-Unis le 08 juin 2018 :

Essayez de déboguer avec MplabX. Cela donnera une bien meilleure interface.

Vous devrez vous déconnecter et le plug-in le récupérer. Ce type de problème n’est pas rare avec pickit.

Pramod Sing le 06 juin 2018 :

Bonjour,

Je suis confronté à un problème avec pickit3 où j’essaie de déboguer un dspic30f4011 sur lequel je ne pourrais le déboguer qu’une seule fois. Si je l’essaie à nouveau, l’ID indique qu’aucun ID de périphérique n’a été trouvé.

Bouton retour en haut de la page