TI中文支持网
TI专业的中文技术问题搜集分享网站

ADC12 1k采样率时功耗高

芯片:MSP430FR6972

问题描述:

我用MSP430FR6972的ADC以1k的采样率对一个信号进行采样,现在功能是实现了,信号能准确采集到,但是发现开始采样后功耗有点高,我做了个测试:

这个测试程序要验证的是开与不开ADC功耗的对比

a,我不开采样,进入LPM3功耗能降低到10ua。

b,我开采样(定时器间隔1ms,中断里面触发ADC采样),功耗有 500ua

请问一下有没有什么办法能够把这个功耗降下去呢?要想低功耗,ADC配置时是不是哪里要注意一下

相关代码:

/* ADC配置函数 */

void MSP_ADC_Start(void)
{
/* 打开相应电源 */
PowerSwitch(VDD_ADC,ENABLE);
PowerSwitch(ADC_BAT,ENABLE);
PowerSwitch(ADC_CAP,ENABLE); /* 开启内部参考,Vref=2.5V */
while(REFCTL0 & REFGENBUSY);
REFCTL0 |= REFVSEL_2 | REFON;
DelayMs(100);// /* 开启ADC并设置采样时间 */
ADC12CTL0 = ADC12ON | ADC12SHT0_2 | ADC12MSC;
/* ADC12SC触发采样,序列通道采样, SMCLK/4 */ ADC12CTL1 = ADC12SHP |ADC12SHS_0 | ADC12CONSEQ_1 | ADC12SSEL_3 | ADC12PDIV_1;

/* ADC通道配置: ADC_I->CH0, ADC_BAT->CH13, ADC_CAP->CH15, ADC_U2->CH14 */
ADC12MCTL0 = ADC12VRSEL_1 | ADC12INCH_0;
ADC12MCTL1 = ADC12VRSEL_1 | ADC12INCH_13; ADC12MCTL2 = ADC12VRSEL_1 | ADC12INCH_15;
ADC12MCTL3 = ADC12VRSEL_1 | ADC12INCH_14 | ADC12EOS;
/* Wait for reference generator to settle */ while(!(REFCTL0 & REFGENRDY)); ADC12CTL0 |= ADC12ENC;
ADC12IER0 = ADC12IE3;
}

/* 采样定时器初始化 1ms */

void TimerA2_Init(void)
{
TA2CCTL0 = CCIE; /* TA1CCR0 interrupt disabled */
TA2CCR0 = 32; /* 1ms的定时 */
TA2CTL = TASSEL__ACLK | MC__UP; /* ACLK, UP mode */}

/* 采样定时器中断 */

#pragma vector = TIMER1_A0_VECTOR
__interrupt void Timer1_A0_ISR(void)
{
ADC12CTL0 |= ADC12SC;     /* 定时器中断里面定时触发采样 */
}

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 函数名称:clock_init
+ 入口参数:无
+ 返回参数:无
+ 说 明:时钟初始化 ACLK=32.768KHz MCLK=DCO=16MHz SMCLK=1MHz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void Clock_Init(void)
{
FRCTL0 = FRCTLPW | NWAITS_1;
CSCTL0_H = CSKEY >> 8; /* Unlock CS registers */
CSCTL1 = DCORSEL | DCOFSEL_4; /* Set DCO to 16MHz */
CSCTL2 = SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
CSCTL3 = DIVA__1 | DIVS__16 | DIVM__1; /* Set all dividers */
CSCTL4 = HFXTOFF | LFXTDRIVE_0; CSCTL4 &= ~LFXTOFF;
do
{
CSCTL5 &= ~LFXTOFFG; /* Clear XT1 fault flag */
SFRIFG1 &= ~OFIFG;
}while (SFRIFG1&OFIFG); /* Test oscillator fault flag */
CSCTL0_H = 0; /* Lock CS registers */
/* Enable fault interrupt */
SFRIE1 |= OFIE;}

int main(void)
{
WDTCTL = WDTPW+WDTHOLD_L;
Para_Var_Init();
GPIO_Init();
Clock_Init(); USCI_A1_Init();
TimerA0_Init(); _EINT();

/* 主函数就下面两句有区别  */

Indicator_Status.Adc_Start_Flag=1; 
MSP_ADC_Start();
while(1)
{
    Data_Handle(); /* 这里面就把采样到的数据取出来处理了一下,里面除了使用了硬件乘法器,没有开其他的外设  */

    LPM3;

}

Susan Yang:

您可以对照一下上面的功耗(是没有包含外部电流的)

灰小子:

 Data_Handle()是什么函数?看main()函数里还初始化了GPIO、时钟和USCI_A1,具体是如何配置的?

如果使能了相应模块的时钟,都会产生功耗的。

Susan Yang:

JIUGEN LI:

回复 灰小子:

GPIO就是初始化一下用到的引脚,时钟就是配置主频16M,串口调试用的。我补充一些

JIUGEN LI:

回复 Susan Yang:

嗯,我就想在LPM3模式下1ms采样一次,功耗不能太高

灰小子:

回复 JIUGEN LI:

除了adc的引脚,其他引脚都配置为输出, 或者是设置为输入,但是将管脚的电平固定。
串口不要使能。
降低时钟频率到现在adc的时钟频率,不要分频。
然后你再测试看看。

JIUGEN LI:

回复 灰小子:

主频我不能降低,我还要处理数据,数据我是要20ms算一次均方根值,我就想这个功耗在保持主频不变的情况下能不能降低到200-300ua的样子,我看手册有个ADC有个低功耗模式,但是我开启了没有特别大的效果。

灰小子:

回复 JIUGEN LI:

 估计降不了多少了。你的应用不单是adc采样造成的功耗了,还有其他模块和复杂的运算。

JIUGEN LI:

回复 灰小子:

嗯,我尝试了几个不同的方式但是都没有明显的下降。

赞(0)
未经允许不得转载:TI中文支持网 » ADC12 1k采样率时功耗高
分享到: 更多 (0)