用430实现电压监测功能
读取ADC12MEM0的值,发现电压很稳的情况,该值不是很稳。我采用多次采样取平均的方法,不知道大家觉得如何。另外如果要计算电量的百分比,需要做进制转换吗?请看我的代码有啥问题。谢谢指点。
- void AD(void)
- {
- unsigned char i;
- unsigned int buf;
- for(i=0;i<0x0F;i++){ //连续采样16次,再取平均
- ADC12CTL0 |= ADC12SC; // 启动AD
- while((ADC12IFG&0X01)==0); //选择通道A0. 0x01对应P6.0
- buf=ADC12MEM0; //测得该电压对应AD值
- ADCBUF=buf + ADCBUF;
- TimeDelay(10);
- }
- ADCBUF = ADCBUF>>1;
- }
- void F4(void) // 响应“剩余电量”执行函数
- {
- unsigned char a,b,c,f;
- unsigned int d;
- PutString_cn(10,0,"剩余电量");
- AD(); //调用
- a=ADCBUF & 0XF00 >>8;
- b=ADCBUF & 0X0F0 >>4;
- c=ADCBUF & 0X00F;
- a=a&0x08*8+a&0x04*4+a&0x02*2+a&0x01;a=a*256; //十六进制转换为十进制
- b=b&0x08*8+b&0x04*4+b&0x02*2+b&0x01;b=b*16;
- c=c&0x08*8+c&0x04*4+c&0x02*2+c&0x01;
- d=(a+b+c);
- if(d<1106) d=1006; //电压值的下线
- else if(d>3007) d=3007; //电压值的上限
- d=(d-1106)*1000/1901;
- b=d/10; //百分比的整数部分
- c=d%10; //百分比的一位小数部分
- Show_Char(15,25,b,2); //显示出来
- Show_Char(42,25,c,1);
- // if x<1106 报警
- // x/3007 * 100% 显示82.4%
- PutString_cn(0,50,"按任意键退出");
- f=1;
- while(f){
- if ((P2IN&Key_Value)!=Key_Value) f=0;
- }
- TimeDelay(500);
- }
- /*AD模块初始化*/
- void ADC_Init(void)
- {
- ADC12CTL0 = ADC12ON+SHT0_2+REF2_5V+REFON; //参考电压选为2.5V
- ADC12CTL1 = SHP;
- ADC12CTL0 |= ENC; // Enable conversion
- }
复制代码
此帖出自
小平头技术问答
错误,
因为是16次采样,所以要除以16,也就是左移4位.
ADCBUF = ADCBUF>>4;
[ 本帖最后由 jxb01033016 于 2009-9-22 13:15 编辑 ]
一周热门 更多>