锂电池经过2个1M的电阻分压,P6.6引脚就接在两个电阻中间;
代码如下:
/*
ADC配置
*/
void ADC_Init(void)
{
P6SEL |= BIT6; //选择P6.6作为输入;
// ADC12CTL0 &= ~ADC12ENC;
ADC12CTL0 = ADC12SHT02 + ADC12REF2_5V + ADC12ON;
ADC12CTL1 = ADC12SHP; // 采样保持脉冲来自采样定时器
ADC12MCTL0= ADC12SREF_1+ADC12INCH_6; //选择参考电压源、现在a5通道
REFCTL0 |= REFMSTR + REFVSEL_2; //使能REF管理,内部参考电压选择2.5v、打开内部参考电压
REFCTL0 |= REFON; //内部基准源电压会导致整体功耗多将近180ua;所以这里选择关闭,每次使用ADC的时候开启,使用完之后关闭;
__delay_cycles(75);
ADC12CTL0 |= ADC12ENC; // ADC12使能
}
/*
得到电池电量的值;
*/
int Get_BatValue(void)
{
float ADC_Value[20]; //定义一个数组用来保存直接采到的值;
float lingshi_data,ADC_total=0;
int reValue;
short int i=0;
unsigned char j=0;
for(i=0;i<20;i++)
{
ADC12CTL0 |= ADC12SC; // 启动转换
while ( !(ADC12IFG & BIT0) ); // 等待转换完成
ADC_Value[i] = ADC12MEM0/4096.0*2.5;
}
for(i=0;i<19;i++)
for(j=0;j<19-i;j++)
{
if(ADC_Value[j]>ADC_Value[j+1])
{
lingshi_data = ADC_Value[j];
ADC_Value[j]=ADC_Value[j+1];
ADC_Value[j+1]=lingshi_data;
}
}
for(i=5;i<15;i++)
{
ADC_total = ADC_total + ADC_Value[i];
}
ADC_total = (ADC_total/10);
reValue = (int)ADC_total;
return reValue;
}
发现这样采集到的电压值和用万用表测量出来的差了不少,而且一次采20个点,发现抖动的也比较厉害?
原因在哪里呢?