Link

低通速度滤波器理论v2.0.2

低通滤波器的传递函数为:

其离散形式为:

其中,vf(k) 是时刻 k 的滤波后速度值,v(k) 是时刻 k 的测量速度,Tf 是滤波器时间常数,Ts 是采样时间(或方程两次执行之间的时间)。 这个低通滤波器也可以写成以下形式:

其中:

这更清楚地说明了低通滤波器的时间常数 Tf 代表什么。如果你的采样时间约为 1 毫秒(对于 Arduino UNO,这可以作为平均值),那么将 Tf 值设置为 Tf = 0.01 将导致:

alpha = 0.01/(0.01 + 0.001) = 0.91

这意味着实际速度测量值 v 将以系数 1-alpha = 0.09 影响滤波后的值 vf,这将显著平滑速度值(可能甚至过度平滑,具体取决于应用)。

实现细节

低通滤波函数在 SimpleFOC 中实现为一个名为 LowPassFilter 的类。 该类在构造函数中接收时间常数。

LowPassFilter filter = LowPassFilter(0.001); // Tf = 1ms

滤波函数的实现逻辑如下:

// low pass filtering function
float LowPassFilter::operator(float input){
  unsigned long timestamp = _micros();
  float dt = (timestamp - timestamp_prev)*1e-6f;
  // quick fix for strange cases (micros overflow)
  if (dt < 0.0f || dt > 0.5f) dt = 1e-3f;

  // calculate the filtering 
  float alpha = Tf/(Tf + dt);
  float y = alpha*y_prev + (1.0f - alpha)*x;

  // save the variables
  y_prev = y;
  timestamp_prev = timestamp;
  return y;
}

在代码中只需通过调用即可使用:

float signal_filtered = filter(signal);

并且你可以随时通过以下代码行更改滤波常数:

filter.Tf = 0.01; // changed to 10ms

该低通滤波器在电机类中实现,其时间常数可通过调用以下方法进行更改:

motor.LPF_velocity.Tf = 0.01;// to set it to 10ms