快捷搜索:  test  as  1111  !--  xxx  /WEB-INF/web.xml  ks7YyNUq  WEB-INF/web.xml

如何利用单片机和C语言来设计数字滤波系统

数据采集,又称数据获取,是使用一种装配,从系统外部采集数据并输入到系统内部的一个接口。数据采集技巧广泛引用在各个领域。比如摄像头,麦克风,都是数据采集对象。被采集数据是已被转换为电讯号的各类物理量,如温度、水位、风速、压力等,可所以模拟量,也可所以数字量。在互联网行业快速成长的本日,数据采集已经被广泛利用于互联网及散播式领域,数据采集领域已经发生了紧张的变更。

而在数据采集中存在着各类噪声。滤除噪声的措施有很多种,既稀有字滤波器,也有模拟滤波器。这里我们采纳了基于单片机和C说话来设计并开拓数字滤波系统。

我们针对付单片机数据采集系统中常常呈现的随机滋扰,经由过程手动输入来模拟数据采集历程,验证了几种应用较为普遍的降服随机滋扰的单片机数字滤波算法,并给出了响应的C法度榜样,尤其对中位值滤波和中位值匀称滤波算法法度榜样进行了改进。同时也对这几种滤波算法进行了对照,并指出了每一种算法的详细适用范围和留意事变。别的我们应用了 proteus进行仿真验证这几种滤波措施。别的我们还应用了AD和DA来采集及输出数据。

1 数字滤波设计道理

这里有很多种数字滤波措施,我们见选用此中几种来进行设计,如中值滤波、算术匀称滤波、加权匀称滤波等等。以是下面我将具体先容它们。

1.1 中值滤波

中位值滤波是先对某一参数继续采样N次(一样平常N取奇数),然后把N次采样值按从小到大年夜排列,取中心值为本次采样值。

该滤波措施实际上是一种排序措施,我在此采纳的是冒泡法排序。因为在冒泡法排序中,每呈现一次前者数据大年夜于后者数据,就要进行二者数据的互换。

该算法的样例子法度榜样如下:

1 #define N 11 //N值可根据实际环境调剂

3 char filter()

