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)
}
Aucun commentaire:
Enregistrer un commentaire