IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Convertisseur AN sur MSP430 [MSP430]


Sujet :

Embarqué

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut Convertisseur AN sur MSP430
    Bonjour à tous,




    Je viens vers vous car j'ai besoin de vos connaissances avisées en programmation..

    J'utilise un MSP430(F5529) et je souhaite brancher dessus un capteur de température. Le soucis est le suivant :

    Je vais utiliser un port comportant un corvertisseur analogique numérique, disponible sur le MSP mais je ne trouve aucune source d'information concernant sa configuration (code avec Code Composer Studio en C) ni sur le port à utiliser (P1.0 ou P1.1 ou P1.2 ou ...).

    J'ai essayé de trouver des infos dans la datasheet du MSP : http://www.ti.com/lit/ds/symlink/msp430f5529.pdf

    mais mes recherches n'aboutissent pas...

    Pour le type de capteur utiliser, il s'agit du suivant : http://pdf1.alldatasheet.com/datashe...CS/LM335Z.html
    LM335Z




    Dans l'attente de votre aide..

    Bien à vous

  2. #2
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    Bonjour,

    Dans la documentation (premier lien que tu donnes) du MSP, page 14 section 4.2 Signal Description tu as la liste des broches associées aux ADC. Par exemple première ligne du tableau tu as P6.4 pour une utilisation GPIO qui devient A4 si tu l'utilises en ADC.

    dM
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  3. #3
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 191
    Points : 11 577
    Points
    11 577
    Par défaut
    Salut,
    Tu as aussi des exemples sur mspware
    http://dev.ti.com/tirex/#/?link=Software%2FMSP430Ware

    Tu n'arrives pas à faire quoi au juste ?
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci pour vos réponses. J'ai été rechercher un peu dans les exemples dont tu me parles, j'ai trouvé un exemple qui ressemble beaucoup à ce que je souhaite faire. Cependant pour moi c'est tout simplement du chinois.. j'aimerais comprendre comment on configure un port capable de transformer un signal analogique en numérique..
    Voilà le code que j'ai trouvé et que j'essaie de comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <msp430.h>
    
    volatile unsigned int results[4];           // Needs to be global in this example
                                                // Otherwise, the compiler removes it
                                                // because it is not used for anything.
    
    int main(void)
    {
      WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
      P6SEL = 0x0F;                             // Enable A/D channel inputs
      ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_2; // Turn on ADC12, set sampling time
      ADC12CTL1 = ADC12SHP+ADC12CONSEQ_1;       // Use sampling timer, single sequence
      ADC12MCTL0 = ADC12INCH_0;                 // ref+=AVcc, channel = A0
      ADC12MCTL1 = ADC12INCH_1;                 // ref+=AVcc, channel = A1
      ADC12MCTL2 = ADC12INCH_2;                 // ref+=AVcc, channel = A2
      ADC12MCTL3 = ADC12INCH_3+ADC12EOS;        // ref+=AVcc, channel = A3, end seq.
      ADC12IE = 0x08;                           // Enable ADC12IFG.3
      ADC12CTL0 |= ADC12ENC;                    // Enable conversions
    
      while(1)
      {
        ADC12CTL0 |= ADC12SC;                   // Start convn - software trigger
        
        __bis_SR_register(LPM4_bits + GIE);     // Enter LPM4, Enable interrupts
        __no_operation();                       // For debugger    
      }
    }
    
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=ADC12_VECTOR
    __interrupt void ADC12ISR (void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
        switch(__even_in_range(ADC12IV,34))
      {
      case  0: break;                           // Vector  0:  No interrupt
      case  2: break;                           // Vector  2:  ADC overflow
      case  4: break;                           // Vector  4:  ADC timing overflow
      case  6: break;                           // Vector  6:  ADC12IFG0
      case  8: break;                           // Vector  8:  ADC12IFG1
      case 10: break;                           // Vector 10:  ADC12IFG2
      case 12:                                  // Vector 12:  ADC12IFG3
        results[0] = ADC12MEM0;                 // Move results, IFG is cleared
        results[1] = ADC12MEM1;                 // Move results, IFG is cleared
        results[2] = ADC12MEM2;                 // Move results, IFG is cleared
        results[3] = ADC12MEM3;                 // Move results, IFG is cleared
        __bic_SR_register_on_exit(LPM4_bits);   // Exit active CPU, SET BREAKPOINT HERE  
      case 14: break;                           // Vector 14:  ADC12IFG4
      case 16: break;                           // Vector 16:  ADC12IFG5
      case 18: break;                           // Vector 18:  ADC12IFG6
      case 20: break;                           // Vector 20:  ADC12IFG7
      case 22: break;                           // Vector 22:  ADC12IFG8
      case 24: break;                           // Vector 24:  ADC12IFG9
      case 26: break;                           // Vector 26:  ADC12IFG10
      case 28: break;                           // Vector 28:  ADC12IFG11
      case 30: break;                           // Vector 30:  ADC12IFG12
      case 32: break;                           // Vector 32:  ADC12IFG13
      case 34: break;                           // Vector 34:  ADC12IFG14
      default: break; 
      }
    }

    Au vue des documentations techniques je souhaite utiliser un port : 12-Bit Analog-to-Digital Converter (ADC)
    Pour cela au vue du schémas suivant :
    Nom : Captura.PNG
