首页 > 编程知识 正文

单片机算法的书(单片机插补算法)

时间:2023-05-05 18:29:16 阅读:94124 作者:3801

单片机的主要作用是控制周边设备,实现一定的通信和数据处理。 但是,尽管单片机不擅长算法的实现和复杂的运算,但在特定的场景下,数学运算是不可避免的。 下面主要介绍用单片机实现数字滤波的方法。

用单片机进行数据采集时,会遇到数据的随机误差。 随机误差是由随机干扰引起的,其特点是在相同条件下测量相同的量,其大小和符号会发生不规则的变化而无法预测,但多次测量的结果符合统计规律。 为了克服由随机噪声引起的误差,在硬件上可以采用滤波技术,在软件上可以使用软件算法实现数字滤波。 滤波算法往往是系统测量算法的重要组成部分,实时性很高。

采用数字滤波算法克服随机干扰的误差具有以下优点:

数字滤波器不需要其他硬件成本,一个计算过程中可靠性高,不存在阻抗匹配问题。 特别是数字滤波器可以对频率较低的信号进行滤波。 这不能用模拟滤波器来做。 数字滤波通过软件算法实现,多个输入通道可以共享一个滤波程序,从而降低了系统成本。 如果适当变更滤波器的滤波和运算,可以容易地变更滤波器特性,对低频噪声和随机信号的滤波有很大的效果。 单片机系统常用的滤波算法有限宽度滤波法、中值滤波法、算术平均滤波法、加权平均滤波法、滑动平均滤波法等。

限幅滤波算法

在这个运算过程中,减去相邻的两次样本,求出其增量,然后将增量的绝对值与两次样本允许的最大差值a进行比较。 的大小因被测对象的具体情况而异,在允许最大差值以下时,此次采样有效; 否则,将上次的采样值作为这次数据的样本。

算法的程序代码如下。

1#define A//允许最大误差

2

3字符数据; //上次的数据

4

5字符过滤器() )

6

7

8

9字符天线; //新的数据变量

10

11数据=获取数据(; //获取新的数据变量

12

1if (数据-数据) a|| )数据-数据网络)

14

15返回数据;

16

17else

18

19返回数据新;

20

21

说明:限幅滤波法主要用于处理温度、物体位置等变化缓慢的数据。 使用时,选择适当的门限制a很重要。 通常,这可以从经验数据中得到,必要时可以通过实验得到。

中值滤波算法

这个运算的过程是连续采样某个参数n次,将采样n次的值按从小到大的顺序排列,以中间值作为这次的采样值,整个过程实际上是一个排序的过程。

算法的程序代码如下。

1#defineN 11//定义获取数据数量2 3charfilter (() ) ) ) ) ) ) ) ) ) ) ) ) ) )。

4

5

6字符值_缓冲器; //定义存储数据的数组的8.9字符计数、I、j、temp;

011 for (计数=0; 计数; 计数)

1213{

1415值_ buf=获取数据(;

1617延迟(; //数据收集较慢时,为1819}

2021for(j=0; jN; j )日本

223

25英寸(值缓冲器(I值缓冲器) ) ) )

2627{

2829 temp=值缓冲器;

3031值缓冲器=值缓冲器;

3233值缓冲器=时间间隔;

3435}

3637}

839返回值_缓冲区[ (n-1 )/2];

4041} )说明:中值滤波器适用于消除偶然因素引起的变动和采样器不稳定引起的脉动干扰。 被测量值变化慢时,采用中值滤波法很有效,但数据变化快时,不适合采用该方法。

算术平均滤波算法

该算法的基本原理很简单,就是连续n次取采样值后进行算术平均。

算法的程序代码如下。

1字符过滤器() )

2

3

4

5英寸和=0;

6

7 for (计数=0; 计数; 计数)

8

9

10

11和=获取数据(;

12

13delay () :

14

15

16

17返回(字符) )和/n;

18

19

说明:算术平均滤波算法适用于对具有随机干扰的信号进行滤波。 这个信号的特征是有平均值,在某个数值附近信号会上下波动。 信号的平均平滑度完全依赖于n值。 n大时,平滑度高,灵敏度低n小时,平滑度低,但灵敏度高。 为了求出平均值,n通常取4、8、16、32这样的2的整数幂,在程序中用移位操作代替除法。

>

加权平均滤波算法

由于前面所说的“算术平均滤波算法”存在平滑度和灵敏度之间的矛盾。为了协调平滑度和灵敏度之间的关系,可采用加权平均滤波。它的原理是对连续N次采样值分别乘上不同的加权系数之后再求累加,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的认识。各个加权系数均小于1的小数,且满足总和等于1的结束条件。这样加权运算之后的累加和即为有效采样值。其中加权平均数字滤波的数学模型是:

式中:D为N个采样值的加权平均值:XN-i为第N-i次采样值;N为采样次数;Ci为加权系数。加权系数Ci体现了各种采样值在平均值中所占的比例。一般来说采样次数越靠后,取的比例越大,这样可增加新采样在平均值中所占的比重。加权平均值滤波法可突出一部分信号抵制另一部分信号,以提高采样值变化的灵敏度。

样例程序代码如下:

1char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code数组为加权系数表,存在程序存储区 2 3char codesum_jq=1+2+3+4+5+6+7+8+9+10+11+12; 4 5char filter() 6 7{ 8 9    char count; 10 11    char value_buff[N]; 12 13    int sum=0; 14 15    for(count=0;count<N;count++) 16 17    { 18 19        value_buff[count]=get_data(); 20 21        delay(); 22 23    } 24 25    for(count=0;count<N;count++) 26 27        sum+=value_buff[count]*jq[count]; 28 29    return (char)(sum/sum_jq); 30 31}

滑动平均滤波算法

以上介绍和各种平均滤波算法有一个共同点,即每获取一个有效采样值必须连续进行若干次采样,当采速度慢时,系统的实时得不到保证。这里介绍的滑动平均滤波算法只采样一次,将一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用。如果取N个采样值求平均,存储区中必须开辟N个数据的暂存区。每新采集一个数据便存入暂存区中,同时去掉一个最老数据,保存这N个数据始终是最新更新的数据。采用环型队列结构可以方便地实现这种数据存放方式。

程序代码如下:

1char value_buff[N]; 2 3char i=0; 4 5char filter() 6 7{ 8 9    char count; 10 11    int sum=0; 12 13    value_buff[i++]=get_data(); 14 15    if(i==N) 16 17        i=0; 18 19    for(count=0;count<N;count++) 20 21         sum+=value_buff[count]; 22 23    return (char)(sum/N); 24 25}

低通滤波

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

1Yn=a* Xn+(1-a) *Yn-1 2 3式中 Xn——本次采样值 4 5Yn-1——上次的滤波输出值; 6 7a——滤波系数,其值通常远小于1; 8 9Yn——本次滤波的输出值。

由上式可以看出,本次滤波的输出值主要取决于上次滤波的输出值(注意不是上次的采样值,这和加权平均滤波是有本质区别的),本次采样值对滤波输出的贡献是比较小的,但多少有些修正作用,这种算法便模拟了具体有教大惯性的低通滤波器功能。滤波算法的截止频率可用以下式计算:

1fL=a/2Pit pi为圆周率3.14… 2 3式中 a——滤波系数; 4 5t——采样间隔时间; 6 7例如:当t=0.5s(即每秒2次),a=1/32时; 8 9fL=(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(小数)中。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。