This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

新手求基于msp430g2553定时器A0触发ADC10每隔一段时间采样的程序

Other Parts Discussed in Thread: MSP430G2553

       本人刚接触map430不久,在定时器和ad采样方面有很多问题,希望高手帮忙解答。

       目的:实现定时器A0触发ADC10每隔一段时间采样,其他时间cpu有别的事干,采样对象为湿度传感器传回的电压值(0v~2.1v)。

       问题:1、低功耗LPM0模式下cpu停止,怎么还能执行main函数中的指令?

                 2、如何实现定时器A0触发ADC10每隔一段时间采样?求程序。 (这是主要问题)

                   3、从ADC10MEM中读出的数据如何转化成0~100的数值,如何建立公式?

  • zhang hao3,关于你的疑问,

    1. 低功耗LPM0模式下cpu停止,是不能执行任何指令的,只是一直处于LPM0状态下。只是当你使用CCS或者IAR调试时,一直发现停下来时,都是停在进入LPM0的下一句,这是正常的。虽然指向这里,但是一直是处于LPM0的。如果同时又打开了GIE的话,那么中断可以将CPU从LPM0唤醒,来执行对应的中断处理函数,如果在退出中断时,又退出了LPM0,那么就会在退出中断后,执行main函数中LPM0之后的程序。

    2. 可以使用TimerA来输出PWM, 然后使用PWM来触发ADC10采用,从而实现每隔一段时间采样。可参考附件中的例子。

    3. 如果你只是想将ADC10MEM的值转换为0~100的数值,而不是实际对应的电压值,那么,

    ADC10MEM的值的范围应该为0~1023,故若ADC10MEM=0,则value(0~100) = 0; 若ADC10MEM=1023,则value(0~100) = 100.

    故 value(0~100) = ADC10MEM / 1023 * 100.


  • 恩恩。。谢谢了

  • 1. 低功耗LPM0模式下,不能运行主程序。推出后执行进入低功耗语句后面的程序。

    2. 建议使用中断方式,触发ADC10。

    3.ADC10MEM中为AD采样值范围是0~1023。转化为0~100可以考虑转化成百分数 ADC10MEM/1023*100%

  • 您好,我刚学MSP430,关于第二个问题,我想请问下,TimerA 的那些信号可以用来触发ADC10采样呢? 另外,手册中提到ADC10SC bit 、Timer_A.OUT1、Timer_A.OUT0 都可以触发ADC10,那么这几个信号分别是什么意思呢?分别指什么信号呢?谢谢!

  • 我想问一下

    TACCTL1 = OUTMOD_4; // Toggle on EQU1 (TAR = 0)

    TACTL = TASSEL_2 + MC_2; // SMCLK, cont-mode     这两句话是用Timer_A.OUT1来触发AD采集,这个控制触发的周期是多少呢?假如说我的SMCLK是500Khz

  • 我想实现用定时器隔段时间进行ad10多通道采样,可是只能一次采集,还有好像进不了adc10的中断,求助 

    #include "msp430g2553.h" #define num_of_results 12

    #define uint unsigned int

     #define uchar unsigned char

    //unsigned int a[50],b[50];

    //static float adc0,adc1;

     int cc=0;

    unsigned char flag;

     void led_init();

    void timer_init(); void delay(int);

    void ADC_convert();

     uint a[num_of_results];

    void delay(int i) 

     {int j,k;  

     for(j=0;j<110;j++)    for(k=0;k<i;k++); }

     void led_init()

    {   P1DIR|=(1<<6); //P1.6为LED }

    //--------------------------

    void timer_init()

     {   TACCR0 =62500;  //计到62500,约500ms  

     TACTL = TASSEL_2+ID_3+MC_1+TACLR;  //设置TIMERA的时钟源为SMCLK(1M),8分频后(125K),计数模式为up,到CCR0再自动从0开始计数  

     TACCTL0 |= CCIE;                             // CCR0 interrupt enabled }

     //--------定时器中断函数------------

     #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A(void)

     {   //TACCTL0&=~ CCIE; //关中断   _EINT();

      cc+=1;   if(cc==2)  //1s=1000ms=2*500 定时

      {    P1OUT^=(1<<6); //P1.6 LED取反  

      cc=0;  

     ADC_convert();   } }

    //*************ADC转化及中断程序*********************

    void ADC_convert()

     {//static unsigned int results[num_of_results] = {0};  //   static unsigned char index ;//静态变量   

      _BIS_SR(GIE);   ADC10CTL1 = INCH_5 + CONSEQ_1;            // A3/A2/A1, single sequence

      ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE + REFON + REF2_5V ;

      ADC10DTC1 = 0x0c;                         // 3 conversions  

    ADC10AE0 |= 0x38;                         // P1.3,2,1 ADC10 option select  

    P1DIR |= 0x01;                            // Set P1.0 output

       _EINT();

          ADC10CTL0 &= ~ENC;    

    while (ADC10CTL1 & BUSY);               // Wait if ADC10 core is active    // ADC10SA = 0x200;                        // Data buffer start   

    // for(index=0;index<12;index+=6)    

    { ADC10SA = (uint)a;//[index++] ;            //(uint)a     }  

        P1OUT |= 0x01;                          // P1.0 = 1     // delay(2500);   

          ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start    

     __bis_SR_register(GIE);        // LPM0, ADC10_ISR will force exit  CPUOFF +    

    P1OUT &= ~0x01;                         // P1.0 = 0    // delay(25000);  }

    // ADC10中断服务程序

     #pragma vector=ADC10_VECTOR

    __interrupt void ADC10_ISR(void)

     {   _EINT();   /*static unsigned char index = 0;//静态变量   results[index++] = ADC10SA;//移动ADC结果到results数组ADC10MEM   if(index == 5)//是否转换了100次   {     index = 0;      flag = 1;   } */   

    _BIS_SR(GIE);    LPM0_EXIT; // 退出低功耗模式0  ADC10IFG }

    //************主函数***************************

     void main()

    {   WDTCTL = WDTPW + WDTHOLD;          // Stop WDT  

     BCSCTL1 = CALBC1_1MHZ;  

     DCOCTL = CALDCO_1MHZ;  

     _DINT() ; //关闭中断

      led_init();   

     timer_init();  

      _EINT();               //开总中断 _BIS_SR(GIE);

       for(;;)   {   ;   } }

     

  • 请问TimerA来输出PWM, 然后使用PWM来触发ADC10采用,从而实现每隔一段时间采样是怎么实现的呢?

    谢谢!