Affichages : 1218
Taille : 389,3 Ko
    je peux utiliser les ports suivants : de P6.0 à P6.6 et P7.0
    Apres je me perd un peu quand il s'agit de choisir une chaine, je ne comprends pas trop comment ça marche et comment configurer le port sur code composer studio..
    Nom : Captura.PNG
Affichages : 1195
Taille : 130,0 Ko


    J'espere ne pas être trop flou..

    Bien à vous

  5. #5
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 191
    Points : 11 577
    Points
    11 577
    Par défaut
    Citation Envoyé par eliters48 Voir le message
    Cependant pour moi c'est tout simplement du chinois..
    Mais non... c'est de l'anglais

    Chez Texas Instruments il faut jongler avec 2 docs :

    ps : J'ai aussi une carte de développement MSP430F5529LP chez moi et tu as choisi un micro costaud pour apprendre. Il est très complet.

    Citation Envoyé par eliters48 Voir le message
    j'aimerais comprendre comment on configure un port capable de transformer un signal analogique en numérique..
    Dans tous les microcontrôleurs, les broches sont multiplexés avec des périphériques, dit autrement une broche peut faire un certain nombre de choses différentes. Il y a toujours un registre (ou une combinaison de registres) qui permet de basculer la broche sur l'un ou l'autres de périphériques et ici c'est une combinaison entre PxSEL (x étant le numéro du port) et PxDIR (x étant le numéro du port). C'est donc au travers d'eux qui tu choisies la fonction d'une broche.

    Nom : im9.PNG
