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.

请问一个可能属于钻牛角尖的问题:从低功耗模式唤醒的那段时间功耗是怎样的?

Other Parts Discussed in Thread: MSP430FR5739

 

请问一个可能属于钻牛角尖的问题:从低功耗模式唤醒的那段时间功耗是怎样的?

例如,对于ADC,一般的速率写着可以达到200k,那么也就是5us的时间,但是有的cpu的DCO建立时间却比之大,那么如果要连续快速ADC的时候,进入低功耗再由ADC中断唤醒是不是得不偿失了?不但节省不了功耗,还白白增加了运行时间?

以前的应用没这个速度,所以没注意过这个问题,或者本人看手册有点大而化之不仔细,现在又有点懒,请大侠直接指点。也许不是一个问题,就是问一下。谢谢

 

  • 这个就是在低功耗系统设计中的一些权衡了,如果您想达到200K的采样率,那CPU就不必处于低功耗模式了。

  • 要权衡,就得有根据有数据呀,所以问问

    例如,这时候用LMP0,DCO好像没关掉,情况又如何?

    我也觉得有点钻牛角尖了

    别向我说200K根本就不是适用低功耗的情况吆

  • 请问一个可能属于钻牛角尖的问题:从低功耗模式唤醒的那段时间功耗是怎样的?

    例如,对于ADC,一般的速率写着可以达到200k,那么也就是5us的时间,但是有的cpu的DCO建立时间却比之大,

    如果你这里采用200K的采样率,那么ADC模块就是一直处于工作状态,没法休眠,采样-保持-转换  这三部分都在工作,MSP430的ADC只有在完成工作后才能自动进入低功耗模式

    那么如果要连续快速ADC的时候,进入低功耗再由ADC中断唤醒是不是得不偿失了?不但节省不了功耗,还白白增加了运行时间?

    如果真的在ADC工作在200K的情况,ADC模块是没法休眠了,如果ADC设置为连续采样,假如CPU不去读采样转换的值,那么会自动丢掉覆盖,所以这里你可以采用DTC模块或者DMA模块来进行buffer,CPU依然休眠,等buffer满了再唤醒CPU,buffer的大小决定了CPU唤醒的频繁程度,但是ADC是没时间休眠了

    以前的应用没这个速度,所以没注意过这个问题,或者本人看手册有点大而化之不仔细,现在又有点懒,请大侠直接指点。也许不是一个问题,就是问一下。谢谢

  • 谢谢楼上回答,我问的是cpu的功耗,不是ADC的

    谢谢您第二段的回答,不过如果要cpu及时处理每次ADC的转换结果呢?

    我的目的是问,这种情况,CPU在这个转换时间内例如5us内是不要进入低功耗宁愿甚至空操作好还是进入低功耗好呢?

  • 如果CPU要处理每次ADC的转换结果,那么个人建议,仔细算出每个ADC转换数据处理需要的时间,间接算出CPU工作的频率,这样好让CPU在低频(例如500KHz)恰好5us内可以处理完数据,那么CPU也不用进入低功耗模式,这样做应该比较优化些。

  • 例如对于官网的code example

     

    //******************************************************************************

    //  MSP430FR57xx Demo - ADC10, Sample A1, AVcc Ref, Set P1.0 if A1 > 0.5*AVcc

    //

    //  Description: A single sample is made on A1 with reference to AVcc.

    //  Software sets ADC10SC to start sample and conversion - ADC10SC

    //  automatically cleared at EOC. ADC10 internal oscillator times sample (16x)

    //  and conversion. In Mainloop MSP430 waits in LPM0 to save power until ADC10

    //  conversion complete, ADC10_ISR will force exit from LPM0 in Mainloop on

    //  reti. If A1 > 0.5*AVcc, P1.0 set, else reset.

    //  

    //

    //                MSP430FR5739

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

    //         /|\|              XIN|-

    //          | |                 |

    //          --|RST          XOUT|-

    //            |                 |

    //        >---|P1.1/A1      P1.0|-->LED

    //

    //   Priya Thanigai

    //   Texas Instruments Inc.

    //   August 2010

    //   Built with IAR Embedded Workbench Version: 5.10 & Code Composer Studio V4.0

    //******************************************************************************

    #include "msp430fr5739.h"

     

    unsigned int ADC_Result;

     

    void main(void)

    {

      volatile unsigned int i;

     

      WDTCTL = WDTPW+WDTHOLD;                   // Stop WDT

      P1DIR |= BIT0;                            // Set P1.0/LED to output direction

     

      // Configure ADC

      P1SEL1 |= BIT1; 

      P1SEL0 |= BIT1; 

     

      ADC10CTL0 |= ADC10SHT_2 + ADC10ON;        // ADC10ON, S&H=16 ADC clks

      ADC10CTL1 |= ADC10SHP;                    // ADCCLK = MODOSC; sampling timer

      ADC10CTL2 |= ADC10RES;                    // 10-bit conversion results

      ADC10MCTL0 |= ADC10INCH_1;                // A1 ADC input select; Vref=AVCC

      ADC10IE |= ADC10IE0;                      // Enable ADC conv complete interrupt

     

      for (;;)

      {

        __delay_cycles(5000);

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

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

        __no_operation();                       // For debug only

        if (ADC_Result < 0x1FF)

          P1OUT &= ~BIT0;                       // Clear P1.0 LED off

        else

          P1OUT |= BIT0;                        // Set P1.0 LED on

      }

    }

     

    // ADC10 interrupt service routine

    #pragma vector=ADC10_VECTOR

    __interrupt void ADC10_ISR(void)

    {

      switch(__even_in_range(ADC10IV,12))

      {

        case  0: break;                          // No interrupt

        case  2: break;                          // conversion result overflow

        case  4: break;                          // conversion time overflow

        case  6: break;                          // ADC10HI

        case  8: break;                          // ADC10LO

        case 10: break;                          // ADC10IN

        case 12: ADC_Result = ADC10MEM0;         

                 __bic_SR_register_on_exit(CPUOFF);                                              

                 break;                          // Clear CPUOFF bit from 0(SR)                         

        default: break; 

      }  

    }

     

     

     

    如果将

     

    for (;;)

      {

        __delay_cycles(5000);

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

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

        __no_operation();                       // For debug only

        if (ADC_Result < 0x1FF)

          P1OUT &= ~BIT0;                       // Clear P1.0 LED off

        else

          P1OUT |= BIT0;                        // Set P1.0 LED on

      }

     

    如果上述程序中没有使用LMP0而是使用LMP3

    那么改成

     

    for (;;)

      {

        __delay_cycles(5000);

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

        while(AD终端标志不为真);

    ADC_Result = ADC10MEM0; 

        if (ADC_Result < 0x1FF)

          P1OUT &= ~BIT0;                       // Clear P1.0 LED off

        else

          P1OUT |= BIT0;                        // Set P1.0 LED on

      }并取消使能ADC中断

     

     

    是不是能够确定还是前者功耗低呢?

  • 是的,毕竟进入中断只需要10个cycle左右,而进入低功耗模式是一设置立即生效,所以这5个us还是可以达到一定的降功耗作用。

  • 楼上,不好意思,我没有提及LMP3,我改了上一个帖子一下,红色的

    想到这个问题的时候我还特地看了一下这个example ,并且注意到了example是使用的LMP0,好像DCO是不关闭的。贴这个帖子的时候到忘了,直接copy了

  • 呵呵,DCO关闭不关闭不是问题,ADC12模块可以用MODOSC,独立于LPM模式来使能或者关闭。

    现在关键问题是内部的LDO从关闭到稳定的时间,可能会达到ms级别,所以这样下来是没有意义了。

  • 还是不懂,我说的不是ADC的功耗,虽然在ADC的基础上讨论这个问题可能没有意义,因为功耗的差别可能不值得提了,但是讨论总是可以的吧?再说这种情形可以发生在非ADC应用的情况下吧?例如定时器启动后进入低功耗,如果值得考虑,那么对于定时器定时中断多长时间的时候值得考虑这种情形?