打印

请教一个AD转换的问题

[复制链接]
2090|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
5
golden_finger|  楼主 | 2009-12-2 20:15 | 只看该作者
感谢大家的,尤其是 mohanwei的回复,不论在单片机还是PC机上对浮点数的处理都比较麻烦的

使用特权

评论回复
6
原野之狼| | 2009-12-2 20:30 | 只看该作者
HWM老师 应该是4096.0吧

使用特权

评论回复
7
HWM| | 2009-12-2 20:35 | 只看该作者
把得到的AD值放到一个unsigned long型变量里,然后乘以61,得到有效数字。现在可以把结果拿去显示了,显示完了,自己在适当的位置补上一个小数点……

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

这样通常会累积误差。

使用特权

评论回复
8
HWM| | 2009-12-2 20:37 | 只看该作者
HWM老师 应该是4096.0吧
原野之狼 发表于 2009-12-2 20:30

4095和4096差异不大,但通常用4095,因为D最大也就是4095

使用特权

评论回复
9
mohanwei| | 2009-12-2 20:39 | 只看该作者
其实麻烦也是MCU的麻烦,你可能见多intel,ARM……实际上普通8位机的速度也是你很难想象的。我以前就经常在51上使用浮点运算,printf……实在没法才会自己优化转换。
大多数项目里MCU基本出于空转状态,闲着也是闲着……你按个按键它都要等个几十ms,这段时间就算是标准的51跑在12MHz时钟下,都可以执行几万条指令了,新的单周期系列更是可以执行几十万条……

使用特权

评论回复
10
原野之狼| | 2009-12-2 21:08 | 只看该作者
8# HWM
对于此处是这么回事 但是关键是4095.0是怎么来的 这个比较重要 呵呵

使用特权

评论回复
11
winsunhy| | 2009-12-3 17:45 | 只看该作者
8# HWM  
对于此处是这么回事 但是关键是4095.0是怎么来的 这个比较重要 呵呵
原野之狼 发表于 2009-12-2 21:08

12位表示的最大数就是4095吧,如1位最大只能表示1

使用特权

评论回复
12
songjie08| | 2009-12-3 20:04 | 只看该作者
是这么回事!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

28

帖子

1

粉丝