发新帖我要提问
12
返回列表
打印

电子称 如何解决 动物称 的不稳定数据输出

[复制链接]
楼主: happy_snail
手机看帖
扫描二维码
随时随地手机跟帖
21
RGB123| | 2012-3-24 16:20 | 只看该作者 回帖奖励 |倒序浏览
什么动物需要精确到这个数上?

使用特权

评论回复
22
jiangzhe8525| | 2012-3-24 16:54 | 只看该作者
1,加,大滤波深度,让他变化小;
2,延长滤波时间,让他反应慢;
3,把称台下加弹簧,实现机械滤波。
以上建议不知道你会采纳不

使用特权

评论回复
23
spydf| | 2012-3-25 00:28 | 只看该作者
23# jiangzhe8525 什么是滤波深度?

使用特权

评论回复
24
jiangzhe8525| | 2012-3-27 13:22 | 只看该作者
滤波有很多种办法的,
比如说现在的数据A,下次采样的数据B,A*80%+B*20%作为下个数据。
取平均法是50%。

使用特权

评论回复
25
bg6nw| | 2012-3-28 05:19 | 只看该作者
估计LZ做的蟋蟀秤,继续加大滤波,另外可以考虑其它方法,比如随秤带一个塑料筒把它装起来,或者罩住

使用特权

评论回复
26
h615| | 2012-3-28 09:11 | 只看该作者
可以取个阀值

使用特权

评论回复
27
chenbb8| | 2012-3-28 10:19 | 只看该作者
试下匠人手记10上的那种滤波算法,就是 一阶滞后滤波之深入研究,大概实现的方法就是取a=0~1
本次滤波结果=(1-a)*本次采样值+a*上次滤波结果。
a的值越大则滤波的平滑度越高,a越小则滤波的反应速度越快
动物的晃动应该是和匠人手记里的波形图一样的是上下波动的。
这样的话,可以先设定一个高的a,获得好的平滑度。
假如实际波形比滤波后的波形大,则计数器+1
但计数器达到某个阈值的时候,a变大,以跟上实际波形的变化。
但如果在但计数器达到某个阈值之前,实际波形比滤波后的波形小了。
则计数器清零。
反之亦然。:)
这样的话在动物刚放上称的时候,由于a很小,所以显示的重量值缓慢上升,但实际重量值一直是在
显示的重量值之上的,所以计数器不断增大,到了阈值后,时间也许过去几秒钟了,a变大,显示重量值
迅速跟上实际重量值,直到实际重量值比显示重量值低了,然后a重新变小,显示重量值变化变的缓慢。
由于动物晃动的时候。实际重量值偏离了显示重量值,计数器不断增大,但假如在计数器达到阈值之前,
实际重量值又反弹了,计数器就会被清零,而不会出现大的波动。
所以动物称的关键是计数器阈值的选定,和a的选定,
计数器阈值的选定要让反应时间大于动物晃动的间隔,可以设定菜单选择不同的晃动间隔,以适应
不同的动物
a的选定要兼顾反应速度和平滑度,可以选择多级的a,比如0.1 0.2 0.3 0.5 假如计数器溢出则a在相邻
的值里选择。
匠人手记是本不错的书,推荐购买,试阅的话可以到百度文库……

使用特权

评论回复
28
kmyft| | 2012-3-28 13:58 | 只看该作者
楼上很牛叉

使用特权

评论回复
29
cool_coder| | 2012-3-28 16:07 | 只看该作者
动物也有相对安静的时候,在它不动的时候称是否可以实现?

使用特权

评论回复
30
display8989| | 2012-3-28 16:28 | 只看该作者
哈哈,绑起来

使用特权

评论回复
31
PowerAnts| | 2012-3-28 16:38 | 只看该作者
最傻最有效的办法是延长计数周期,一百多块至几千块的数字频率计都这么干的,最长是10秒

使用特权

评论回复
32
happy_snail|  楼主 | 2012-3-28 19:59 | 只看该作者
本帖最后由 happy_snail 于 2012-3-28 20:30 编辑

嘿嘿 加油中

使用特权

评论回复
33
chenbb8| | 2012-3-28 20:25 | 只看该作者
方法上面很多人都提供了,你不会一个个试验么,难道要我们都把代码贴出来……

使用特权

评论回复
34
happy_snail|  楼主 | 2012-3-28 20:29 | 只看该作者
本帖最后由 happy_snail 于 2012-3-28 20:50 编辑

34# chenbb8
嗯 试试!! 我 一边式  一边 思考!! 也在 看看大家  的思想!! 三个人臭皮匠定一个诸葛亮 嘛!! 思想 ... ... 嘿嘿 谢谢 你了

