前面我们基本把有感FOC介绍得差不多了,接下来我本打算进入无感FOC控制的深入学习,奈何导师项目项目太多太杂…先把自己这段时间学的东西总结分享一下再说吧。查阅了很多无感FOC控制的相关资料,把基本原理和流程渐渐的了解了一下(以后有时间再详细介绍了),发现很多环节都会用到”一阶低通数字滤波器“(相电流滤波,反电势滤波,角度、转速滤波,校正因子滤波),虽然代码里面只是一个简单的公式,但为了控制系统的参数设计,我还是浅浅的去探究了一下其基本原理,如有错误还望提出指正。


开局先直接给出公式: y ( k ) = ( 1 − a ) ⋅ y ( k − 1 ) + a ⋅ x ( k ) y(k) = (1 - a) \cdot y(k - 1) + a \cdot x(k) y(k)=(1a)y(k1)+ax(k)

式中: x ( k ) x(k) x(k)为当前输入, y ( k − 1 ) y(k - 1) y(k1)为上一次的输出, y ( k ) y(k) y(k)为当前计算的输出;a为滤波系数,取值范围0~1,a取值越小,当前输入权重就越小,输出波形越平滑,但响应灵敏度降低;

如果只是套用公式写代码的话,看到这里就可以结束了,想要理解其中的原理,以及采样频率、截止频率和参数的计算,那么请接着往下看。


一、原理及公式推导

”一阶低通数字滤波器“对应的物理电路模型是”一阶RC低通滤波电路“,电路如下图所示。

在这里插入图片描述
电容的阻抗表示为1/jωC,对于上面电路,有输入输出电压关系:

U o u t = 1 j ω C R + 1 j ω C U i n = 1 1 + j ω R C U i n {U_{out}} = \frac{{\frac{1}{{j\omega C}}}}{{R + \frac{1}{{j\omega C}}}}{U_{in}} = \frac{1}{{1 + j\omega RC}}{U_{in}} Uout=R+jωC1jωC1Uin=1+jωRC1Uin

上式写成传递函数形式: G ( s ) = 1 1 + τ s , G(s) = \frac{1}{{1 + \tau s}}, G(s)=1+τs1,其中 j ω = s {j\omega = s} jω=s为复频域变量, R C = τ {RC = \tau } RC=τ为时间常数。
在《自动控制原理》中称为一阶惯性环节。

由Y(s)=G(s).F(s)得到时域的微分方程:

y = 1 1 + τ s f ( x ) ⇒ τ ⋅ y ′ + y = x y = \frac{1}{{1 + \tau s}}f(x) \Rightarrow \tau \cdot y' + y = x y=1+τs1f(x)τy+y=x

使用一阶后向差分法,对上面微分方程进行离散化,有:

τ ⋅ y ( k ) − y ( k − 1 ) T + y ( k ) = x ( k ) \tau \cdot \frac{{y(k) - y(k - 1)}}{T} + y(k) = x(k) τTy(k)y(k1)+y(k)=x(k)

其中T为采样周期,对上式进行整理化简可写成:

y ( k ) = ( 1 − T T + τ ) ⋅ y ( k − 1 ) + T T + τ ⋅ x ( k ) y(k) = (1 - \frac{T}{{T + \tau }}) \cdot y(k - 1) + \frac{T}{{T + \tau }} \cdot x(k) y(k)=(1T+τT)y(k1)+T+τTx(k)

a = T T + τ a = \frac{T}{{T + \tau }} a=T+τT得到一般表达式: y ( k ) = ( 1 − a ) ⋅ y ( k − 1 ) + a ⋅ x ( k ) y(k) = (1 - a) \cdot y(k - 1) + a \cdot x(k) y(k)=(1a)y(k1)+ax(k),a称为滤波系数。

二、截止频率和参数计算

对于电路模型,有截止频率 f H = 1 2 π R C = 1 2 π ⋅ τ {f_H} = \frac{1}{{2\pi RC}} = \frac{1}{{2\pi \cdot \tau }} fH=2πRC1=2πτ1截止频率定义为幅频响应曲线衰减 -3db,即为原来的 1 2 \frac{1}{{\sqrt 2 }} 2 1时的频率,模电里面的基础知识这里不细讲)

可得是将常数 τ = 1 2 π ⋅ f H \tau = \frac{1}{{2\pi \cdot {f_H}}} τ=2πfH1代入滤波系数a的表达式得:

a = T T + τ = 1 1 + τ T = 1 1 + 1 T ⋅ 1 2 π f H = 1 1 + f 2 π f H a = \frac{T}{{T + \tau }} = \frac{1}{{1 + \frac{\tau }{T}}} = \frac{1}{{1 + \frac{1}{T} \cdot \frac{1}{{2\pi {f_H}}}}} = \frac{1}{{1 + \frac{f}{{2\pi {f_H}}}}} a=T+τT=1+Tτ1=1+T12πfH11=1+2πfHf1

式中 f = 1 T f = \frac{1}{T} f=T1为采样频率。