5 {

7 char value_buf[];

9 char count,i,j,k,temp;

11 for(count=0;count

13 {

14 value_buf[count]=get_data();

17 delay();

18 }

20 for(i=0;i

22 {

k=i;

24 for(j=i+1;j

26 if(value_buf[j]

28 temp=value_buf[k];

30 value_buf[k]=value_buf[i];

32 value_buf[i]=temp;

34 }

36 return value_buf[(N-1)/2];

37 }

位值滤波能有效地降服偶尔身分引起的颠簸或采样器不稳定引起的误码等脉冲滋扰。对温度、液位等迟钝变更的被测参数采纳此算法能收到优越的滤波效果,但对付流量、压力等快速变更的数据,不宜采纳中位值滤波。

1.2 算术匀称滤波

算术匀称滤波法适用于对一样平常的具有随机滋扰的旌旗灯号进行滤波。这种旌旗灯号的特征是旌旗灯号本身在某一数值范围相近高低颠簸,如丈量流量、液位时常常碰到这种环境。算术匀称滤波法是要按输入的N 个采样数据,探求这样一个Y,使得Y 与各个采样值之间的误差的平方和最小。

详细实现此算法的子法度榜样如下:

1 #define N 12

2 char filter()

5 {

7 int count;

9 int sum=0;

10 for(count=0;count

13 {

15 sum+=get_ad();

16 delay();

17 }

18 return (char)(sum/N);

19 }

算术匀称滤波适用于对一样平常具有随机滋扰的旌旗灯号进行滤波。这种旌旗灯号的特征是有一个匀称值,旌旗灯号在某一数值范围相近做高低颠簸,在这种环境下仅取一个采样值做依据显然是不准确的。算术匀称滤波对旌旗灯号的平滑法度榜样完全取决于N,当N较大年夜时,平滑度高,但灵敏度低;当N较小时,平滑度低,但灵敏度高,应视详细环境拔取N,以便既少占用谋略光阴,又达到最好的效果。

1.3 加权匀称滤波

在算术匀称滤波和移动匀称滤波中,N次采样值在输出结果中的权重是均等的,取1/N。用这样的滤波算法,对付时变旌旗灯号会引入滞后,N值越大年夜,滞后越严重。为了增添新采样数据在移动匀称中的权重,以前进系统对当前采样值中所受滋扰的灵敏度,可采纳加权匀称滤波,它是移动匀称滤波算法的改进。

加权匀称滤波是对继续N次采样值分手乘上不合的加权系统之后再求累加和,加权系统一样平常先小后大年夜,以凸起后面多少采样的效果,加强系统对参数变更趋势的辨识。各个加权系统均为小于1的小数,且满意总和即是1的约束前提。这样,加权运算之后的累加和即为有效采样值。

为方便谋略,可取各加权系数均为整数,且总和为256,加权运算后的累加和除以256,即舍去低字节后就是有效采样值。详细的样例子法度榜样如下:

1 //code数组为加权系统表,存在ROM区。

2 #define N 12

3 char code jq[N]={1,2,3,4,5,6,7,8,9,10,11,12};

4 char code sum_jp=1+2+3+4+5+6+7+8+9+10+11+12;

5 char filter_5()

6 {

7 char count;

8 char value_buf[N];

9 int sum=0;

10 for(count=0;count

11 {

12 value_buf[count]=get_data();

13 delay();

14 }

15 for(count=0;count

16 sum+=value_buf[count]*jq[count];

17 return (char)(sum/sum_jq);

18 }

1.4 中位值匀称滤波

它相称于是“中位值滤波法”和“算术匀称滤波法”的结合。它继续采样N个数据,然后去掉落一个最大年夜值和一个最小值,着末谋略N-2个数据的算术匀称值。一样平常N值的拔取:3-14。

详细算法法度榜样如下:

1 #define N 12

2 char filter()

3 {

4 char count,i,j;

5 char value_buf[N];

6 int sum=0;

7 for (count=0;count

8 {

9 value_buf[count] = get_ad();

10 delay();

11 }

12 for (j=0;j

13 {

14 for (i=0;i

15 {

16 if ( value_buf[i]》value_buf[i+1] )

17 {

18 temp = value_buf[i];

19 value_buf[i] = value_buf[i+1];

20 value_buf[i+1] = temp;

21 }

22 }

23 }

24 for(count=1;count

25 sum += value[count];

26 return (char)(sum/(N-2));

27 }

这种滤波措施兼容了移动匀称滤波算法和中位值滤波算法的优点,以是无论对迟钝变更的旌旗灯号,照样对快速变更的旌旗灯号,都能取得较好的滤波效果。

1.5 限幅滤波

限幅滤波的基滥觞基本理是把两次相邻时候(n和n-1)的采样值Yn和Yn-1相减,求出其差值,以绝对值表示,然后将这个差值与两次采样容许的最大年夜误差值ΔY对照,假如两次采样值的差值跨越了容许的最大年夜误差值ΔY,则觉得发生了随机滋扰,并觉得着末一次采样值Yn不法,应予剔除。剔除Yn后,可用Yn-1代替Yn;若未跨越容许的最大年夜误差值范围,则觉得本次采样值有效。可用如下公式表示:

|Yn-Yn-1|≤ΔY;则Yn有效

|Yn-Yn-1|>ΔY;则Yn-1有效

此算法的样例子法度榜样如下:

此算法的样例子法度榜样如下:

#define A 10 //A值可根据实际环境调剂

char data; //上一次的数据

char filter_1()

{

char datanew; //新数据变量

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

//滤波算法

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

return data;

return datanew;

}

该算法主要用于处置惩罚变更对照迟钝的数据,如温度、物体的位置等。应用时关键在于最大年夜误差值的Δy的选择,平日可根据履历得到,也可按照输出参数可能的最大年夜变更速率Vmax及采样周期T来抉择ΔY的值,即ΔY=VmaxT。

1 #include

2 #include

3 #define uchar unsigned char

4 #define A 0.005

5 #define N 11

6 sbit con1 = P2^3;

7 sbit con2 = P2^4;

8 sbit con3 = P2^5;

9 sbit con = P2^6;

10 sbit OE = P2^0;

11 sbit START = P2^1;

12 sbit EOC = P2^2;

13 uchar a;

14 uchar buf[N] ={0};

15 void change()

16 {

17 int i;

18 for(i=0;i

19

责任编辑;zl

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