mardi 10 juillet 2012

Mesure d'un signal analogique avec le MSP430 Launchpad

Cette fois, j'ai appris à traiter un signal d'entrée analogique au moyen de l'ADC10, un convertisseur analogique-numérique à 10 bits.  Encore une fois, je me suis basé sur un des fichiers d'exemple fournis par Texas Instruments, sauf qu'au lieu d'allumer une seule LED lorsque le signal analogique atteint 50% de la valeur maximale de 3,3 V, j'en allume progressivement 5 à mesure que le signal analogique augmente en intensité.

Le circuit consiste en un potentiomètre dont la broche de gauche est branchée à GND, la broche du centre est branchée à l'entrée P1.0, et la broche de droite est reliée à VCC.  En tournant le potentiomètre, le voltage à l'entrée P1.0 variera donc de façon continue entre 0 et 3,3 V environ.  Bien entendu, ce potentiomètre pourrait être remplacé par n'importe quel autre signal analogique:  photorésistance ou thermistance placée en série avec une résistance fixe, etc.

Ensuite, chaque sortie P1.1, P1.2, P1.3, P1.4 et P1.5 est branché à sa LED, qui est elle-même reliée en série avec une résistance de protection, puis raccordée à GND.

Voici le code;  comme toujours, c'est plus compliqué qu'avec un Arduino, mais il s'agira de faire du copier-coller pour réutiliser le code dans d'autres projets (en acheminant la valeur analogique mesurée à un afficheur LCD, on peut créer tout un tas d'appareil de mesures sophistiqués).  J'ai essayé de commenter le plus possible, en espérant que ça pourra être utile à quelqu'un.



//***************************************************************************
//   Traitement d'un signal analogique
//     
//  La broche centrale d'un potentiomètre est reliée à l'entrée P1.0
//  du Launchpad. 5 LEDs branchées aux sorties P1.1, P1.2, P1.3, P1.4 et
//  P1.5 s'allument quand on tourne le potentiomètre.  La LED branchée à
//  P1.1 s'allume lorsque le signal issu du potentiomètre atteint 15% de 
//  3.3 V,, P1.2 s'allume à 30%, etc.
//  Basé sur l'exemple "msp430g2x33_adc10_01.c" fourni par Texas Instruments.
//***************************************************************************

#include "msp430g2553.h"

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;    // Désactivation du chien de garde
  
  ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // Démarrage du convertisseur
                                     // analogique- numérique (ADC10ON), 
                                     // interrupt enabled (ADC10IE),  
                                     // Timer Sample and Hold = /16
  ADC10CTL1 = INCH_0;    // input channel A0 (il y en a 8,numérotés de 0 à 7)
  ADC10AE0 |= 0x01;  //  La pin 1.0 est définie comme entrée analogique
  
  P1DIR |= BIT1+BIT2+BIT3+BIT4+BIT5;   // P1.1, 1.2,1.3, 1.4 et 1.5 définis 
             // en output (LEDs)
                                       // Même chose que:
                                       // P1DIR |= 0x02+0x04+0x08+0x10+0x20;
  for (;;)  // on entre dans la boucle infinie
  {
    ADC10CTL0 |= ENC + ADC10SC;      // Début de l'échantillonnage et de la 
                                     // conversion
                                     // ENC:  enable conversion
                                     // SC:  start conversion
    __bis_SR_register(CPUOFF + GIE);    // Low power mode, en attendant le 
                                        //résultat
   
   
    if (ADC10MEM < 0x099)     // ADC10MEM contient la valeur analogique
                              // mesurée (entre 0 et 1023)
                              // 0x099 = 153 (15% du maximum)
      P1OUT &= ~BIT1;                       // Éteint la LED branchée à P1.1
    else
      P1OUT |= BIT1;                        // Allume la LED branchée à P1.1
 
  
      if (ADC10MEM < 0x133)     // ADC10MEM contient la valeur analogique
                              // mesurée (entre 0 et 1023)
                              // 0x133 = 307 (30% du maximum)
      P1OUT &= ~BIT2;                       // Éteint la LED branchée à P1.2
    else
      P1OUT |= BIT2;                        // Allume la LED branchée à P1.2
      
      
      if (ADC10MEM < 0x1CC)     // ADC10MEM contient la valeur analogique
                              // mesurée (entre 0 et 1023)
                              // 0x1CC = 460 (45% du maximum)
      P1OUT &= ~BIT3;          // Éteint la LED branchée à P1.3
    else
      P1OUT |= BIT3;          // Allume la LED branchée à P1.3
 
       if (ADC10MEM < 0x266)     // ADC10MEM contient la valeur analogique
                              // mesurée (entre 0 et 1023)
                              // 0x266 = 614 (60% du maximum)
      P1OUT &= ~BIT4;    // Éteint la LED branchée à P1.4
    else
      P1OUT |= BIT4;     // Allume la LED branchée à P1.4
      
      
     if (ADC10MEM < 0x2FF)     // ADC10MEM contient la valeur analogique
                              // mesurée (entre 0 et 1023)
                              // 0x2FF = 767 (75% du maximum)
      P1OUT &= ~BIT5;    // Éteint la LED branchée à P1.5
    else
      P1OUT |= BIT5;     // Allume la LED branchée à P1.5
      
  }
  
}

// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
  __bic_SR_register_on_exit(CPUOFF);  // Clear CPUOFF bit from 0(SR)
}


Yves Pelletier (Twitter: @ElectroAmateur)

Aucun commentaire:

Enregistrer un commentaire