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.

ADC12 1k采样率时功耗高

Other Parts Discussed in Thread: MSP430FR6972

芯片: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;

}