使用特权

评论回复
35
程序匠人| | 2012-3-28 21:52 | 只看该作者
难道是称刀鱼的称?

使用特权

评论回复
36
chenbb8| | 2012-3-28 23:47 | 只看该作者
我也是去年毕业的新手,大家一起提高~
看你的程序中的注释,应该是原来就用了一阶滞后滤波的。
感觉在这个地方有点问题
f(NEW_DATA<OLD_DATA)
    {
        result = OLD_DATA-NEW_DATA;
        result = result*Coefficient;
      //  result = result+128;       //20120310 去 小数注意考虑
        result = result/255;     //256 20120322
        result = OLD_DATA-result;
    }

Coefficient应该是0~255之间的值吧,匠人也说了这种做法容易带来误差的问题。
假设Coefficient = 16;OLD_DATA-NEW_DATA 的值等于SUB
经过
result = result*Coefficient;
result = result /255;这两步后,由于result是整型数,那么只有SUB大于等于1/(16/255) = 16的时候
result =  result /255;这一步得出来的结果才会是1及以上的值。而当SUB小于等于15的时候,result = 0;
也就是说误差在正负16个值,同理Coefficient = 64时,误差为4;Coefficient = 128时,误差为2;

我觉得你的问题是在于,当实际值比显示值大的时候 Coefficient 从零开始增加,显示值向实际值靠拢,由于
误差的存在,当差值SUB比误差值要小时,实际值和显示值之间的距离是无法缩小的,这样的话FIlter_Count就会
继续增加,然后通过
Coefficient的增大来缩小误差范围,直到到达Coefficient的上限B, FIlter_Count的多次溢出,
如果加上采样速率比较慢的话,自然会出现你说的很长时间后才达到2KG的值的情况。匠人手记上的波形图也是
出现了这样的情况。

至于改善的办法我只能想到三个,一个是加大Coefficient 每次变化的增量,或者降低计数器溢出的阈值
二是使用浮点数代替整型数运算。不过在单片机上不太现实
三就是用整型模拟浮点运算,我的方法是Coefficient 每次取值都是2的N次方,使用余数来保存除以255后不足1的
部分的值。余数的求法 mod =  result1 %255; 可以改成mod =  result1&0x0F;(Coefficient = 16,
result1 = result*Coefficient;),余数参与到下一次运算中。比如下次依然是NEW_DATA<OLD_DATA
那么新的余数加上上次的余数,如果大于16 的话就,让result - 1;
以上有什么不对的请指正

另外调试最好还是使用串口之类的总线连接到电脑上,在用CVI之类的上位机软件编写一个采集软件,用波形显示
出单片机采集到的实际重量波形和滤波后的波形,就能根据波形选择正确的参数了

使用特权

评论回复
37
happy_snail|  楼主 | 2012-3-29 16:35 | 只看该作者
本帖最后由 happy_snail 于 2012-3-29 16:49 编辑

37# chenbb8
根据 上楼 把 余数保存 了处理 解决 小数问题!!
例如 :
OLD =25    NEW=24  
Coefficient=16

那么
    if(NEW_DATA<OLD_DATA)
    {
        result = OLD_DATA-NEW_DATA;  // sub=1
        result=result<<4;  (用的Coefficient 都是 2的次方!不知道能不能提高运算速度 嘿嘿 )  //  result = result*Coefficient;            //16
      
result = result>> 8;  ///  result = result/256;                     // 用256  16/256=0.0625.....
     mod=  保存余数;                         // 但result =0
        result = OLD_DATA-result;    //   导致 采集的值 还是 25   
   }

result/256=0.0625 虽然 保存了625 但 result=0;  最后 还是 采集的是 老的值 而新的值 为 采集到!!

判断
if(mod!=0)
{
result=1;
mod=0;
}

最后的程序
    if(NEW_DATA<OLD_DATA)
    {
        result = OLD_DATA-NEW_DATA;
        result = result<<4;
        mod=  保存余数处理;
           result = result>>8;

if(mod!=0)
{
result=result+1;
mod=0;
}

        result = OLD_DATA-result;
    }
不知道 有没有问题呀
全是整型的!数据!!

使用特权

评论回复
38
深蓝海贼| | 2014-2-28 10:43 | 只看该作者
我也遇到了这个问题 希望帮帮忙解决一下

使用特权

评论回复
39
奔牛滚滚| | 2014-2-28 11:28 | 只看该作者
你首先要把称动物的数据变化记录下来,再研究算法.这么抱着脑袋瞎想有个屁用.毕竟每个算法都有自己的适应范围的.

使用特权

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

本版积分规则