
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;? 展开
都是高手啊 能不能留下你们的联系方式啊 O(∩_∩)O哈哈~ QQ?EMAIL;? 展开
4个回答
展开全部
上次回答了你的问题,难道你上次选择的最佳答案,没有用吗?
--------------------
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毫伏,足以满足一般的要求了。
----
呵呵,计算误差,肯定是没有的,误差,是显示位数不够引起的。
--------------------
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毫伏,足以满足一般的要求了。
----
呵呵,计算误差,肯定是没有的,误差,是显示位数不够引起的。
展开全部
使用你这种算法的话,用长整形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);
另外你要考虑浮点型和整形的转换问题。其实如果数据不是很多组的话,我推荐直接用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);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
强制转换~~~
double V;
V=((double)Data)*2.5/16777216;
double V;
V=((double)Data)*2.5/16777216;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你是要对采集的信号进行处理,还是输出啊,怎么会出现数字信号又转换成电压信号,这不是D/A的活吗,你所说的溢出那是你的算法不对,你的单片机是几位的啊,8位吗,建议你好好查查D/A转换资料
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询