分享

一个非常适合单片机的算法

 冷面寒冰6 2014-12-12

单片机大多资源小,算法占用的资源越小越好,现在介绍就是一个占用很小资源的算法,这个算法是本人2000年在威海进行扫描仪设计,实现灰度转二值时实现动态阈值,当时为了跟踪灰度等级的变化,需要一个灰度积分跟踪电路,由于信号是高度不同的锯齿信号,开始使用一个电容积分电路,用灰度信号对电容充电,放电时以该电容所充电压的比例进行放电,实现对输入信号的跟踪,但用电容的电路设计比较复杂。过后发现这种比例放电的思想用软件实现非常简单,且具有积分、微分的作用,还有收敛特性。

具体公式如下:
SUM=SUM-SUM/n+S

其中:S为采样值,SUM为保存值,n是放电比例、最好选2的幂次数,单片机移位即可,不需要做除法,跟随后得到的值为SUM/n,即为最后使用的数据,公式表明SUM/n对采样数据S是收敛的。 SUM注意不溢出,预留的容量为采样数最大值的n倍,初始化时如果是跟踪一段时间后使用,可以是任何值,否则可以用采样值乘n初始化。使用值为SUM/n(下文中SA),实现SUM/n对S的跟踪。还有一个关键是计算周期T,即多长时间进行一次。

一、积分作用:
1.平滑滤波(滑动平均滤波)

由公式中可以看出,每次采样、计算后,当前采样的影响对SUM/n只有1/n,而且采到的值随次数的增加影响越来越小直至没有,相关性逐渐减弱,而且是连续相关。如果计算周期与采样周期相同,使用计算后的值对干扰有n倍的抑制,即积分的平滑滤波作用,如1ms采样一次,同时运算一次, 则使用值SA=SUM/n为抑制干扰的结果,且同样是1ms给出一个结果,使用两个变量实现平滑滤波,并且是即时使用的,与采样几次平均的平滑不同。


图中紫色线为平滑后的效果。图中n=8,T等于采样周期。

AD应用中采样电路接有滤波的电容,使用这个算法可以降低对滤波电容的要求,甚至去掉滤波电容,降低成本。

2.动态阈值
在很多应用中需要动态阈值,比如触摸按键的键阈值门限,血压计的心率检出,前面提到的灰度转二值黑白图像等(灰度转二值因为扫描速度2.5Mbyte/S,不能使用软件运算,但可以使用可编程逻辑实现)。动态阈值是对信号积分(上面公式运算)后得到的低频变化再与基本门限相加得到。在触摸按键中增加动态阈值可以提高其适应性和可靠性。关键是根据按键反应时间和按键间隔确定按键积分参数n、跟踪速度T。T越大跟踪的越慢,积分效果越好。


3.锁相作用:把上边的积分运算,用于对时间上周期信号的跟踪,例如根据过零触发信号锁定交流电源周期,使用两次T时间不同,其它相同的运算,由于T不同,跟踪速度不同,当两次运算的结果相等时可以确认为锁定,这时得到的是准确的电源周期测量值。这种方法可以测得准确的频率。可以用于血压计心率的统计。


二、微分作用:
公式中的SA趋近采样值S,如果S是线性的,SA的值是可控滞后于S,那么运算的间隔时间T不同,得到的跟踪曲线的滞后特性不同,这种滞后特性的差和间隔时间T就是微分特性,表示曲线的变化规律。如电热水壶,温度的变化相当于采样时间是还相当慢的,局部可以作为线性变化来处理。下边以设计电热水壶的过程来说明微分作用。

电热水壶出口一直使用蒸汽开关这种需要交专利费的方式。不使用蒸汽开关检测压则只能使用热敏器件检测温度。

温度检测的环境要求:
1.海拔高度不同的地区水开的温度不同。
2.热敏器件及其检测电路的误差较大,必须克服,否则产品的生产性不足。只能做样品。
3.环境温度不同,电源电压不同,装水量不同。
由要求1、2决定检测温度不能判别水开与否,实际上水开时加热功率的效率变小,需要检测温度的变化率,但温度变化率的判别又和要求3相关(沸腾前加热升温,环境温差的耗散),下边曲线图为热水器的加热曲线。蓝线A为即时温度,橙色B为一次运算后的曲线,黄色C为同样公式对B的运算。计算时间都是每秒一次。
图中加热过程中间添加了冷水,曲线有一段下降,以后的加热过程三个曲线有个差异滞后,在加热的接近线性的部分(加热中间段),曲线A和B的差与B和C的差基本相等,同一个时间的曲线差表示了加热效率的变化,水接近沸腾时AB差小于BC差,加热效率下降,判断时再与最大加热效率(AB或BC差的最大值,最大的加热效率体现了环境温度不同,电源电压不同,装水量不同的综合效果)相关。若觉得差值不够大,可加大n值,跟踪会更慢一些,差值也就大了。
由于滞后的时间可以通过计算周期T来调整,我们通过保存前一次运算值得到两次的差,知道滞后时间又有相减的差,这就是微分,把这个差值加当前温度,做为T时间后的温度值,做为提前控制加热过程的依据,特别是这个公式得到的SUM/n最终总是收敛于采样数据S,类似恒温控制的项目中预测的温度有一些差异没关系,会自动修正回来,我在一个需恒温控制的项目中。差值直接使用当前值与一次计算的差也没问题。
第一次的水开检测使用效率的方法,同时保存当时的温度采样值,就会得到水开时的温度检测值,微分特性本身是可以预知变化趋势的,未断电情况下,通过微分作用的预知温度,结合第一次得到的水开温度检测值,可以通过绝对温度值检测,以后的水开检测就有两个判断条件。
这个算法是从应用中得来,具有灵活可控的一阶滤波,迭代收敛的效果,应用的方式多种多样,甚至不用局限在单片机,如个人电脑中的图像处理等很多场合都需要滤波处理,无论什么行业,站在别人的肩膀上才会越来越高,10年前的想法,现在写出来是为了给同行一个肩膀,提高认识,沉淀一些属于自己的东西,在不影响第三方利益的基础上,拿出来共享,共同促进国家技术水平的提高。

【分享】如果您觉得本文有用,请点击右上角“…”扩散到朋友圈!

关注电子工程专辑请搜微信号:“eet-china”或点击本文标题下方“电子工程专辑”字样,进入官方微信“关注”。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多