SimpleFOC源码学习02(v2.3.2) - 低通滤波器lowpass_filter.cpp与lowpass_filter.h

前言


github源码:https://github.com/simplefoc/Arduino-FOC/tree/master/src/common

低通滤波器(Low-Pass Filter)是一种信号处理工具,它的作用是:让变化缓慢的信号通过,过滤掉变化剧烈(噪声)的信号

在电机控制中,传感器读到的速度、电流值经常带有噪声抖动,低通滤波器就是用来平滑这些数值的。

一、lowpass_filter.h


cpp 复制代码
class LowPassFilter {
public:
    LowPassFilter(float Tf);    // 构造函数,传入时间常数
    float operator() (float x); // 重载()运算符,让对象像函数一样调用

    float Tf;                   // 时间常数(越大=越平滑,响应越慢)

protected:
    unsigned long timestamp_prev; // 上次调用的时间戳(微秒)
    float y_prev;                 // 上次的滤波输出值
};

关键概念 --- Tf 时间常数:

  • Tf 单位是
  • Tf 越大 → 滤波越强,信号越平滑,但响应越迟钝
  • Tf 越小 → 几乎不滤波,跟随输入但噪声多
  • 典型值:0.01f(10ms)用于电流,0.1f(100ms)用于速度

二、lowpass_filter.cpp


2.1、构造函数

cpp 复制代码
LowPassFilter::LowPassFilter(float time_constant)
    : Tf(time_constant)   // 记录时间常数
    , y_prev(0.0f)        // 初始输出为0
{
    timestamp_prev = _micros(); // 记录当前时间(微秒)
}

2.2、核心滤波函数operator()

cpp 复制代码
float LowPassFilter::operator() (float x)
{
    unsigned long timestamp = _micros();
    // 距离上次调用过了多少秒。
    float dt = (timestamp - timestamp_prev)*1e-6f;  // 换算成秒
    if (dt < 0.0f ) dt = 1e-3f;                     // 时间溢出保护 → 用1ms代替
    else if(dt > 0.3f) {                            // 超过0.3秒没调用
        y_prev = x;                                 // 直接输出当前值(认为系统停了)
        timestamp_prev = timestamp;
        return x;
    }
    float alpha = Tf/(Tf + dt);                     // 核心公式!
    float y = alpha*y_prev + (1.0f - alpha)*x;      // 加权混合
    y_prev = y;
    timestamp_prev = timestamp;
    return y;
}

三、理解核心公式


这是整个代码最重要的两行:

cpp 复制代码
float alpha = Tf/(Tf + dt);                     // 核心公式!
float y = alpha*y_prev + (1.0f - alpha)*x;      // 加权混合


直觉理解:

  • alpha 接近 1(如 0.99) → 90%相信旧值,10%相信新输入 → 非常平滑,很迟钝
  • alpha 接近 0(如 0.1) → 10%旧值,90%新输入 → 几乎不滤波,跟随快但噪声多

四、如何使用这个类


cpp 复制代码
// 创建一个时间常数为0.01秒的滤波器
LowPassFilter lpf(0.01f);

// 在循环中调用(像函数一样用)
float raw_speed = sensor.read();    // 读到带噪声的速度
float smooth_speed = lpf(raw_speed); // 滤波后的平滑速度

operator() 的重载让对象可以直接当函数调用,写法非常简洁。

五、总结


六、Tf的数值怎样选取? 比如电流环20KHz,速度环1KHz。


6.1、先算出dt

6.2、理解alpha和Tf的关系

alpha = Tf / (Tf + dt)

alpha 决定了每次保留多少旧值 。实际工程中,alpha 的合理范围是 0.8 ~ 0.98

  • 低于 0.8 → 几乎不滤波,噪声太多
  • 高于 0.98 → 延迟太大,控制器反应迟钝
    由此可以反推 Tf
    Tf = alpha × dt / (1 - alpha)

    实际项目参数设置:

6.3、关键约束:电流环Tf 必须远小于速度环周期

电流环的 Tf 引入延迟,这个延迟会传递到速度环。速度环周期是 1ms,所以电流环滤波器的延迟必须远小于 1ms:

复制代码
电流环 Tf = 0.0005f(0.5ms)< 速度环 dt(1ms)✅ 合理
电流环 Tf = 0.005f (5ms) >> 速度环 dt(1ms)❌ 危险,会破坏速度环稳定性
相关推荐
Wallace Zhang1 天前
SimpleFOC源码学习04(v2.3.2) - 数学基础层foc_utils.cpp与foc_utils.h
foc
Wallace Zhang2 天前
SimpleFOC源码学习00(v2.3.2) - 源码版本说明
foc
Wallace Zhang2 天前
SimpleFOC源码学习01(v2.3.2) - PID控制器PID.cpp与PID.h
foc
jdhfusk13 天前
foc进阶篇1——可能比强拖更好的磁编非线性校准
foc·无刷电机控制
沉沙丶20 天前
关于matlab分析电流THD的一些探究和记录
开发语言·matlab·电机控制·foc·永磁同步电机·模型预测·预测控制
沉沙丶22 天前
模型预测控制专题(十二)—— 基于高阶扩展状态观测器HESO的MPFCC
simulink·电机控制·foc·永磁同步电机·pmsm·无模型预测·电流预测控制
沉沙丶23 天前
模型预测控制专题(十一)—— 基于改进型扩张状态观测器MESO的MPFCC
电机控制·foc·永磁同步电机·模型预测·预测控制·pmsm·无模型预测
沉沙丶23 天前
模型预测控制专题(十)—— 现有观测器限制分析
电机控制·foc·永磁同步电机·模型预测·预测控制·pmsm·无模型预测
沉沙丶1 个月前
模型预测控制专题(八)—— 带宽参数影响分析
电机控制·foc·永磁同步电机·模型预测·预测控制·无模型预测