新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 仪表设计中的浮点数问题及解决办法

仪表设计中的浮点数问题及解决办法

作者:时间:2011-02-16来源:网络收藏

经过研究发现,问题出现在处理累积量的方法上。在前面的程序中直接通过每秒执行一次语句“Cureulation=Cumulation+Instant;”来计算累积量。而参考文献明确告诉我们,两个浮点数相加时,其误差随着两个数差别的增大而增大,表2中误差的变化规律也证明了这一点。这是因为每次执行语句“Cumulation=Cumulation+Instant;”时,Instant是不变的,而Cumulation在不断增加。当两者大小相差的数量级足够大时,Instant与Cumulation相加会丢失Instant,致使流量计累积量读数不再发生变化,这也是前面调试时出现问题的原因。
这个问题可以应用汇编编程的处理方法来解决,但此种方法比较繁琐,编程比较困难。本文给出了一种新的处理方法。上述大数加小数丢失小数的情况在整数相加时是不存在的,同时,流量计在运行时当测量的瞬时流量小于下限流量时会当作干扰信号切除掉,累积量无需累加。实验数据表明,当瞬时流量在下限流量和上限流量限定的全量程范围内变化时,累积量小于4000时测量精度完全满足技术指标的要求。我们采用的办法是,将累积量分两部分来存储。为此,另定义一个unsigned long型变量HBCumu,每当Cumulation累加超过2000时执行下述操作:
HBCumu=HBCumu+2000;
Cumulation=Cumulation-2000;
即每次将Cumulation中的2000转存到HBCumu中,由于计算HBCumu时采用的是整数相加,因此不存在精度问题。同时通过此种操作,可以把Cumulation和Instant的大小差别限定在一个合适的范围内,从而保证计算Cumulation时精度满足要求。在EEPROM中分别给HBCumu、Cumu-lation开辟有独立的存储单元,每个存储周期分别存储两者的值。当前累积量的真实值等于HBCumu和Cumulation的和,显示数据时先求两者的和再进行显示。采用新方法后,在与前述相同的测试条件下重新对流量计进行测试,实测数据如表3所列。测试开始时刻,流量计的初始读数为86。

本文引用地址:http://www.eepw.com.cn/article/151028.htm

c.JPG


比较表3和表2的数据可以看出,采用转存方法对累积量进行存储后,很好地解决了测量精度随时间增加而变差的问题。我们对累积量计数满99 999 999的前后阶段也进行了测试,实验结果表明,测量误差与表3中的误差一致,这表明在全量程范围内误差都稳定在一个令人满意的范围内。此种方法与利用汇编编程处理的方法相比,避免了利用汇编代码处理浮点数的繁琐工作,保持了C语言的高效性和代码的良好移植性。

2 存储问题
项目要求在流量计正常运行时能够随时设定液体的密度、流量系数等参数,并且这些参数小数点后数据的位数固定。比如密度设定值,数据设定范围为0.001~999.999,小数点后固定为3位数据。程序编制完毕在调试阶段发现的问题是,当把参数设置完毕存入EEPROM、再读出来时,读出的数据和存入的数据并不一致。比如设定密度值为123.456,设定完毕存入EEPROM,然后读出来的数据是形如123.454这样的数据。
经过仔细研究最终发现,问题还是出现在对float型数据的处理上。由参考文献可知,float型数据在存储时,存储的并不是精确值,而是近似值。而在设计程序时,定义密度设定值dEn为float型,并直接对其进行存取处理。针对这个问题的处理办法是,定义dEn为unsigned long型的数据,其中存放的数据是密度实际设定值放大1000倍后的数据,在程序其他地方用到密度设定值时,只需要将其除以1000得到真实值即可。这样在参数设定完毕存入。EEPROM及从EEPROM中读出数据时,实际上都是以整数形式进行操作的,这样就可以保证数据的正确性。为了给操作者一种仍旧是在设定一个小数点后有3位小数的参数的感觉,在设定和显示参数过程中,始终点亮LCM141相关数据位的小数点。

结语
本文讨论了笔者在设计流量计的过程中,利用C语言操作浮点数所遇到的问题,这种问题在其他仪表及嵌入式系统设计中也是普遍存在的。针对这些问题给出了解决方法,且已经成功地在实际项目中得到应用,具有一定的参考价值。


上一页 1 2 下一页

关键词: C语言

评论


相关推荐

技术专区

关闭