在实际的应用中,一般有采样频率远大于截止频率,即有 f > > f H f > > {f_H} f>>fH,故近似有 a ≈ 2 π ⋅ f H f a \approx 2\pi \cdot \frac{{{f_H}}}{f} a2πffH,所以已知截止频率和采样频率,我么就能够计算滤波系数a的值了。

又会问:截止频率和采样频率怎么确定呢?选取不同的值会对计算输出有什么影响呢?下面为你简单介绍一下。

三、频率的选择

1.采样频率的选择

一般人为主观选择,在不影响其他功能性能的条件下,尽量越大越好。

先以我之前做的电机控制为例。在程序中,PWM定时器开启中断,在中断服务函数中用ADC采集相电流,故采样频率就等于PWM定时器频率,我在控制代码中用的是20kHz,即采样频率f=20kHz。

2.截止频率的选择

根据采样对象信号的频率选择,一般稍大于被采样信号的最大基波频率就好。

还是以我做的电机控制为例。我用的永磁同步电机额定转速为3000rpm,极对数为4,采样对象为相电流。则在额定条件下,相电流的频率为 f c u r r e n t = 3000 ⋅ 4 ÷ 60 = 200 H z {f_{current}} = 3000 \cdot 4 \div 60 = 200Hz fcurrent=30004÷60=200Hz,考虑到电机超负荷运行,瞬时转速可以大于3000,保留一定余量,我取截止频率 f H = 500 H z {f_H} = 500Hz fH=500Hz。如此计算得滤波系数 a = 2 π ⋅ 500 20000 ≈ 0.15707963 a = 2\pi \cdot \frac{{500}}{{20000}} \approx 0.15707963 a=2π200005000.15707963

在电机运行前,对放大器进行校准时,只考虑直流偏置输入,即被采样的信号频率趋近于0Hz,主要滤掉电路中的高频干扰和噪声,故可把截止频率取得很小,我这里取 f H = 5 H z {f_H} = 5Hz fH=5Hz,计算得滤波系数a=0.00157。


四、频率选择对输出的影响(附仿真分析)

在采样频率固定的情况下,截止频率越大,滤波系数a的值越大,当前输入的权重就越大,计算的输出和实际的输出跟踪效果更好,即动态响应更好,幅值衰减的影响更小。

减小截止频率,滤波系数a的值越小,当前输入的权重越小,故计算的输出信号更平滑,对噪声干扰和谐波的滤除效果更好,但是动态响应变差,而且会产生一定程度的幅值衰减。

matlab代码和仿真结果分析:

仿真结果:
在这里插入图片描述
图中,绿色为含有噪声的采样信号,蓝色为标准的正弦信号,红色为采样信号经过一阶低通滤波器的计算输出。

可以发现,当截止频率较小时,输出信号幅值衰减明显,且存在一定滞后;随着截止频率的增大,对标准正弦信号的跟踪效果越好;当截止频率过大时,几乎能完全复现采样信号,但是对噪声的滤波效果变差。

下面再看一下对直流信号的测试
在这里插入图片描述
可以看出,随着截止频率的减小,计算输出的信号越来越平滑,接近直流信号,但同时调节时间也增大,对应我前面电机控制中,对放大器的校准时间需要延长。在实际应用中,对于直流信号的滤波,截止频率一般取1~50Hz我觉得就好了(当然也有可能其它情况我没想到)。

最后附上matlab的仿真源代码

代码源程序:

交流信号部分:



f_basic=200;%原信号频率为200Hz
w_basic=2*pi*f_basic;
f_H=1;%截止频率500Hz
f_simple=20000;%采样频率20kHz
PointNumber = 100000;%坐标点数量

x=0:1:PointNumber-1;
Standard =2+sin(w_basic*x*0.0000005);%原始标准信号
noise = 0+0.1*randn(1,PointNumber);
AddNoise=Standard+noise;

a=2*pi*f_H/f_simple;
y_last=0;
y_now=0;
for i = 0:1:PointNumber-1
    x_now=AddNoise(i+1);
    y_now=(1-a)*y_last+a*x_now;
    output(i+1)=y_now;
    y_last=y_now;
end
figure(1);
X=0:1:PointNumber-1;
plot(X,AddNoise,'-.g');hold on;
plot(X,Standard,'-..b');hold on;
plot(X,output,'-..r');hold on;
legend('With noise','Standard','Output') 
xlabel('time');
ylabel('value');
title('一阶低通滤波器(fH=1Hz)');



f_basic=200;%原信号频率为200Hz
w_basic=2*pi*f_basic;
f_H=5;%截止频率500Hz
f_simple=20000;%采样频率20kHz
PointNumber = 100000;%坐标点数量

x=0:1:PointNumber-1;
Standard =2+sin(w_basic*x*0.0000005);%原始标准信号
noise = 0+0.1*randn(1,PointNumber);
AddNoise=Standard+noise;

a=2*pi*f_H/f_simple;
y_last=0;
y_now=0;
for i = 0:1:PointNumber-1
    x_now=AddNoise(i+1);
    y_now=(1-a)*y_last+a*x_now;
    output(i+1)=y_now;
    y_last=y_now;
