请问一个可能属于钻牛角尖的问题:从低功耗模式唤醒的那段时间功耗是怎样的?
例如,对于ADC,一般的速率写着可以达到200k,那么也就是5us的时间,但是有的cpu的DCO建立时间却比之大,那么如果要连续快速ADC的时候,进入低功耗再由ADC中断唤醒是不是得不偿失了?不但节省不了功耗,还白白增加了运行时间?
以前的应用没这个速度,所以没注意过这个问题,或者本人看手册有点大而化之不仔细,现在又有点懒,请大侠直接指点。也许不是一个问题,就是问一下。谢谢
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.
请问一个可能属于钻牛角尖的问题:从低功耗模式唤醒的那段时间功耗是怎样的?
例如,对于ADC,一般的速率写着可以达到200k,那么也就是5us的时间,但是有的cpu的DCO建立时间却比之大,那么如果要连续快速ADC的时候,进入低功耗再由ADC中断唤醒是不是得不偿失了?不但节省不了功耗,还白白增加了运行时间?
以前的应用没这个速度,所以没注意过这个问题,或者本人看手册有点大而化之不仔细,现在又有点懒,请大侠直接指点。也许不是一个问题,就是问一下。谢谢
请问一个可能属于钻牛角尖的问题:从低功耗模式唤醒的那段时间功耗是怎样的?
例如,对于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的转换结果,那么个人建议,仔细算出每个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还是可以达到一定的降功耗作用。
呵呵,DCO关闭不关闭不是问题,ADC12模块可以用MODOSC,独立于LPM模式来使能或者关闭。
现在关键问题是内部的LDO从关闭到稳定的时间,可能会达到ms级别,所以这样下来是没有意义了。