[求助] msp430的AD转换问题

linjingui   2009-9-22 11:05 楼主
用430实现电压监测功能
读取ADC12MEM0的值,发现电压很稳的情况,该值不是很稳。我采用多次采样取平均的方法,不知道大家觉得如何。另外如果要计算电量的百分比,需要做进制转换吗?请看我的代码有啥问题。谢谢指点。
  1. void AD(void)
  2. {
  3. unsigned char i;
  4. unsigned int buf;
  5. for(i=0;i<0x0F;i++){ //连续采样16次,再取平均
  6. ADC12CTL0 |= ADC12SC; // 启动AD
  7. while((ADC12IFG&0X01)==0); //选择通道A0. 0x01对应P6.0
  8. buf=ADC12MEM0; //测得该电压对应AD值
  9. ADCBUF=buf + ADCBUF;
  10. TimeDelay(10);
  11. }
  12. ADCBUF = ADCBUF>>1;
  13. }

  14. void F4(void) // 响应“剩余电量”执行函数
  15. {
  16. unsigned char a,b,c,f;
  17. unsigned int d;
  18. PutString_cn(10,0,"剩余电量");
  19. AD(); //调用
  20. a=ADCBUF & 0XF00 >>8;
  21. b=ADCBUF & 0X0F0 >>4;
  22. c=ADCBUF & 0X00F;
  23. a=a&0x08*8+a&0x04*4+a&0x02*2+a&0x01;a=a*256; //十六进制转换为十进制
  24. b=b&0x08*8+b&0x04*4+b&0x02*2+b&0x01;b=b*16;
  25. c=c&0x08*8+c&0x04*4+c&0x02*2+c&0x01;
  26. d=(a+b+c);
  27. if(d<1106) d=1006; //电压值的下线
  28. else if(d>3007) d=3007; //电压值的上限
  29. d=(d-1106)*1000/1901;
  30. b=d/10; //百分比的整数部分
  31. c=d%10; //百分比的一位小数部分
  32. Show_Char(15,25,b,2); //显示出来
  33. Show_Char(42,25,c,1);
  34. // if x<1106 报警
  35. // x/3007 * 100% 显示82.4%

  36. PutString_cn(0,50,"按任意键退出");
  37. f=1;
  38. while(f){
  39. if ((P2IN&Key_Value)!=Key_Value) f=0;
  40. }
  41. TimeDelay(500);
  42. }

  43. /*AD模块初始化*/
  44. void ADC_Init(void)
  45. {
  46. ADC12CTL0 = ADC12ON+SHT0_2+REF2_5V+REFON; //参考电压选为2.5V
  47. ADC12CTL1 = SHP;
  48. ADC12CTL0 |= ENC; // Enable conversion
  49. }

回复评论 (7)

发现电压很稳的情况,该值不是很稳

请检查你的程式.MSP430性能很好的.不应该出现这样的问题.
点赞  2009-9-22 13:10
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);

这个完全是多余的.
点赞  2009-9-22 13:13
ADCBUF = ADCBUF>>1;

错误,
因为是16次采样,所以要除以16,也就是左移4位.

ADCBUF = ADCBUF>>4;

[ 本帖最后由 jxb01033016 于 2009-9-22 13:15 编辑 ]
点赞  2009-9-22 13:14

5楼 yjj 

好久没用430了,学习学习!
点赞  2009-9-22 13:25
不用进制转换,怎么计算百分比呢?
点赞  2009-9-22 13:31
在计算机里,都是用16进制表示的,你把16进制转换成10进制,又将10进制转换成16进制,饶了个圈子,又回到原点.
点赞  2009-9-22 13:54
要改的地方都给你指出来了,你自己完善吧.
点赞  2009-9-22 14:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复