msp430的AD转换问题

2019-03-24 16:37发布

用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条回答
jxb01033016
2019-03-25 07:08
ADCBUF = ADCBUF>>1;

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

ADCBUF = ADCBUF>>4;

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

一周热门 更多>

相关问题

    相关文章