称重仪表的零点跟踪
这个是我做的零点跟踪。大致是把总重的数据total 先转换成他的绝对值,然后根据菜单中设置的小数位信息把他放大10倍,100倍,1000倍,10000倍,然后取整,对应小数位是1为小数,2为小数,3为小数,4为小数。然后把他根据显示分度值的信息在做转换,方法是把那个放大的数据减去该数据对显示分度值的模。最后根据零点跟踪的信息来跟踪,具体做法是,在2秒钟内如果重量的变化不小于零点跟踪值,就直接把他清零。上面是我的想法,程序也是根据这个想法写的,但是在实际中,该零点跟踪的部分,起不到应有的作用。
问题是: 我的程序有没有正确反映我的想法?还有那位大侠做过称重仪表方面的零点跟踪,给点建议,谢谢
说明: 由于长度限制下面的代码只是零点跟踪中的一部分,只在分度值d = 1,和d = 2 的情况下做的零点跟踪。
/********零点跟踪处理开始**************/
void DealZero()
{
xdata uint tempWght = 0;//用来把浮点型的总重根据小数位信息转换成无符号的
if(total < 0)
total = -total;//下面的处理就是对绝对值进行 当最后的数据显示还是根据最初总重符号来区别正负
switch(decNum)//decNum是小数位信息
{
case 0://没有小数,即把浮点数取整处理
{
tempWght = (uint)(total);
}break;
case 1://1为小数
{
tempWght = (uint)(total * 10);
}break;
case 2://2位小数
{
tempWght = (uint)(total * 100);
}break;
case 3://3为小数
{
tempWght = (uint)(total * 1000);
}break;
case 4:
{
tempWght = (uint)(total * 10000);
}break;
default:break;
}
switch(divNum)//divNum是分度值信息
{
case 0://d = 1
{
tempWghtDisp = tempWght ;
switch(traNum)//在分度值为1的情况下0.5d,1d没有实际的作用
{
case 2://2d
{
if(tempWghtDisp < 2)
{
if(timeFlag)//50ms时标
{
timeFlag = 0;
timeCount++;
if(timeCount > 40)//跟踪2秒钟
{
timeCount = 0;
tempWghtDisp = 0;
}
}
}
}break;
case 3://5d
{
if(tempWghtDisp < 5)
{
if(timeFlag)
{
timeFlag = 0;
timeCount++;
if(timeCount > 40)//跟踪2秒钟
{
timeCount = 0;
tempWghtDisp = 0;
}
}
}
}break;
case 4://10d
{
if(tempWghtDisp < 10)
{
if(timeFlag)
{
timeFlag = 0;
timeCount++;
if(timeCount > 40)//跟踪2秒钟
{
timeCount = 0;
tempWghtDisp = 0;
}
}
}
}break;
case 5://20d
{
if(tempWghtDisp < 20)
{
if(timeFlag)
{
timeFlag = 0;
timeCount++;
if(timeCount > 40)//跟踪2秒钟
{
timeCount = 0;
tempWghtDisp = 0;
}
}
}
}break;
case 6://50d
{
if(tempWghtDisp < 50)
{
if(timeFlag)
{
timeFlag = 0;
timeCount++;
if(timeCount > 40)//跟踪2秒钟
{
timeCount = 0;
tempWghtDisp = 0;
}
}
}
}break;
default:break;
}
}break;
case 1://d = 2;
{
tempWghtDisp = (tempWght - tempWght % 2);
switch(traNum)//在d=2的情况下0.5d没有意义
{
case 1://1d
{
if(tempWghtDisp < 2)
{
if(timeFlag)
{
timeFlag = 0;
timeCount++;
if(timeCount > 40)//跟踪2秒钟
{
timeCount = 0;
tempWghtDisp = 0;
}
}
}
}break;
case 2://2d
{
if(tempWghtDisp < 4)
{
if(timeFlag)
{
timeFlag = 0;
timeCount++;
if(timeCount > 40)//跟踪2秒钟
{
timeCount = 0;
tempWghtDisp = 0;
}
}
}
}break;
case 3://5d
{
if(tempWghtDisp < 10)
{
if(timeFlag)
{
timeFlag = 0;
timeCount++;
if(timeCount > 40)//跟踪2秒钟
{
timeCount = 0;
tempWghtDisp = 0;
}
}
}
}break;
case 4://10d
{
if(tempWghtDisp < 20)
{
if(timeFlag)
{
timeFlag = 0;
timeCount++;
if(timeCount > 40)//跟踪2秒钟
{
timeCount = 0;
tempWghtDisp = 0;
}
}
}
}break;
case 5://20d
{
if(tempWghtDisp < 40)
{
if(timeFlag)
{
timeFlag = 0;
timeCount++;
if(timeCount > 40)//跟踪2秒钟
{
timeCount = 0;
tempWghtDisp = 0;
}
}
}
}break;
case 6://50d
{
if(tempWghtDisp < 100)
{
if(timeFlag)
{
timeFlag = 0;
timeCount++;
if(timeCount > 40)//跟踪2秒钟
{
timeCount = 0;
tempWghtDisp = 0;
}
}
}
}break;
default:break;
}
}break;
default:break;
}
}
}
/********零点跟踪处理结束**************/ 简单点说就是在零点附近当成零点就对了,应该还考虑时间常数,好象一般最大不超过2个D的 学习了 到超市看看打秤的就知道了,有最小秤量,小与的话,就会过一段时间归0 楼主是在做电子秤么?做哪种类型的秤,人体秤、厨房秤、计价秤?每种秤的零点追踪都不一样,指标不一样的!人体秤简单些,直接设定零点漂移范围(一般为最小称重的一半);厨房秤要考虑零点漂移的总量和单位时间里的漂移量,也就是相当于零点漂移加速度和速度,这个要根据实际情况构建函数来计算,既要做到能灵敏的检测输出零点漂移而微小重量变化不被“吃”掉;计价秤类似,只是治标更高些,而且标准精度更高! 设定一个基点。在基点附近,单位时间内变化量小于设定值,则此值被重新设置为基点。
也有做重量跟踪的。不管是否是基点,只要单位时间内变化量小于设定值,则此值被忽略,重新设置当前点。 mark! //自动置零:上电后如果空称重量小于4%额定重量自动置零保存,并置位自动置零位,
//使用过程中重量在置零值附近每秒变化小于0.5e也自动更新置零值,
//在大于等于0.5e重量下按了清零键,显示值清零,且清自动置零位,自动置零在此以后无效。以上值均在RAM中。EEPROM中是原始的空称调零值。
//要存储4个值,A,B,C,D。
//校准空称原始值A,校准秤砣原始值B,校准秤砣重量值C,正常使用时的空称底值D(包含秤盘及蠕变,随时在变化更新但不保存到EEPROM中,即原始的D值保存到EEPROM中已无意义),
//正常使用时的重量原始值E,实际重量=(E-D)*C/(B-A), miaoj 发表于 2017-4-16 23:51
//自动置零:上电后如果空称重量小于4%额定重量自动置零保存,并置位自动置零位,
//使用过程中重量在置零 ...
高手,有没有兴趣做有偿技术指导啊?QQ:188483835
页:
[1]