如果要算法,其实是比较复杂的,除非有明确的时间段分隔,否则不好判断。特别是波动比较频繁的情况下。
我假设一个算法:
连续采集10次
10次(这个可以配置)有1个平均值a
然后在让10个数分别和a比较,分成大于 小于这个平均值计数HN和LN,并分别计算HA和LA,
HA和A比较,LA分别和A比较,如果偏差绝对值都在10%(这个可以设置)以内,则认为所有数据没有太大波动
否则拿和A偏差小的HA或者LA作为基准,把数据再过滤一次,让所有偏差在其20%内的数据为正常数据计算平均值为输出,否则排除人为是波动。
先分段减小斜率
if(fabs(a-a_old)>1)
a=a*0.1+a_old*0.9;
else if(fabs(a-a_old)>3)
a=a*0.01+a_old*0.99;
再低通滤波
a=a*0.5+a_old*0.5;
...
a_old=a
如果这个值与之前的数据误差太大,可能是硬件上的干扰,要查一下硬件上的问题。
单纯的滤波无法解决本质问题。
检查下硬件看看电源是否稳定,有没有其他干扰源软件上时序时候匹配,每次读写时候正确。不然单靠滤波应该是不够的