单片机学习小组
直播中

张玉兰

8年用户 1449经验值
私信 关注

MSP430F5529之ADC模数转换源程序

#include
#include "msp430.h"

#define WHEEL_DIR      P8DIR
#define WHEEL_OUT      P8OUT
#define WHEEL_EN       BIT0
#define ADC_PORT_SEL   P6SEL
#define ADC_INPUT_A5   BIT5



unsigned int positionData;
unsigned int positionDataOld;
/******************************************************************************/

void Wheel_init(void)
{
     WHEEL_DIR |= WHEEL_EN;
     WHEEL_OUT |= WHEEL_EN;                    // Enable wheel

     ADC12CTL0 = ADC12SHT02 + ADC12ON;                  // Sampling time, ADC12 on
     ADC12CTL1 = ADC12SHP;                              // Use sampling timer
     ADC12MCTL0 = ADC12INCH_5;                          // Use A5 (wheel) as input
     ADC12CTL0 |= ADC12ENC;                             // Enable conversions
     ADC_PORT_SEL |= ADC_INPUT_A5;                      // P6.5 ADC option select (A5)
}

/***************************************************************************/
uint8_t Wheel_getPosition(void)
{
             uint8_t position = 0;

             Wheel_getValue();
                                //determine which position the wheel is in
             if (positionData > 0x0806)
                 position = 7 - (positionData - 0x0806) / 128;  //scale the data for 8 different positions
             else
                 position = positionData / 260;
      return position;
}
/**************************************************************************/
int Wheel_getValue(void)
{
     //measure ADC value
     ADC12IE = 0x01;                                    // Enable interrupt
     ADC12CTL0 |= ADC12SC;                              // Start sampling/conversion
     __bis_SR_register(LPM0_bits + GIE);                // LPM0, ADC12_ISR will force exit
     ADC12IE = 0x00;                                    // Disable interrupt

     //add hysteresis on wheel to remove fluctuations
     if (positionData > positionDataOld)
         if ((positionData - positionDataOld) > 10)
             positionDataOld = positionData;            //use new data if change is beyond
                                                        // fluctuation threshold
         else
             positionData = positionDataOld;            //use old data if change is not beyond
                                                        // fluctuation threshold
     else
     if ((positionDataOld - positionData) > 10)
         positionDataOld = positionData;                //use new data if change is beyond
                                                        // fluctuation threshold
     else
         positionData = positionDataOld;                //use old data if change is not beyond
                                                        // fluctuation threshold

     return positionData;
}

/***************************************************************************/
void Wheel_disable(void)
{
     WHEEL_OUT &= ~WHEEL_EN;                            //disable wheel
     ADC12CTL0 &= ~ADC12ENC;                            // Disable conversions
     ADC12CTL0 &= ~ADC12ON;                             // ADC12 off
}
/******************************************************************************/
void Wheel_enable(void)
{
     WHEEL_OUT |= WHEEL_EN;                       //enable wheel
     ADC12CTL0 |= ADC12ON;                              // ADC12 on
     ADC12CTL0 |= ADC12ENC;                             // Enable conversions
}
/******************************************************************************/

int main(void)
{
     P1DIR=0x3F;
     Wheel_enable();
     Wheel_init();
     while(1)
     {
             Wheel_getValue();
             switch(positionData)
                             {
                         case 0:P1OUT=0x01;break;
                         case 1:P1OUT=0x02;break;
                         case 2:P1OUT=0x04;break;
                         case 3:P1OUT=0x08;break;
                         case 4:P1OUT=0x10;break;
                         case 5:P1OUT=0x20;break;
                             }

     }
}
/******************************************************************************/
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
     switch (__even_in_range(ADC12IV, ADC12IV_ADC12IFG15))
     {
         // Vector  ADC12IV_NONE:  No interrupt
         case  ADC12IV_NONE:
             break;

         // Vector  ADC12IV_ADC12OVIFG:  ADC overflow
         case  ADC12IV_ADC12OVIFG:
             break;

         // Vector  ADC12IV_ADC12TOVIFG:  ADC timing overflow
         case  ADC12IV_ADC12TOVIFG:
             break;

         // Vector  ADC12IV_ADC12IFG0: ADC12IFG0:
         case  ADC12IV_ADC12IFG0:
             positionData = ADC12MEM0;                  // ADC12MEM = A0 > 0.5AVcc?
             __bic_SR_register_on_exit(LPM0_bits);      // Exit active CPU
             break;

         // Vector  ADC12IV_ADC12IFG1:  ADC12IFG1
         case  ADC12IV_ADC12IFG1:
             break;

         // Vector ADC12IV_ADC12IFG2:  ADC12IFG2
         case ADC12IV_ADC12IFG2:
             break;

         // Vector ADC12IV_ADC12IFG3:  ADC12IFG3
         case ADC12IV_ADC12IFG3:
             break;

         // Vector ADC12IV_ADC12IFG4:  ADC12IFG4
         case ADC12IV_ADC12IFG4:
             break;

         // Vector ADC12IV_ADC12IFG5:  ADC12IFG5
         case ADC12IV_ADC12IFG5:
             break;

         // Vector ADC12IV_ADC12IFG6:  ADC12IFG6
         case ADC12IV_ADC12IFG6:
             break;

         // Vector ADC12IV_ADC12IFG7:  ADC12IFG7
         case ADC12IV_ADC12IFG7:
             break;

         // Vector ADC12IV_ADC12IFG8:  ADC12IFG8
         case ADC12IV_ADC12IFG8:
             break;

         // Vector ADC12IV_ADC12IFG9:  ADC12IFG9
         case ADC12IV_ADC12IFG9:
             break;

         // Vector ADC12IV_ADC12IFG10:  ADC12IFG10
         case ADC12IV_ADC12IFG10:
             break;

         // Vector ADC12IV_ADC12IFG11:  ADC12IFG11
         case ADC12IV_ADC12IFG11:
             break;

         // Vector ADC12IV_ADC12IFG12:  ADC12IFG12
         case ADC12IV_ADC12IFG12:
             break;

         // Vector ADC12IV_ADC12IFG13:  ADC12IFG13
         case ADC12IV_ADC12IFG13:
             break;

         // Vector ADC12IV_ADC12IFG14:  ADC12IFG14
         case ADC12IV_ADC12IFG14:
             break;

         // Vector ADC12IV_ADC12IFG15:  ADC12IFG15
         case ADC12IV_ADC12IFG15:
             break;

         default:
             break;
     }
}




更多回帖

发帖
×
20
完善资料,
赚取积分