msp430g2553AD10采样

2019-07-15 16:52发布

#include <msp430g2553.h>
int nADC_Flag;
int nADC_Count=0;
unsigned int ADC_BUF[40];
unsigned int ADC_BUF_Temp[40];
void Init_CLK(void);
void Init_ADC(void);
void Init_timer0_A(void);
void Init_CLK(void)
{
                                   DCOCTL=0X00;
                                   //将DCO校准到1Mhz
                                   BCSCTL1=CALBC1_1MHZ;
                                   DCOCTL=CALDCO_1MHZ;
                                   //将SMCLK和MCLK的时钟源设为DCO
                                   BCSCTL2=SELM_0+SELS;
}
void Init_ADC(void)
{
                     P1SEL |= BIT1;       //设置P1.1为模拟输入通道
                     ADC10CTL0 &=~ENC;
                     ADC10CTL1 = CONSEQ_0;                   //转换模式为:单通道、单次转换 CONSEQ_0
                         ADC10CTL0 = SREF_1 + REFON +  REF2_5V;         //SREF_1+REFON +REF2_5V表示使用内部参考电压2.5v
                           ADC10CTL0=ADC10SHT_0+MSC;//MSC转换时由SHI上升沿触发
                     ADC10CTL1 = INCH_1+SHS_0+ADC10SSEL_0;                       // input A1
                     ADC10CTL0=ADC10ON;
                         ADC10AE0 |= 0x02;                             // PA.1ADC option select
             ADC10CTL0 |=ADC10IE;

}
void Init_Timer0_A(void)
{
         // 选择SMCLK,清除TAR
    TACTL = TASSEL_1+TACLR;
        // CCR0 中断允许
     TACCTL0 =CCIE;
        // 时间间隔为 500us
      CCR0 = 500;
        // 增记数模式
    TA0CTL |= MC_1;
}

void main(void)
{
        int i;
        // 关闭看门狗
        WDTCTL = WDTPW + WDTHOLD;
  // 初始化
    Init_CLK();
        // 打开中断
        _EINT();
    Init_Timer0_A();
    Init_ADC();

        // 循环处理
        for(;;)
        {
                if(nADC_Flag == 1)
                {
                        nADC_Flag = 0;
                        for(i = 0;i <40;i++)
                        {
                                ADC_BUF_Temp[i] = ADC_BUF[i];
                                ADC_BUF_Temp[i] =2.5*ADC_BUF_Temp[i] /1023;
                        }

                }
        }

}
#pragma vector=TIMER0_A0_VECTOR
__interrupt  void TimerA_ISR(void)
{
        // 开启转换
                ADC10CTL0 |= ENC + ADC10SC;

}
#pragma vector=ADC10_VECTOR
__interrupt void ADC_ISR(void)
{
          ADC10CTL0 &=~ENC;
          ADC_BUF[nADC_Count] = ADC10MEM;
            // 计数器加1
          nADC_Count += 1;
                // 采集完40个点
           if(nADC_Count ==40)
            {
                        // 设置标志
                nADC_Flag = 1;
                        // 计数器清0
                nADC_Count = 0;
            }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。