对于嵌入式新手而言,控制算法和滤波算法是核心基础能力,直接关系到硬件系统的稳定性、精度和可靠性。以下从控制算法滤波算法两大方向,整理必须掌握的核心内容,结合原理、适用场景和实现要点展开说明。

一、必须掌握的控制算法

控制算法是嵌入式系统中 “决策执行” 的核心,用于根据输入信号(如传感器数据、设定目标)驱动执行器(如电机、舵机、阀门)实现预期功能。新手需从基础线性控制入手,逐步理解反馈机制和参数调优逻辑。

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)×Δtde/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 次温度采样的平均值代替当前值,消除偶然波动。

     

    实现步骤

     
    1. 定义数组存储最近 N 个数据(窗口大小 N,N 越大平滑效果越好,但响应越慢);

    2. 新数据到来时,覆盖最旧数据(或按队列先进先出);

    3. 计算数组所有元素的平均值,作为滤波后的值。

     

    适用场景

     
    • 传感器数据含随机噪声(如温湿度传感器、光照传感器);

    • 对实时性要求不高,允许轻微延迟的场景(N=3~10 即可)。

     

    优缺点

     
    • 优点:实现简单(仅需数组和累加计算),资源消耗低;

    • 缺点:对突变信号(如突然的温度跳变)响应慢,窗口大小 N 需根据噪声特性调整。

    2. 中值滤波

    地位:对付 “脉冲噪声”(突发异常值)的利器,补充移动平均的不足。
    原理:对窗口内的 N 个数据排序,取中间值作为输出,可有效剔除极端异常值(如传感器偶尔跳变到最大值 / 最小值)。

     
    • 例如:超声波测距时偶尔出现的 “飞点”(突然显示 10 米,实际仅 2 米),中值滤波可直接忽略。

     

    实现步骤

     
    1. 存储最近 N 个数据(N 为奇数,方便取中间值);

    2. 对数据排序(升序或降序);

    3. 取第(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. 卡尔曼滤波(简化版)

    地位:进阶滤波算法,适合含高斯噪声的动态系统,新手需理解核心思想。
    原理:基于 “预测 - 更新” 迭代过程,通过建立系统数学模型,结合传感器测量值和预测值,最小化估计误差(适用于噪声符合高斯分布的场景)。

    • 核心步骤:

      1. 预测:根据上一时刻状态和系统模型,预测当前状态;

      2. 更新:用当前传感器测量值修正预测值,得到最优估计。

     

    简化应用:新手无需深入推导数学公式,可直接使用离散化的一阶卡尔曼滤波(如针对温度、速度等单变量信号),核心参数为 “过程噪声方差” 和 “测量噪声方差”(可通过实验调试)。

    适用场景

    • 动态系统(如机器人定位、无人机姿态估计);

    • 传感器噪声稳定且可建模的场景(如加速度计、陀螺仪数据融合)。

     

    学习建议:先掌握基础滤波,再通过开源代码(如 Arduino 的 Kalman 库)理解实现逻辑,重点理解 “噪声建模” 对滤波效果的影响。

    三、新手学习路径与建议

    1. 控制算法学习顺序
      先掌握 开关控制 和 开环控制 理解基础逻辑 → 深入学习 PID 控制(重点练习参数调优,用实际硬件如电机调试)→ 掌握 状态机(用代码实现多场景流程控制,如 “启动 - 运行 - 停止 - 故障” 逻辑)。

    2. 滤波算法学习顺序
      从 移动平均滤波 和 限幅滤波 入门(用温度传感器实测效果)→ 掌握 中值滤波 处理异常值 → 学习 指数移动平均 优化实时性 → 最后了解 卡尔曼滤波 核心思想(作为进阶目标)。

    3. 实践建议

      • 用低成本硬件验证(如 STM32 或 Arduino + 电机 / 舵机 + 传感器),通过示波器观察控制效果和滤波前后的数据差异;

      • 记录参数调试过程(如 PID 的 Kp/Ki/Kd 变化对电机转速的影响),建立 “参数与效果” 的直观认知;

      • 结合开源项目(如 GitHub 上的电机控制例程、传感器滤波代码),分析他人实现逻辑。

    总结

    嵌入式新手需优先掌握 PID 控制(核心控制工具)、状态机(逻辑流程管理),以及 移动平均滤波中值滤波(基础数据处理)。这些算法覆盖了 80% 以上的嵌入式场景,且原理清晰、实现简单,是深入复杂系统(如多传感器融合、智能控制)的基础。学习时务必结合硬件实践,从 “调参 - 观察效果” 中积累经验,避免仅停留在理论层面。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