单片机AD采样十大滤波算法详解与应用
1. 单片机AD采样滤波算法概述在嵌入式系统开发中ADC采样是获取模拟信号的关键环节。然而实际应用中采样值常会受到各种干扰影响导致数据波动甚至错误。作为一名有着十年嵌入式开发经验的工程师我总结了十种最实用的AD采样滤波算法这些方法在实际项目中都经过验证能有效解决不同场景下的噪声问题。AD采样滤波的核心目标是在保证实时性的前提下尽可能消除随机干扰和系统误差。选择滤波算法时需要综合考虑信号特性、系统资源和实时性要求。比如对于温度等慢变信号可以采用较强的滤波而对于电机转速等快变信号则需要选择响应更快的算法。2. 十大滤波算法详解2.1 限幅滤波法限幅滤波是最简单直接的滤波方法适用于消除突发性脉冲干扰。其原理是设定一个最大允许偏差值A当本次采样值与上次有效值的差值超过A时就认为本次采样受到干扰而丢弃。注意A值的选取很关键过小会导致有效信号被滤除过大则无法有效抑制干扰。通常取正常信号波动范围的2-3倍。#define A 10 char Value; char filter() { char new_Value; new_Value get_ad(); if(abs(new_Value - Value) A) return Value; return new_Value; }实际项目中我常用这种方法处理按键检测等场景能有效消除触点抖动带来的误触发。但要注意它无法抑制周期性干扰且会使信号平滑度变差。2.2 中位值滤波法中位值滤波通过连续采样N次N取奇数然后取中间值作为有效值。这种方法对波动干扰有很好的抑制效果特别适合温度等变化缓慢的参数测量。#define N 11 char filter() { char value_buf[N]; char count,i,j,temp; for(count0; countN; count) { value_buf[count] get_ad(); delay(); } for(j0; jN-1; j) for(i0; iN-j; i) if(value_buf[i]value_buf[i1]) { temp value_buf[i]; value_buf[i] value_buf[i1]; value_buf[i1] temp; } return value_buf[(N-1)/2]; }在工业温度监测项目中我使用N11的中位值滤波有效消除了50Hz工频干扰。但要注意对于快速变化的信号如电机转速这种方法会导致严重滞后。2.3 算术平均滤波法算术平均滤波是最直观的滤波方式通过多次采样取平均值来抑制随机干扰。N值越大平滑效果越好但响应速度越慢。#define N 12 char filter() { int sum 0; for(count0; countN; count) sum get_ad(); return (char)(sum/N); }根据我的经验不同应用场景的N值选择流量测量N12压力测量N4电池电压N8这种方法的缺点是占用RAM多且对周期性干扰抑制效果差。在低功耗设备中要慎用频繁的AD转换会显著增加功耗。2.4 递推平均滤波法递推平均滤波又称滑动平均滤波维护一个长度为N的队列每次新采样值进入队尾最老的数据出队然后计算队列中数据的平均值。#define N 12 char value_buf[N]; char i0; char filter() { char new_value, sum0; new_value get_ad(); value_buf[i] new_value; if(i N) i 0; for(count0; countN; count) sum value_buf[count]; return (char)(sum/N); }我在电机电流检测中使用这种方法N取8既能有效抑制高频噪声又保证了实时性。相比算术平均滤波它的RAM占用固定适合长期运行的系统。2.5 中位值平均滤波法这是中位值滤波和算术平均滤波的结合体先采样N次去掉最大值和最小值后对剩余的N-2个数据取平均。这种方法兼具抗脉冲干扰和平滑效果。#define N 10 char filter() { char count,i,j; char Value_buf[N]; int sum0; for(count0; countN; count) Value_buf[count] get_ad(); for(j0; jN-1; j) for(i0; iN-j; i) if(Value_buf[i]Value_buf[i1]) { temp Value_buf[i]; Value_buf[i] Value_buf[i1]; Value_buf[i1]temp; } for(count1; countN-1; count) sum Value_buf[count]; return (char)(sum/(N-2)); }在振动传感器信号处理中我使用N10的中位值平均滤波有效消除了偶然的冲击干扰。但计算量较大在8位单片机上要注意处理时间。2.6 限幅平均滤波法限幅平均滤波先对采样值进行限幅处理再送入递推平均滤波队列。这种方法综合了限幅和平均的优点特别适合存在偶然大干扰的场景。#define A 10 #define N 12 char value; char value_buf[N]; char i0; char filter() { char new_value, sum0; new_value get_ad(); if(abs(new_value-value) A) value_buf[i] new_value; if(i N) i 0; for(count0; countN; count) sum value_buf[count]; return (char)(sum/N); }在工业现场总线通信中我使用这种方法处理模拟量输入A取正常信号波动范围的3倍N取8既保证了数据稳定性又能快速响应真实变化。2.7 一阶滞后滤波法一阶滞后滤波是一种低通滤波算法通过调节系数a(0~1)来控制新采样值的权重。a越小滤波结果对变化越敏感a越大平滑效果越好但滞后越严重。#define a 50 // 0~100 char value; char filter() { char new_value; new_value get_ad(); return ((100-a)*value a*new_value)/100; }在温度控制系统里我使用a30的一阶滞后滤波既保持了温度曲线的平滑又不会造成太大滞后。这种方法计算量小非常适合资源有限的单片机。2.8 加权递推平均滤波法加权递推平均滤波是对递推平均滤波的改进给不同时刻的数据赋予不同权重通常越新的数据权重越大。这种方法可以在平滑度和灵敏度之间取得更好的平衡。#define N 12 char code coe[N] {1,2,3,4,5,6,7,8,9,10,11,12}; char code sum_coe 123456789101112; char filter() { char count; char value_buf[N]; int sum0; for(count0; countN; count) value_buf[count] get_ad(); for(count0; countN; count) sum value_buf[count]*coe[count]; return (char)(sum/sum_coe); }在无人机高度传感器数据处理中我使用线性加权的递推平均滤波较新的数据权重更大使系统既能滤除高频噪声又能快速响应高度变化。2.9 消抖滤波法消抖滤波通过设置计数器来确认信号变化的有效性只有当采样值连续多次不同于当前值时才认为发生了真实变化。这种方法特别适合处理开关量或临界值附近的抖动。#define N 5 char value; char filter() { char count0, new_value; new_value get_ad(); while(value ! new_value) { count; if(count N) return new_value; new_value get_ad(); } return value; }在机械按键检测中我设置N5的消抖滤波只有当按键状态连续5次采样一致时才确认变化完全消除了触点抖动问题。但要注意对于快速变化的信号这种方法会导致严重滞后。2.10 限幅消抖滤波法限幅消抖滤波结合了限幅和消抖两种方法的优点先进行限幅判断再对可能有效的采样值进行消抖确认。#define A 10 #define N 5 char value; char filter() { char new_value, count0; new_value get_ad(); while(value ! new_value) { if(abs(value-new_value) A) { count; if(count N) return new_value; } new_value get_ad(); } return value; }在工业控制面板的旋钮编码器处理中我使用这种方法A取编码器步进值的1.5倍N取3既保证了响应速度又有效抑制了干扰产生的误动作。3. 滤波算法选择指南3.1 根据信号特性选择慢变信号温度、压力中位值滤波、递推平均滤波、一阶滞后滤波快变信号转速、电流限幅滤波、算术平均滤波N较小含脉冲干扰的信号限幅滤波、中位值平均滤波3.2 根据系统资源选择RAM有限的系统限幅滤波、一阶滞后滤波计算能力弱的系统限幅滤波、算术平均滤波N较小低功耗系统减少采样次数和计算量的算法3.3 实际应用经验在多个工业项目中我总结出以下经验对于4-20mA电流信号递推平均滤波N8效果很好热电偶测温推荐使用中位值平均滤波N10电池电压检测适合一阶滞后滤波a30振动信号处理需要限幅消抖滤波组合每种滤波算法都有其适用场景实际项目中常常需要组合使用多种方法。比如先限幅去除脉冲干扰再进行递推平均滤波最后加一阶滞后平滑。关键是要理解每种算法的特性根据具体需求灵活运用。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2490940.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!