打印

称重仪表的零点跟踪

[复制链接]
5610|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
victor3l|  楼主 | 2012-7-9 20:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个是我做的零点跟踪。大致是把总重的数据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;
                 }                                                
                                            
        }


                        
}
/********零点跟踪处理结束**************/

相关帖子

沙发
ayb_ice| | 2012-7-9 20:44 | 只看该作者
简单点说就是在零点附近当成零点就对了,应该还考虑时间常数,好象一般最大不超过2个D的

使用特权

评论回复
板凳
gtt585| | 2012-7-9 20:51 | 只看该作者
学习了

使用特权

评论回复
地板
coody| | 2012-7-9 22:38 | 只看该作者
到超市看看打秤的就知道了,有最小秤量,小与的话,就会过一段时间归0

使用特权

评论回复
5
tou007| | 2012-7-9 23:10 | 只看该作者
楼主是在做电子秤么?做哪种类型的秤,人体秤、厨房秤、计价秤?每种秤的零点追踪都不一样,指标不一样的!人体秤简单些,直接设定零点漂移范围(一般为最小称重的一半);厨房秤要考虑零点漂移的总量和单位时间里的漂移量,也就是相当于零点漂移加速度和速度,这个要根据实际情况构建函数来计算,既要做到能灵敏的检测输出零点漂移而微小重量变化不被“吃”掉;计价秤类似,只是治标更高些,而且标准精度更高!

使用特权

评论回复
6
dlyt_test001| | 2012-7-11 10:55 | 只看该作者
设定一个基点。在基点附近,单位时间内变化量小于设定值,则此值被重新设置为基点。
也有做重量跟踪的。不管是否是基点,只要单位时间内变化量小于设定值,则此值被忽略,重新设置当前点。

使用特权

评论回复
7
yongwong99| | 2017-4-16 10:08 | 只看该作者
mark!

使用特权

评论回复
8
miaoj| | 2017-4-16 23:51 | 只看该作者
//自动置零:上电后如果空称重量小于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),

使用特权

评论回复
9
wenunit| | 2023-10-15 20:31 | 只看该作者
miaoj 发表于 2017-4-16 23:51
//自动置零:上电后如果空称重量小于4%额定重量自动置零保存,并置位自动置零位,
//使用过程中重量在置零 ...

高手,有没有兴趣做有偿技术指导啊?QQ:188483835

使用特权

评论回复
10
zwsam| | 2023-10-25 08:56 | 只看该作者

使用特权

评论回复
11
zwsam| | 2023-10-25 08:56 | 只看该作者

使用特权

评论回复
12
kissdb| | 2023-10-28 22:06 | 只看该作者

使用特权

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

本版积分规则

77

主题

308

帖子

5

粉丝