网站建设和维护自学,营销型网站效果,网站建设公司怎么样,网站发展阶段怎么做ID#xff1a;技术让梦想更伟大整理#xff1a;李肖遥单片机主要作用是控制外围的器件#xff0c;并实现一定的通信和数据处理。但在某些特定场合#xff0c;不可避免地要用到数学运算#xff0c;尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机… ID技术让梦想更伟大整理李肖遥单片机主要作用是控制外围的器件并实现一定的通信和数据处理。但在某些特定场合不可避免地要用到数学运算尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机实现数字滤波。在单片机进行数据采集时会遇到数据的随机误差随机误差是由随机干扰引起的其特点是在相同条件下测量同一量时其大小和符号会现无规则的变化而无法预测但多次测量的结果符合统计规律。为克服随机干扰引起的误差硬件上可采用滤波技术软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分实时性很强。采用数字滤波算法克服随机干扰的误差具有以下优点数字滤波无需其他的硬件成本只用一个计算过程可靠性高不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的信号进行滤波这是模拟滤波器做不到的。数字滤波使用软件算法实现多输入通道可共用一个滤波程序降低系统开支。只要适当改变滤波器的滤波程序或运算就能方便地改变其滤波特性这对于滤除低频干扰和随机信号会有较大的效果。在单片机系统中常用的滤波算法有限幅滤波法、中值滤波法、算术平均滤波法、加权平均滤波法、滑动平均滤波等。限幅滤波算法该运算的过程中将两次相邻的采样相减求出其增量然后将增量的绝对值与两次采样允许的最大差值A进行比较。A的大小由被测对象的具体情况而定如果小于或等于允许的最大差值则本次采样有效;否则取上次采样值作为本次数据的样本。算法的程序代码如下 1#define A //允许的最大差值23char data; //上一次的数据45char filter()67{89 char datanew; //新数据变量
10
11 datanewget_data(); //获得新数据变量
12
13 if((datanew-data)A||(data-datanewA))
14
15 return data;
16
17 else
18
19 return datanew;
20
21}说明限幅滤波法主要用于处理变化较为缓慢的数据如温度、物体的位置等。使用时关键要选取合适的门限制A。通常这可由经验数据获得必要时可通过实验得到。中值滤波算法该运算的过程是对某一参数连续采样N次(N一般为奇数)然后把N次采样的值按从小到大排列再取中间值作为本次采样值整个过程实际上是一个序列排序的过程。算法的程序代码如下 1#define N 11 //定义获得的数据个数 2 3char filter()45{6 7 char value_buff[N]; //定义存储数据的数组 8 9 char count,i,j,temp;
1011 for(count0;countN;count)
1213 {
1415 value_buf[count]get_data();
1617 delay(); //如果采集数据比较慢那么就需要延时或中断1819 }
2021 for(j0;jN;j)
2223 {
2425 if(value_buff[i]value_buff[i1])
2627 {
2829 tempvalue_buff[i];
3031 value_buff[i]value_buff[i1];
3233 value_buff[i1]temp;
3435 }
3637 }
3839return value_buff[(N-1)/2];
4041}
说明中值滤波比较适用于去掉由偶然因素引起的波动和采样器不稳定而引起的脉动干扰。若被测量值变化比较慢采用中值滤波法效果会比较好但如果数据变化比较快则不宜采用此方法。算术平均滤波算法该算法的基本原理很简单就是连续取N次采样值后进行算术平均。算法的程序代码如下 1char filter()23{45 int sum0;67 for(count0;countN;count)89 {
10
11 sumget_data();
12
13 delay():
14
15 }
16
17 return (char)(sum/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数组为加权系数表存在程序存储区23char codesum_jq123456789101112;45char filter()67{89 char count;
10
11 char value_buff[N];
12
13 int sum0;
14
15 for(count0;countN;count)
16
17 {
18
19 value_buff[count]get_data();
20
21 delay();
22
23 }
24
25 for(count0;countN;count)
26
27 sumvalue_buff[count]*jq[count];
28
29 return (char)(sum/sum_jq);
30
31}
滑动平均滤波算法以上介绍和各种平均滤波算法有一个共同点即每获取一个有效采样值必须连续进行若干次采样当采速度慢时系统的实时得不到保证。这里介绍的滑动平均滤波算法只采样一次将一次采样值和过去的若干次采样值一起求平均得到的有效采样值即可投入使用。如果取N个采样值求平均存储区中必须开辟N个数据的暂存区。每新采集一个数据便存入暂存区中同时去掉一个最老数据保存这N个数据始终是最新更新的数据。采用环型队列结构可以方便地实现这种数据存放方式。程序代码如下 1char value_buff[N];23char i0;45char filter()67{89 char count;
10
11 int sum0;
12
13 value_buff[i]get_data();
14
15 if(iN)
16
17 i0;
18
19 for(count0;countN;count)
20
21 sumvalue_buff[count];
22
23 return (char)(sum/N);
24
25}低通滤波将普通硬件RC低通滤波器的微分方程用差分方程来表求变可以采用软件算法来模拟硬件滤波的功能经推导低通滤波算法如下1Yna* Xn(1-a) *Yn-1
2
3式中 Xn——本次采样值
4
5Yn-1——上次的滤波输出值;
6
7a——滤波系数其值通常远小于1;
8
9Yn——本次滤波的输出值。由上式可以看出本次滤波的输出值主要取决于上次滤波的输出值(注意不是上次的采样值这和加权平均滤波是有本质区别的)本次采样值对滤波输出的贡献是比较小的但多少有些修正作用这种算法便模拟了具体有教大惯性的低通滤波器功能。滤波算法的截止频率可用以下式计算1fLa/2Pit pi为圆周率3.14…
2
3式中 a——滤波系数;
4
5t——采样间隔时间;
6
7例如当t0.5s(即每秒2次)a1/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(小数)中。推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~