51单片机采集的AD值的转换程序问题?

AD器件是24位的AD7731,读回来的数据是24位的,分高、中、低三个八位,采集的信号最大值是30mv,假设A,B,C代替采集回来的高,中,低三个八位数据,怎样把ABC... AD器件是24位的AD7731,读回来的数据是24位的,分高、中、低三个八位,采集的信号最大值是30mv,假设A,B,C代替采集回来的高,中,低三个八位数据,怎样把ABC转换成电压值?这种算法貌似不好做,信号还是毫伏级别的,我开始直接把ABC转换成十进制的数,假设是Data,参考电压2.5V,2^24=16777216,利用公式计算:V=Data*2.5/16777216,这样不就溢出了吗?单片机没法算了啊?请教下高手怎样算?通过了加分的 谢谢了啊 O(∩_∩)O哈哈~
都是高手啊 能不能留下你们的联系方式啊 O(∩_∩)O哈哈~ QQ?EMAIL;?
展开
 我来答
做而论道
高能答主

2010-04-17 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3.1万
采纳率:82%
帮助的人:8434万
展开全部
上次回答了你的问题,难道你上次选择的最佳答案,没有用吗?
--------------------
0~2.5V,对应于AD_data = 0~11111......1111(24位二进制);
那么1V就是:6710886(十进制)。
用24位值AD_data除以6710886,得到的整数部分就是0~5,即为电压的整数部分。
再把刚才除得的余数,再除以10,取整数将得到0~9,即为电压的第一位小数;
余数,再除以10,取整数将得到0~9,即为电压的第二位小数;
……
想要取多少位小数,就计算多少次。
----
这种算法,既不会溢出,也没有计算误差,我已经用过多年;
呵呵,但是过去都是处理16位数的数值。
楼主现在使用24位的,分辨率达到了0.15微伏,估计 也没有什么用处。
不如舍弃低8位,只用高、中8位,按照16数进行数据处理,精度也可以达到0.038毫伏,足以满足一般的要求了。
----
呵呵,计算误差,肯定是没有的,误差,是显示位数不够引起的。
changhao513
2010-04-17 · TA获得超过797个赞
知道小有建树答主
回答量:285
采纳率:0%
帮助的人:0
展开全部
使用你这种算法的话,用长整形long就不会溢出了。在C51里面,int占两个字节,这里确实会溢出;而long占四个字节,范围可以到2147483647,这里不会溢出。
另外你要考虑浮点型和整形的转换问题。其实如果数据不是很多组的话,我推荐直接用float型进行运算,更方便,也不会溢出:
V=Data/(16777216.0/2.5);
试试吧,要是还有问题说明有可能是你之前“把ABC转换成十进制的数”那里错了
---------------------------
四楼做而论道说的多好。。要显示的话用他的思路就好,可以写一个ftoa函数封装起来,这样用着更方便
没误差是不可能的,下面的方法可以试一下:
(假设采集的值从高到低为A,B,C三个字节)
long Data=0;
double V=0.0;
Data|=A;
Data<<=8;
Data|=B;
Data<<=8;
Data|=C;
V=Data/(16777216.0/2.5);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友c7cc77f63
2010-04-17 · TA获得超过2144个赞
知道小有建树答主
回答量:909
采纳率:0%
帮助的人:566万
展开全部
强制转换~~~
double V;
V=((double)Data)*2.5/16777216;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
蓝色水桶
2010-04-17 · TA获得超过721个赞
知道小有建树答主
回答量:600
采纳率:75%
帮助的人:167万
展开全部
你是要对采集的信号进行处理,还是输出啊,怎么会出现数字信号又转换成电压信号,这不是D/A的活吗,你所说的溢出那是你的算法不对,你的单片机是几位的啊,8位吗,建议你好好查查D/A转换资料
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式