Affichages : 1176
Taille : 96,8 Ko

    Ci dessus par exemple, avec la combinaison de deux registres la broche P2.6 peut être soit une entrée sortie, soit être mis en relation avec le DMA ou avec l'horloge temps réel.


    Ton programme se sépare grosso modo en 4 parties (je ne garde que les principales)

    Réglage des broches A0, A1, A2 et A3 en entrées analogique/numérique
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
      P6SEL = 0x0F;                             // Enable A/D channel inputs

    Réglage de l'ADC, là il faut simplement lire la partie concernée dans les docs pour comprendre le rôle des registres
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_2; // Turn on ADC12, set sampling time
      ADC12CTL1 = ADC12SHP+ADC12CONSEQ_1;       // Use sampling timer, single sequence
      ADC12MCTL0 = ADC12INCH_0;                 // ref+=AVcc, channel = A0
      ADC12MCTL1 = ADC12INCH_1;                 // ref+=AVcc, channel = A1
      ADC12MCTL2 = ADC12INCH_2;                 // ref+=AVcc, channel = A2
      ADC12MCTL3 = ADC12INCH_3+ADC12EOS;        // ref+=AVcc, channel = A3, end seq.
      ADC12IE = 0x08;                           // Enable ADC12IFG.3
      ADC12CTL0 |= ADC12ENC;                    // Enable conversions

    Le programme principal, on lance une conversion puis en passe en mode veille (niveau 4 presque mourut) mais en laissant les interruptions actives.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      while(1)
      {
        ADC12CTL0 |= ADC12SC;                   // Start convn - software trigger
     
        __bis_SR_register(LPM4_bits + GIE);     // Enter LPM4, Enable interrupts
        __no_operation();                       // For debugger    
      }
    }

    Le programme d'interruption.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #pragma vector=ADC12_VECTOR
    __interrupt void ADC12ISR (void)
    {
        switch(__even_in_range(ADC12IV,34))
      {
      case  0: break;                           // Vector  0:  No interrupt
      case  2: break;                           // Vector  2:  ADC overflow
      case  4: break;                           // Vector  4:  ADC timing overflow
      case  6: break;                           // Vector  6:  ADC12IFG0
      case  8: break;                           // Vector  8:  ADC12IFG1
      case 10: break;                           // Vector 10:  ADC12IFG2
      case 12:                                  // Vector 12:  ADC12IFG3
        results[0] = ADC12MEM0;                 // Move results, IFG is cleared
        results[1] = ADC12MEM1;                 // Move results, IFG is cleared
        results[2] = ADC12MEM2;                 // Move results, IFG is cleared
        results[3] = ADC12MEM3;                 // Move results, IFG is cleared
        __bic_SR_register_on_exit(LPM4_bits);   // Exit active CPU, SET BREAKPOINT HERE  
      case 14: break;                           // Vector 14:  ADC12IFG4
      case 16: break;                           // Vector 16:  ADC12IFG5
      case 18: break;                           // Vector 18:  ADC12IFG6
      case 20: break;                           // Vector 20:  ADC12IFG7
      case 22: break;                           // Vector 22:  ADC12IFG8
      case 24: break;                           // Vector 24:  ADC12IFG9
      case 26: break;                           // Vector 26:  ADC12IFG10
      case 28: break;                           // Vector 28:  ADC12IFG11
      case 30: break;                           // Vector 30:  ADC12IFG12
      case 32: break;                           // Vector 32:  ADC12IFG13
      case 34: break;                           // Vector 34:  ADC12IFG14
      default: break; 
      }
    }

    Je n'arrive pas bien à comprendre ce que tu souhaitais savoir ? Tu ne comprends peut être pas comment naviguer dans les docs ? Tu ne comprends pas la philosophie du micro et comment il s'articule à l'intérieur ? Tu bloques sur des registres en particuliers ?

    A+
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Bonjour Vincent,


    D'abord merci pour tes explications très détaillées, j'apprécie beaucoup.

    Première chose que je ne comprends pas :

    Réglage des broches A0, A1, A2 et A3 en entrées analogique/numérique
    Code C :
    P6SEL = 0x0F; // Enable A/D channel inputs
    Si je souhaite utiliser que le port P6.0 et utiliser son convertisseur analogique numérique, ne suffit il pas d'écrire : "P6SEL |= BIT0;" ?

    Ne suffit il donc pas ensuite de configurer uniquement le chaine A0 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_2; // Turn on ADC12, set sampling time
      ADC12CTL1 = ADC12SHP+ADC12CONSEQ_1;       // Use sampling timer, single sequence
      ADC12MCTL0 = ADC12INCH_0+ADC12EOS;                 // ref+=AVcc, channel = A0
     ADC12IE = 0x08;                           // Enable ADC12IFG.3 Je ne comprends pas cette ligne, pourquoi 0x08?
      ADC12CTL0 |= ADC12ENC;                    // Enable conversions
    Enfin, pourquoi utiliser une interruptions ? ne peut on pas simplement lire la valeur uniquement quand on le souhaite et le demander sans faire d'interruption ?

    ERRATUM : ne doit on pas également configurer le port en question comme une entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       //ENTREES
        P6DIR &=~ (BIT0);

    Bien à toi, Pierre

  7. #7
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 191
    Points : 11 577
    Points
    11 577
    Par défaut
    Citation Envoyé par eliters48 Voir le message
    Si je souhaite utiliser que le port P6.0 et utiliser son convertisseur analogique numérique, ne suffit il pas d'écrire : "P6SEL |= BIT0;" ?
    En effet ou encore :

    P6SEL |= 0x01; // mettre à 1 uniquement P6.0 pour le configurer en entrée l'ADC et pour les autres bits, on y touche pas

    et lorsqu'on maîtrise tout on peut carrément faire

    P6SEL = 0x01; // mettre à 1 P6.0 pour le configurer en entrée l'ADC et les autres bits seront des I/O




    Citation Envoyé par eliters48 Voir le message
    Ne suffit il donc pas ensuite de configurer uniquement le chaine A0 ?[...]
    Oui.




    Citation Envoyé par eliters48 Voir le message
    ADC12IE = 0x08; // Enable ADC12IFG.3 Je ne comprends pas cette ligne, pourquoi 0x08?
    Parce que 0x08 (vue en binaire) va configurer l'autorisation de déclencher une interruption à chaque fois que le flag IFG3 se produira. Dans quasiment tous les microcontrôleurs, peu importe le fabriquant, les noms des registres se terminant par IE, signifiant "Interrupt Enable", sont liés avec des registres portant des noms se terminant par IF, signifiant "Interrupt Flag". Ces derniers sont souvent générés par le matériel directement, ils changent de valeurs aux rythmes du périphérique, ici l'ADC et le microcontrôleur permet de déclencher une interruption à chaque fois que le flag change d'état.

    Pour rappel :
    ADC12MEM3 interrupt flag. This bit is set when ADC12MEM3 is loaded with a
    conversion result. This bit is reset if the ADC12MEM3 is accessed, or it may be
    reset with software.
    En gros, une fois la conversion analogique/numérique effectuée, le flag passe à 1 tout seul et si le bit "interrupt enable" qui y est lié est activé alors cela déclenche une interruption.




    Citation Envoyé par eliters48 Voir le message
    Enfin, pourquoi utiliser une interruptions ? ne peut on pas simplement lire la valeur uniquement quand on le souhaite et le demander sans faire d'interruption ?
    Tu n'es pas obligé d'utiliser une interruption. Tu peux très bien faire un while((ADC12IFG & 0x08) == 1) { [...] } // Si le flag 3 passe à 1 alors la conversion A3 est réalisée et je peux aller la lire
    Avec le temps tu verras qu'en règle général, il vaut mieux user et abuser des interruptions car la solution de polling juste au dessus monopolise le micro en attendant la conversion. Pendant ce temps là, le micro ne peut rien faire. Avec une interruption, le micro fait ce qu'il a à faire tant que la conversion n'est pas faire et si il ne fait rien alors on peut même le mettre en veille pour l'économie d'énergie. Il se réveillera une fois la conversion réalisée. Le programme de démonstration est fait en ce sens, par défaut le micro est en veille et lorsque la conversion est faite, l'interruption arrive ce qui réveil le micro.




    Citation Envoyé par eliters48 Voir le message
    ne doit on pas également configurer le port en question comme une entrée
    Exacte. Par défaut, lorsqu'un micro démarre toutes les broches sont en entrées (c'est donné dans la datasheet) mais tu as raison c'est plus prudent de le faire.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse et ta réactivité

    C'est de plus en plus claire pour moi, mais je pense qu'il me manque encore quelques points à comprendre à ce sujet..

    Pour l'instant mon code est le suivant : (le but étant de lire la valeur d'un capteur de température sur le port P6.0 sans utiliser d'interruption)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <msp430.h>
    
    
    void main( void )
    {
        int resultat=0;
    
    
        WDTCTL = WDTPW + WDTHOLD; // Arrêt du Watchdog
    
        //ENTREES
        P6DIR &=~ (BIT0);
        P6SEL |= BIT0;                             // Enable A/D channel inputs
        ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_2; // Turn on ADC12, set sampling time
        ADC12CTL1 = ADC12SHP+ADC12CONSEQ_1;       // Use sampling timer, single sequence
        ADC12MCTL0 = ADC12INCH_0+ADC12EOS;                 // ref+=AVcc, channel = A0
        ADC12CTL0 |= ADC12ENC;                    // Enable conversions
    
        while((ADC12IFG & 0x08) == 1)
        {
            ADC12CTL0 |= ADC12SC;                   // Start convn - software trigger
            resultat = ADC12MEM0;
        }
    
    }
    Par ailleurs j'aimerais lire cette valeur (resultat, qui correspond à la valeur retournée par le capteur), dans la partie oú les variables sont affichés dans code composer studio, mais je n'y arrive pas, je pense que c4est dû à une erreur dans mon programme..

  9. #9
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 191
    Points : 11 577
    Points
    11 577
    Par défaut
    Re,
    J'ai été ambigüe sur un point avec mon histoire de while. L'explication est bonne mais l'exemple est tordu, c'est plutôt avec un if que j'aurai du l'expliquer.


    Essaye ceci.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <msp430.h>
     
     
    void main( void )
    {
        int resultat=0;
     
     
        WDTCTL = WDTPW + WDTHOLD; // Arrêt du Watchdog
     
        //ENTREES
        P6DIR &=~ (BIT0);
        P6SEL |= BIT0;                             // Enable A/D channel inputs
        ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_2; // Turn on ADC12, set sampling time
        ADC12CTL1 = ADC12SHP+ADC12CONSEQ_1;       // Use sampling timer, single sequence
        ADC12MCTL0 = ADC12INCH_0+ADC12EOS;                 // ref+=AVcc, channel = A0
        ADC12CTL0 |= ADC12ENC;                    // Enable conversions
        ADC12CTL0 |= ADC12SC;                   // Start convn - software trigger
     
        while(ADC12IFG & 0x01 == 0) // attention pas 0x08 car ça c'est pour l'entrée A3 ---->  0x01 = A0, 0x02 = A1, 0x04 = A2, 0x08 = A3, 0x10 = A4 etc...
            ; // attendre la conversion 
     
     
     
    // conversion ok, on peut lire le registre
        resultat = ADC12MEM0;
     
     
    }
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonsoir à tous

    Citation Envoyé par Vincent PETIT Voir le message
    Avec le temps tu verras qu'en règle général, il vaut mieux user et abuser des interruptions car la solution de polling juste au dessus monopolise le micro en attendant la conversion. Pendant ce temps là, le micro ne peut rien faire. Avec une interruption, le micro fait ce qu'il a à faire tant que la conversion n'est pas faire et si il ne fait rien alors on peut même le mettre en veille pour l'économie d'énergie. Il se réveillera une fois la conversion réalisée. Le programme de démonstration est fait en ce sens, par défaut le micro est en veille et lorsque la conversion est faite, l'interruption arrive ce qui réveil le micro.
    Petit complément aux très bonnes réponses de Vincent: La mise en veille économise un peu de consommation, mais surtout en arrêtant certaines horloges elle réduit le bruit de l'alimentation (car il y a moins de pics de courants dessus, vu qu'une partie du micro ne travail plus) et augmente en conséquence la qualité de la conversion A/D.
    Par contre l’interruption peut très bien ne pas avoir de code, son rôle étant alors juste de réveiller le cœur du micro pour qu'il continue le programme. Le pseudo code est alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    démarrer la conversion A/D
    Sleep
    While (conversion non terminée); // le while de l'explication de Vincent, dans le cas où c'est une autre interruption qui a réveillé le micro
    lecture du résultat
    suite du programme
    Edit: petite faute pour le while,(j'ai corrigé ) et on ne peut pas faire appel au while telle que expliqué par Vincent car le flag (IF) est probablement remit à 0 par l'appel à l’interruption (qui réveil le micro).
    Soit il y a un autre bit d'un registre qui permet de savoir si une conversion est en cours, soit il faut travailler par une variable commune entre l’interruption et le code principale (l’interruption met la variable à 1, le code principale vérifie puis remet à 0). Désolé pour la réponse vague, mon domaine de compétence se limite aux AVR...

    Delias

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Bonjour à tous,

    Tout d'abord je souhaite vous remercier une fois de plus pour vos réponses. Grâce à vous je comprends mieux comment configurer et lire ce que renvoie le capteur.

    Le programme fonctionne et je suis capable de lire ce que le capteur renvoie, en revanche les valeurs renvoyées sont très variable alors que la température est constante ou quasi...
    J'essaie de lire la datasheet du capteur et trouver la réponse mais j'ai un peu de mal à admettre ces variations..

    La raison pour laquelle je ne souhaite pas utiliser d'interruption, c'est que je travaille dans le cadre d'un projet, et nous utilisons plusieurs interruptions, mais pour le capteur de température nous souhaitons uniquement aller voir la température quand l'utilisateur le demande

    Bien à vous, Pierre

  12. #12
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 191
    Points : 11 577
    Points
    11 577
    Par défaut
    Citation Envoyé par eliters48 Voir le message
    les valeurs renvoyées sont très variable alors que la température est constante ou quasi...
    Qu'elle est l'ordre de grandeur des variations ?

    Citation Envoyé par eliters48 Voir le message
    J'essaie de lire la datasheet du capteur et trouver la réponse mais j'ai un peu de mal à admettre ces variations..
    Ça peut aussi venir du hard.


    Ce micro n'a pas un capteur de température intégré ? Je n'ai pas la doc sous les yeux mais il me semble que si. Chez Texas Instruments, ils le font souvent.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réactivité..

    Tête en l'air que je suis.. j'avais oublié la resistance préconisée dans la datasheet.. avec ca marche beaucoup mieux...
    mais maintenant je n'ai que de toute petite varriations même quand j'essaie de changer de manière conséquente la température..


    Effectivement il y a bien un sonde de température dans le MSP mais pour des raisons de précision nous avons choisi de mettre une autre sonde..

    Au niveau du hard : - j'ai branché la borne V+ du capteur sur la borne 3V3 du MSP
    - la borne V- á la masse
    - la borne ADJ (sortie) au port P6.0
    - J'ai placé une résistance de 10kOhms entre la masse et la borne ADJ de sortie

    Le registre ADC12MEM0 varie entre 2710 et 2740 quand je suis dans une pièce à 26 degres (clim) et quand je place mon doigt sur le capteur pareil..

    Je continue de chercher ce qui cloche.. il devrait y avoir une variation de 10mV/K selon la datasheet d'après mon montage.. je me demande bien ce qui cloche..

    Pour tester j'ai ce programme dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
         WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer
    while(1)
        {
            P6DIR &=~ (BIT0);
            P6SEL |= BIT0;                             // Enable A/D channel inputs
            ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_2; // Turn on ADC12, set sampling time
            ADC12CTL1 = ADC12SHP+ADC12CONSEQ_1;       // Use sampling timer, single sequence
            ADC12MCTL0 = ADC12INCH_0+ADC12EOS;                 // ref+=AVcc, channel = A0
            ADC12CTL0 |= ADC12ENC;                    // Enable conversions
            ADC12CTL0 |= ADC12SC;                   // Start convn - software trigger
            temperature=ADC12MEM0;
            while(ADC12IFG & 0x01 == 0) //   0x01 = A0 channel , 0x02 = A1, 0x04 = A2, 0x08 = A3, 0x10 = A4 etc...
                    ; // wait to the convertion
                temperature = ADC12MEM0;
        }
    Bien à vous, Pierre

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Nom : Captura.PNG
Affichages : 1127
Taille : 177,8 Ko

    et je visualise la valeur du registre en haut à droite, j'espere qu'on fait comme ça.. j'execute le programme ligne par ligne

  15. #15
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonsoir

    Citation Envoyé par eliters48 Voir le message
    Au niveau du hard : - j'ai branché la borne V+ du capteur sur la borne 3V3 du MSP
    - la borne V- á la masse
    - etc...
    Avec cela tu as de la chance si tu n'as pas le LM335.
    Le schéma basic est pourtant donné, page 1 du datascheet:
    - 3.3V ou 5V du MCP sur la résistance R1.
    - l'autre borne de la résistance R1 sur la borne V+ du LM335
    - la borne V- du LM335 à la masse du MCP
    La résistance de 10k est un potentiomètre de 10k et est utilisée pour calibrer le senseur.

    Maintenant R1 doit être calculé pour avoir d'environ 1mA dans le LM335, et sur toute la plage de fonctionnement le courant doit être entre 400µA et 5mA. Point 8.2.2 du datascheet de TI.
    Tension à 25°C = 2.982V, en alimentation à 5V, c'est environ 2V, donc R1 = 2k2.
    Température minimum -55°C, tension de 2.182 V, courant de (5-2.182) / 2.2 < 1.5mA c'est OK
    Température maximum 125V, tension de 4V, courant de (5-4) / 2.2 > 0.4mA, c'est OK

    Mais l'entrée analogique du MCP est limitée à 3.3V voir moins cela entraine donc une limitation de la plage de température mesurable. Faire également attention à ce que l'entrée ne soit pas exposée à une tension significativement supérieur au VCC du MCP (3.3V)

    Delias

  16. #16
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Merci à toi pour tes précisions Délias!

    Je ne sais pas si j'ai fais les branchement correctements, j'ai un doute sur la resistance de 10kOhms.. mais en sortie j'obtiens une valeur de 2600-2700 qui doit correspondre à 2.6-2.7V pour une température de 26 degres?

    j'ai du mal a la faire varier, même en laissant mon doigt sur la capteur...

    Bien à vous

  17. #17
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 191
    Points : 11 577
    Points
    11 577
    Par défaut
    Pour valider ton soft, décâble ton LM335 et connecte plutôt un simple pont diviseur de tension avec un potentiomètre. Tu pourra faire varier le tout facilement et faire un contrôle entre ce qu'indique un voltmètre et ton soft.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  18. #18
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse :

    en faisant un pont diviseur de tension, R1=2.2k Ohms ; R2=10k Ohms ; tension d'entree 5V ; tension mesurée 4095mV ; tension calculée 4.098V
    Cela semble cohérent de ce côté

  19. #19
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Cela signifie que la conversion AN s'effectue correctement et sort un résultat en mV

  20. #20
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Nom : Captura.PNG
Affichages : 1069
Taille : 10,5 Ko

    Je ne comprends pas la chose suivante : lorsque je réalise le montage suivant (cf photo) :
    ADJ relié directement au port 6.0 du MSP
    V+ relié à R1=2.2kOhms puis relié à 5V MSP
    V- directement relié à la masse du MSP

    Pourquoi lors des test je lis toujours la valeur 4095 ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [MSP430] Interruption sur MSP430G2553
    Par ahmad3333 dans le forum Embarqué
    Réponses: 3
    Dernier message: 01/01/2016, 16h04
  2. insstaller un convertisseur video sur ubuntu
    Par peleo de buftizon dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 20/08/2010, 11h23
  3. besoin d'avis sur convertisseur USB/parallele
    Par Vash__ dans le forum Périphériques
    Réponses: 3
    Dernier message: 29/09/2009, 10h17
  4. aide sur convertisseur d'euro
    Par scofild20 dans le forum Débuter
    Réponses: 4
    Dernier message: 04/12/2008, 15h28
  5. [Kylix] Kylix embarqué sur PDA ?
    Par Anonymous dans le forum NoSQL
    Réponses: 10
    Dernier message: 29/11/2002, 13h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo