快捷搜索:  as  test

如何利用单片机实现数字滤波

单片机主要感化是节制外围的器件,并实现必然的通信和数据处置惩罚。但在某些特定场合,弗成避免地要用到数学运算,只管单片机并不长于实现算法和进行繁杂的运算。

在单片机进行数据采集时,会碰到数据的随机偏差,随机偏差是由随机滋扰引起的,其特征是在相同前提下丈量同一量时,其大年夜小和符号会现无规则的变更而无法猜测,但多次丈量的结果相符统计规律。为降服随机滋扰引起的偏差,硬件上可采纳滤波技巧,软件上可采纳软件算法实现数字滤波。滤波算法每每是系统测控算法的一个紧张组成部分,实时性很强。

采纳数字滤波算法降服随机滋扰的偏差具有以下优点:

1、数字滤波无需其他的硬件资源,只用一个谋略历程,靠得住性高,不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的旌旗灯号进行滤波,这是模拟滤波器做不到的。

2、数字滤波应用软件算法实现,多输入通道可共用一个滤波法度榜样,低落系统开支。

3、只要适当改变滤波器的滤波法度榜样或运算,就能方便地改变其滤波特点,这对付滤除低频滋扰和随机旌旗灯号会有较大年夜的效果。

4、在单片机系统中常用的滤波算法有限幅滤波法、中值滤波法、算术匀称滤波法、加权匀称滤波法、滑动匀称滤波等。

(1)限幅滤波算法

该运算的历程中将两次相邻的采样相减,求出其增量,然后将增量的绝对值,与两次采样容许的最大年夜差值A进行对照。A的大年夜小由被测工具的详细环境而定,假如小于或即是容许的最大年夜差值,则本次采样有效;否则取上次采样值作为本次数据的样本。

算法的法度榜样代码如下:

#defineA//容许的最大年夜差值

chardata;//上一次的数据

charfilter()

{

chardatanew;//新数据变量

datanew=get_data();//得到新数据变量

if((datanew-data)》A||(data-datanew》A))

returndata;

else

returndatanew;

}

阐明:限幅滤波法主要用于处置惩罚变更较为迟钝的数据,如温度、物体的位置等。应用时,关键要拔取相宜的门限定A。平日这可由履历数据得到,需要时可经由过程实验获得。

(2)中值滤波算法

该运算的历程是对某一参数继续采样N次(N一样平常为奇数),然后把N次采样的值按从小到大年夜排列,再取中心值作为本次采样值,全部历程实际上是一个序列排序的历程。

算法的法度榜样代码如下:

#defineN11//定义得到的数据个数

charfilter()

{

charvalue_buff[N];//定义存储数据的数组

charcount,i,j,temp;

for(count=0;count

{

value_buf[count]=get_data();

delay();//假如采集数据对照慢,那么就必要延时或中断

}

for(j=0;j

{

for(value_buff[i]》value_buff[i+1]

{

temp=value_buff[i];

value_buff[i]=value_buff[i+1];

value_buff[i+1]=temp;

}

}

returnvalue_buff[(N-1)/2];

}

阐明:中值滤波对照适用于去掉落由偶尔身分引起的颠簸和采样器不稳定而引起的脉动滋扰。若被丈量值变更对照慢,采纳中值滤波法效果会对照好,但假如数据变更对照快,则不宜采纳此措施。

(3)算术匀称滤波算法

该算法的基滥觞基本理很简单,便是继续取N次采样值落后行算术匀称。

算法的法度榜样代码如下:

charfilter()

{

intsum=0;

for(count=0;count

{

sum+=get_data();

delay():

}

return(char)(sum/N);

}

阐明:算术匀称滤波算法适用于对具有随机滋扰的旌旗灯号进行滤波。这种旌旗灯号的特征是有一个匀称值,旌旗灯号在某一数值相近高低颠簸。旌旗灯号的匀称平滑程度完全到决于N值。当N较大年夜时,平滑度高,灵敏度低;当N较小时,平滑度低,但灵敏度高。为了方便求匀称值,N一样平常取4、8、16、32之类的2的整数幂,以便在法度榜样顶用移位操作来代替除法。

(4)加权匀称滤波算法

因为前面所说的“算术匀称滤波算法”存在平滑度和灵敏度之间的抵触。为了和谐平滑度和灵敏度之间的关系,可采纳加权匀称滤波。它的道理是对继续N次采样值分手乘上不合的加权系数之后再求累加,加权系数一样平常先小后大年夜,以凸起后面多少采样的效果,加强系统对参数变更趋势的熟识。各个加权系数均小于1的小数,且满意总和即是1的停止前提。这样加权运算之后的累加和即为有效采样值。此中加权匀称数字滤波的数学模型是:

式中:D为N个采样值的加权匀称值:XN-i为第N-i次采样值;N为采样次数;Ci为加权系数。加权系数Ci表现了各类采样值在匀称值中所占的比例。一样平常来说采样次数越靠后,取的比例越大年夜,这样可增添新采样在匀称值中所占的比重。加权匀称值滤波法可凸起一部分旌旗灯号抵制另一部分旌旗灯号,以前进采样值变更的灵敏度。

样例法度榜样代码如下:

charcodejq[N]={1,2,3,4,5,6,7,8,9,10,11,12};//code数组为加权系数表,存在法度榜样存储区

charcodesum_jq=1+2+3+4+5+6+7+8+9+10+11+12;

charfilter()

{

charcount;

charvalue_buff[N];

intsum=0;

for(count=0;count

{

value_buff[count]=get_data();

delay();

}

for(count=0;count

sum+=value_buff[count]*jq[count];

return(char)(sum/sum_jq);

}

(5)滑动匀称滤波算法

以上先容和各类匀称滤波算法有一个合营点,即每获取一个有效采样值必须继续进行多少次采样,当采速率慢时,系统的实时得不到包管。这里先容的滑动匀称滤波算法只采样一次,将一次采样值和以前的多少次采样值一路求匀称,获得的有效采样值即可投入应用。假如取N个采样值求匀称,存储区中必须开辟N个数据的暂存区。每新采集一个数据便存入暂存区中,同时去掉落一个最老数据,保存这N个数据始终是最新更新的数据。采纳环型行列步队布局可以方便地实现这种数据寄放要领。

法度榜样代码如下:

charvalue_buff[N];

chari=0;

charfilter()

{

charcount;

intsum=0;

value_buff[i++]=get_data();

if(i==N)

i=0;

for(count=0;count

sum=value_buff[count];

return(char)(sum/N);

}

(6)低通滤波

将通俗硬件RC低通滤波器的微分方程用差分方程来表求,变可以采纳软件算法来模拟硬件滤波的功能,经推导,低通滤波算法如下:

Yn=a*Xn+(1-a)*Yn-1

式中Xn——本次采样值

Yn-1——上次的滤波输出值;

,a——滤波系数,其值平日远小于1;

Yn——本次滤波的输出值。

由上式可以看出,本次滤波的输出值主要取决于上次滤波的输出值(留意不是上次的采样值,这和加权匀称滤波是有本色区其余),本次采样值对滤波输出的供献是对照小的,但若干有些修正感化,这种算法便模拟了详细有教大年夜惯性的低通滤波器功能。滤波算法的截止频率可用以下式谋略:

fL=a/2Pitpi为圆周率3.14…

式中a——滤波系数;

,t——采样距离光阴;

例如:当t=0.5s(即每秒2次),a=1/32时;

fL=(1/32)/(2*3.14*0.5)=0.01Hz

当目标参数为变更很慢的物理量时,这是很有效的。别的一方面,它不能滤除高于1/2采样频率的干搅旌旗灯号,本例中采样频率为2Hz,故对1Hz以上的干搅旌旗灯号应采纳其他要领滤除,

低通滤波算法法度榜样于加权匀称滤波相似,但加权系数只有两个:a和1-a。为谋略方便,a取一整数,1-a用256-a,来代替,谋略结果舍去最低字节即可,由于只有两项,a和1-a,均以急速数的形式编入法度榜样中,不别的设表格。虽然采样值为单元字节(8位A/D)。为包管运算精度,滤波输出值用双字节表示,此中一个字节整数,一字节小数,否则有可能由于每次舍去尾数而使输出不会变更。

设Yn-1寄放在30H(整数)和31H(小数)两单元中,Yn寄放在32H(整数)和33H(小数)中。

滥觞;21ic

您可能还会对下面的文章感兴趣: