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

tou007 发表于 2012-7-9 23:10

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

dlyt_test001 发表于 2012-7-11 10:55

设定一个基点。在基点附近,单位时间内变化量小于设定值,则此值被重新设置为基点。
也有做重量跟踪的。不管是否是基点,只要单位时间内变化量小于设定值,则此值被忽略,重新设置当前点。

yongwong99 发表于 2017-4-16 10:08

mark!

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),

wenunit 发表于 2023-10-15 20:31

miaoj 发表于 2017-4-16 23:51
//自动置零:上电后如果空称重量小于4%额定重量自动置零保存,并置位自动置零位,
//使用过程中重量在置零 ...

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

zwsam 发表于 2023-10-25 08:56

zwsam 发表于 2023-10-25 08:56

kissdb 发表于 2023-10-28 22:06

页: [1]
查看完整版本: 称重仪表的零点跟踪