嵌入式新手必须要会的控制算法和滤波算法有哪些?
嵌入式系统开发中,控制算法和滤波算法是两大核心技术。控制算法方面,PID控制是基础核心,需掌握比例、积分、微分三环节的调参方法;开关控制、状态机和开环控制则适合不同复杂度场景。滤波算法方面,移动平均、中值滤波和指数移动平均能有效处理噪声,而限幅滤波和卡尔曼滤波则针对特定干扰。建议新手从简单算法入手,结合硬件实践,逐步掌握参数调优技巧,建立算法与效果的直观认知。这些基础算法覆盖了80%的嵌入式应用场

对于嵌入式新手而言,控制算法和滤波算法是核心基础能力,直接关系到硬件系统的稳定性、精度和可靠性。以下从控制算法和滤波算法两大方向,整理必须掌握的核心内容,结合原理、适用场景和实现要点展开说明。
一、必须掌握的控制算法
控制算法是嵌入式系统中 “决策执行” 的核心,用于根据输入信号(如传感器数据、设定目标)驱动执行器(如电机、舵机、阀门)实现预期功能。新手需从基础线性控制入手,逐步理解反馈机制和参数调优逻辑。
1. PID 控制算法(比例 - 积分 - 微分控制)
地位:嵌入式领域应用最广泛的控制算法,没有之一,是新手入门控制的 “第一块基石”。
原理:通过比例(P)、积分(I)、微分(D)三个环节的组合,根据 “目标值与实际值的偏差” 动态调整输出,实现系统稳定控制。
- 比例环节(P)
输出与当前偏差成正比(
P_out = Kp × e(t)),快速响应偏差,但单独使用会有稳态误差(如电机调速时无法精准达到目标转速)。 - 积分环节(I)
输出与偏差的累积值成正比(
I_out = Ki × ∫e(t)dt),消除稳态误差(如温度控制中,通过积分 “记住” 过去的偏差,逐步修正)。 - 微分环节(D)
输出与偏差的变化率成正比(
D_out = Kd × de(t)/dt),抑制系统超调和震荡(如电机启停时,通过预判偏差变化趋势,提前减速避免冲过头)。
核心公式:
总输出 u(t) = Kp×e(t) + Ki×∫e(t)dt + Kd×de(t)/dt(离散化后适合嵌入式实现)。
适用场景:
-
电机转速 / 位置控制(如无人机电机、机器人底盘);
-
温度、压力等过程控制(如恒温箱、热水器);
-
舵机角度控制、阀门开度调节等。
实现要点:
-
必须离散化:嵌入式系统是离散时间运行,需将积分用 “累加和”、微分用 “差分” 近似(如
∫e(t)dt ≈ Σe(k)×Δt,de/dt ≈ [e(k)-e(k-1)]/Δt); -
参数调优:新手可先用 “试凑法”(先调 P,再调 I,最后调 D),目标是 “无超调、快速收敛、无稳态误差”;
-
抗积分饱和:当执行器达到最大输出时(如电机满速),积分累积可能导致 “过冲”,需限制积分项最大值。
2. 开关控制算法(On-Off 控制)
地位:最简单的反馈控制,是理解 “闭环控制” 的入门案例。
原理:根据实际值与目标值的偏差 “非黑即白” 地切换输出(要么全开,要么全关)。-
例如:冰箱温控中,当温度高于目标值时压缩机启动(On),低于目标值时压缩机关闭(Off);
-
核心逻辑:
if (实际值 > 目标值 + 阈值) → 输出关闭;else if (实际值 < 目标值 - 阈值) → 输出开启。
适用场景:对精度要求不高、响应速度慢的场景,如家用空调、简易加热设备。
优缺点:
-
优点:实现简单(仅需条件判断),资源消耗极低;
-
缺点:存在周期性震荡(如温度在目标值附近波动),精度低。
3. 状态机控制(有限状态机,FSM)
地位:嵌入式系统中处理多场景逻辑的核心工具,尤其适合流程化控制。
原理:将系统行为抽象为 “状态”(如待机、运行、故障),通过 “事件”(如按键触发、传感器信号)实现状态间的切换,每个状态对应明确的执行逻辑。核心要素:
-
状态(State):系统当前的工作模式(如 “初始化”“正常运行”“报警”);
-
事件(Event):触发状态切换的输入(如 “启动指令”“超时信号”“故障检测”);
-
转移(Transition):事件发生时从当前状态到下一状态的规则;
-
动作(Action):进入 / 退出状态时执行的操作(如启动传感器、关闭电机)。
适用场景:
-
设备流程控制(如洗衣机的 “注水→洗涤→排水→脱水” 流程);
-
故障处理逻辑(如传感器异常时从 “运行” 切换到 “报警” 并执行保护动作);
-
人机交互逻辑(如按键长按 / 短按对应不同功能切换)。
实现要点:
-
用枚举定义状态,用 switch-case 或状态转移表实现逻辑(推荐状态转移表,更清晰);
-
避免状态冗余,确保每个状态的职责单一;
-
处理 “异常事件”(如未定义的事件需默认处理,避免系统卡死)。
4. 开环控制算法
地位:无反馈的基础控制方式,是理解 “控制逻辑” 的起点。
原理:根据预设规则直接输出控制量,不依赖传感器反馈(即 “输入→输出” 无闭环修正)。-
例如:按固定占空比驱动 LED 闪烁(无需检测亮度,直接定时切换);
-
核心逻辑:
输出 = 预设函数(输入)(如电机转速直接按电压固定比例输出)。
适用场景:
-
简单场景(如 LED 控制、蜂鸣器报警);
-
对精度要求极低,或无法获取反馈的场景。
局限性:抗干扰能力差(如电源波动会直接影响输出),无法修正误差,仅作为复杂控制的基础补充。
二、必须掌握的滤波算法
嵌入式系统中,传感器数据(如温度、加速度、距离)往往受噪声干扰(如电路噪声、环境干扰、传感器本身误差),滤波算法用于 “去伪存真”,提取有效信号。新手需掌握实现简单、效果稳定的基础滤波方法。
1. 移动平均滤波(滑动平均滤波)
地位:最基础、应用最广的平滑滤波,新手入门滤波的首选。
原理:维护一个固定长度的 “数据窗口”,每次新数据到来时,丢弃窗口中最旧的数据,计算窗口内所有数据的平均值作为输出,平滑随机噪声。-
例如:用 5 次温度采样的平均值代替当前值,消除偶然波动。
实现步骤:
-
定义数组存储最近 N 个数据(窗口大小 N,N 越大平滑效果越好,但响应越慢);
-
新数据到来时,覆盖最旧数据(或按队列先进先出);
-
计算数组所有元素的平均值,作为滤波后的值。
适用场景:
-
传感器数据含随机噪声(如温湿度传感器、光照传感器);
-
对实时性要求不高,允许轻微延迟的场景(N=3~10 即可)。
优缺点:
-
优点:实现简单(仅需数组和累加计算),资源消耗低;
-
缺点:对突变信号(如突然的温度跳变)响应慢,窗口大小 N 需根据噪声特性调整。
2. 中值滤波
地位:对付 “脉冲噪声”(突发异常值)的利器,补充移动平均的不足。
原理:对窗口内的 N 个数据排序,取中间值作为输出,可有效剔除极端异常值(如传感器偶尔跳变到最大值 / 最小值)。-
例如:超声波测距时偶尔出现的 “飞点”(突然显示 10 米,实际仅 2 米),中值滤波可直接忽略。
实现步骤:
-
存储最近 N 个数据(N 为奇数,方便取中间值);
-
对数据排序(升序或降序);
-
取第
(N+1)/2个值作为滤波结果。
适用场景:
-
含脉冲噪声的传感器(如超声波测距、红外避障);
-
数据偶尔跳变但大部分正常的场景。
优缺点:
-
优点:有效剔除异常值,实现简单(排序可简化为冒泡);
-
缺点:对快速变化的信号响应较慢,窗口 N 过大会增加计算量。
3. 指数移动平均滤波(EMA)
地位:兼顾实时性和平滑效果的轻量化滤波,适合资源受限的嵌入式系统。
原理:对当前采样值和上一次滤波结果进行加权平均,新数据权重更高,旧数据权重随时间指数衰减(无需存储历史窗口,节省内存)。-
核心公式:
Y(k) = α×X(k) + (1-α)×Y(k-1),其中α为平滑系数(0<α<1,α 越大实时性越好,平滑越弱;α 越小平滑越强,响应越慢)。
适用场景:
-
内存有限的小型嵌入式系统(如 8 位 MCU);
-
需快速响应且噪声不大的场景(如加速度计、心率传感器)。
实现要点:
-
α 值调试:根据噪声大小调整,例如噪声大时取 α=0.2,噪声小时取 α=0.5;
-
初始值处理:首次滤波时 Y (0) 可直接等于 X (0),避免初始偏差。
4. 限幅滤波(防脉冲干扰滤波)
地位:最简单的异常值过滤方法,常与其他滤波结合使用。
原理:设定相邻两次数据的最大允许变化量(阈值),若当前数据与上一次滤波结果的差值超过阈值,则认为是异常值,用上次结果替代。-
核心逻辑:
if |X(k) - Y(k-1)| > Δ → Y(k)=Y(k-1);else Y(k)=X(k),其中Δ为阈值(根据传感器特性设定)。
适用场景:
-
数据变化缓慢的传感器(如温度、湿度);
-
作为前置滤波,先剔除明显异常值,再配合移动平均或 EMA 使用。
优缺点:
-
优点:实现极简单(仅需差值判断),资源消耗几乎为 0;
-
缺点:阈值 Δ 难设定(过小会过滤有效变化,过大则无效),对连续噪声无效。
5. 卡尔曼滤波(简化版)
地位:进阶滤波算法,适合含高斯噪声的动态系统,新手需理解核心思想。
原理:基于 “预测 - 更新” 迭代过程,通过建立系统数学模型,结合传感器测量值和预测值,最小化估计误差(适用于噪声符合高斯分布的场景)。-
核心步骤:
-
预测:根据上一时刻状态和系统模型,预测当前状态;
-
更新:用当前传感器测量值修正预测值,得到最优估计。
-
简化应用:新手无需深入推导数学公式,可直接使用离散化的一阶卡尔曼滤波(如针对温度、速度等单变量信号),核心参数为 “过程噪声方差” 和 “测量噪声方差”(可通过实验调试)。
适用场景:
-
动态系统(如机器人定位、无人机姿态估计);
-
传感器噪声稳定且可建模的场景(如加速度计、陀螺仪数据融合)。
学习建议:先掌握基础滤波,再通过开源代码(如 Arduino 的 Kalman 库)理解实现逻辑,重点理解 “噪声建模” 对滤波效果的影响。
三、新手学习路径与建议
-
控制算法学习顺序:
先掌握 开关控制 和 开环控制 理解基础逻辑 → 深入学习 PID 控制(重点练习参数调优,用实际硬件如电机调试)→ 掌握 状态机(用代码实现多场景流程控制,如 “启动 - 运行 - 停止 - 故障” 逻辑)。 -
滤波算法学习顺序:
从 移动平均滤波 和 限幅滤波 入门(用温度传感器实测效果)→ 掌握 中值滤波 处理异常值 → 学习 指数移动平均 优化实时性 → 最后了解 卡尔曼滤波 核心思想(作为进阶目标)。 -
实践建议:
-
用低成本硬件验证(如 STM32 或 Arduino + 电机 / 舵机 + 传感器),通过示波器观察控制效果和滤波前后的数据差异;
-
记录参数调试过程(如 PID 的 Kp/Ki/Kd 变化对电机转速的影响),建立 “参数与效果” 的直观认知;
-
结合开源项目(如 GitHub 上的电机控制例程、传感器滤波代码),分析他人实现逻辑。
-
总结
嵌入式新手需优先掌握 PID 控制(核心控制工具)、状态机(逻辑流程管理),以及 移动平均滤波、中值滤波(基础数据处理)。这些算法覆盖了 80% 以上的嵌入式场景,且原理清晰、实现简单,是深入复杂系统(如多传感器融合、智能控制)的基础。学习时务必结合硬件实践,从 “调参 - 观察效果” 中积累经验,避免仅停留在理论层面。
-
更多推荐



所有评论(0)