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