锂电池经过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个点,发现抖动的也比较厉害?
原因在哪里呢?