请教一个AD转换的问题

[复制链接]
3586|11
 楼主| golden_finger 发表于 2009-12-2 19:22 | 显示全部楼层 |阅读模式
用单片机测量一个模拟电压,用数码管显示,
单片机得到了12位的数字电压,也算出最小电压度数是0.00061V,
那么,任意一个12位的数字信号要乘这个最小度数得到电压值,
这个在程序中要怎么乘?12位是整数,而0.00061是个小数,
一般有没有什么办法的 ?
andy2003hu 发表于 2009-12-2 19:34 | 显示全部楼层
是BCD码还是二进制码?是二进制的话直接乘
HWM 发表于 2009-12-2 20:02 | 显示全部楼层
通常是用这个式子:Vmax * D / 4095.0
其中Vmax是满量程,D是AD读出值。
mohanwei 发表于 2009-12-2 20:05 | 显示全部楼层
把得到的AD值放到一个unsigned long型变量里,然后乘以61,得到有效数字。现在可以把结果拿去显示了,显示完了,自己在适当的位置补上一个小数点……

当然如果你能用浮点数就简单多了
char buff[20];
f=AD_Result;
f *= 0.00061;
sprintf(buff,"电压值:%.2fV",f);//保留2位小数
disp(buff);

评分

参与人数 1威望 +1 收起 理由
golden_finger + 1

查看全部评分

 楼主| golden_finger 发表于 2009-12-2 20:15 | 显示全部楼层
感谢大家的,尤其是 mohanwei的回复,不论在单片机还是PC机上对浮点数的处理都比较麻烦的
原野之狼 发表于 2009-12-2 20:30 | 显示全部楼层
HWM老师 应该是4096.0吧
HWM 发表于 2009-12-2 20:35 | 显示全部楼层
把得到的AD值放到一个unsigned long型变量里,然后乘以61,得到有效数字。现在可以把结果拿去显示了,显示完了,自己在适当的位置补上一个小数点……

当然如果你能用浮点数就简单多了
char buff[20];
f=AD_Result;
...
mohanwei 发表于 2009-12-2 20:05

这样通常会累积误差。
HWM 发表于 2009-12-2 20:37 | 显示全部楼层
HWM老师 应该是4096.0吧
原野之狼 发表于 2009-12-2 20:30

4095和4096差异不大,但通常用4095,因为D最大也就是4095
mohanwei 发表于 2009-12-2 20:39 | 显示全部楼层
其实麻烦也是MCU的麻烦,你可能见多intel,ARM……实际上普通8位机的速度也是你很难想象的。我以前就经常在51上使用浮点运算,printf……实在没法才会自己优化转换。
大多数项目里MCU基本出于空转状态,闲着也是闲着……你按个按键它都要等个几十ms,这段时间就算是标准的51跑在12MHz时钟下,都可以执行几万条指令了,新的单周期系列更是可以执行几十万条……
原野之狼 发表于 2009-12-2 21:08 | 显示全部楼层
8# HWM
对于此处是这么回事 但是关键是4095.0是怎么来的 这个比较重要 呵呵
winsunhy 发表于 2009-12-3 17:45 | 显示全部楼层
8# HWM  
对于此处是这么回事 但是关键是4095.0是怎么来的 这个比较重要 呵呵
原野之狼 发表于 2009-12-2 21:08

12位表示的最大数就是4095吧,如1位最大只能表示1
songjie08 发表于 2009-12-3 20:04 | 显示全部楼层
是这么回事!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

28

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部