end
figure(2);
X=0:1:PointNumber-1;
plot(X,AddNoise,'-.g');hold on;
plot(X,Standard,'-..b');hold on;
plot(X,output,'-..r');hold on;
legend('With noise','Standard','Output') 
xlabel('time');
ylabel('value');
title('一阶低通滤波器(fH=5Hz)');


f_basic=200;%原信号频率为200Hz
w_basic=2*pi*f_basic;
f_H=50;%截止频率500Hz
f_simple=20000;%采样频率20kHz
PointNumber = 100000;%坐标点数量

x=0:1:PointNumber-1;
Standard =2+sin(w_basic*x*0.0000005);%原始标准信号
noise = 0+0.1*randn(1,PointNumber);
AddNoise=Standard+noise;



a=2*pi*f_H/f_simple;
y_last=0;
y_now=0;
for i = 0:1:PointNumber-1
    x_now=AddNoise(i+1);
    y_now=(1-a)*y_last+a*x_now;
    output(i+1)=y_now;
    y_last=y_now;
end
figure(3);
X=0:1:PointNumber-1;
plot(X,AddNoise,'-.g');hold on;
plot(X,Standard,'-..b');hold on;
plot(X,output,'-..r');hold on;
legend('With noise','Standard','Output') 
xlabel('time');
ylabel('value');
title('一阶低通滤波器(fH=50Hz)');


f_basic=200;%原信号频率为200Hz
w_basic=2*pi*f_basic;
f_H=500;%截止频率500Hz
f_simple=20000;%采样频率20kHz
PointNumber = 100000;%坐标点数量

x=0:1:PointNumber-1;
Standard =2+sin(w_basic*x*0.0000005);%原始标准信号
noise = 0+0.1*randn(1,PointNumber);
AddNoise=Standard+noise;



a=2*pi*f_H/f_simple;
y_last=0;
y_now=0;
for i = 0:1:PointNumber-1
    x_now=AddNoise(i+1);
    y_now=(1-a)*y_last+a*x_now;
    output(i+1)=y_now;
    y_last=y_now;
end
figure(4);
X=0:1:PointNumber-1;
plot(X,AddNoise,'-.g');hold on;
plot(X,Standard,'-..b');hold on;
plot(X,output,'-..r');hold on;
legend('With noise','Standard','Output') 
xlabel('time');
ylabel('value');
title('一阶低通滤波器(fH=500Hz)');

直流信号部分:

f_basic=1;%原信号频率为200Hz
w_basic=2*pi*f_basic;
f_H=500;%截止频率500Hz
f_simple=20000;%采样频率20kHz
PointNumber = 100000;%坐标点数量

x=0:1:PointNumber-1;
Standard =2+0.05*sin(w_basic*x*0.00005);%原始标准信号
noise = 0+0.05*randn(1,PointNumber);
AddNoise=Standard+noise;

a=2*pi*f_H/f_simple;
y_last=0;
y_now=0;
for i = 0:1:PointNumber-1
    x_now=AddNoise(i+1);
    y_now=(1-a)*y_last+a*x_now;
    output(i+1)=y_now;
    y_last=y_now;
end
figure(1);
X=0:1:PointNumber-1;
plot(X,AddNoise,'-.g');hold on;
plot(X,output,'-..r');hold on;

xlabel('time');
ylabel('value');
title('一阶低通滤波器(直流信号测试)');

f_H=1;%截止频率500Hz
a=2*pi*f_H/f_simple;
y_last=0;
y_now=0;
for i = 0:1:PointNumber-1
    x_now=AddNoise(i+1);
    y_now=(1-a)*y_last+a*x_now;
    output(i+1)=y_now;
    y_last=y_now;
end
plot(X,output,'-..c');hold on;

f_H=0.5;%截止频率500Hz
a=2*pi*f_H/f_simple;
y_last=0;
y_now=0;
for i = 0:1:PointNumber-1
    x_now=AddNoise(i+1);
    y_now=(1-a)*y_last+a*x_now;
    output(i+1)=y_now;
    y_last=y_now;
end
plot(X,output,'-..m');hold on;

f_H=0.2;%截止频率500Hz
a=2*pi*f_H/f_simple;
y_last=0;
y_now=0;
for i = 0:1:PointNumber-1
    x_now=AddNoise(i+1);
    y_now=(1-a)*y_last+a*x_now;
    output(i+1)=y_now;
    y_last=y_now;
end
plot(X,output,'-..k');hold on;



f_H=0.1;%截止频率500Hz
a=2*pi*f_H/f_simple;
y_last=0;
y_now=0;
for i = 0:1:PointNumber-1
    x_now=AddNoise(i+1);
    y_now=(1-a)*y_last+a*x_now;
    output(i+1)=y_now;
    y_last=y_now;
end
plot(X,output,'-..r');hold on;

plot(X,Standard,'-..b');hold on;

 legend('With noise','Output-500Hz','Output-1Hz','Output-0.5Hz','Output-0.2Hz','Output-0.1Hz','Standard')

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