1 前言
在前面的文章中,已经将SMO的架构全部搭建起来了,接下来就是使用Matlab将其实现。
2 仿真搭建
2.1 观测器
首先列出之前搭建的仿真器模型如下:
其中
A
=
[
−
R
L
s
0
0
−
R
L
s
]
A=[\begin{matrix} -\frac{R}{L_s} & 0 \\ 0 & -\frac{R}{L_s} \\ \end{matrix}]
A=[−LsR00−LsR],将其拆成两个式子为:
将其离散化得:
其中
A
=
e
x
p
(
−
R
/
L
s
T
s
)
,
B
=
(
1
−
A
)
/
R
A=exp(-R/L_sT_s), B=(1-A)/R
A=exp(−R/LsTs),B=(1−A)/R,
T
s
T_s
Ts为采样周期。注:别问怎么算出来的,问就是不知道。
离散化后的SMO的本质其实是这样的:
将其搭建成仿真后其中
i
α
i_\alpha
iα部分如下:
2.2 反正切
E
α
E_\alpha
Eα和
E
β
E_\beta
Eβ得到后就可以使用反正切求得
θ
\theta
θ了,但是这里存在一个问题,之前就说过
E
α
E_\alpha
Eα和
E
β
E_\beta
Eβ其实就是
z
α
z_\alpha
zα和
z
β
z_\beta
zβ进行滤波得到得,所以会存在一个相位延迟,而这个延迟会很大程度上影响估算
θ
\theta
θ的准确性,所以需要在反正切的结果上加上一个角度补偿来弥补这个相位延迟,即:
其中
ω
c
\omega_c
ωc为低通滤波器截至频率。为了获取转速信息,则可以对上式的
θ
\theta
θ进行微分,或者如果表贴士PMSM,则可以使用如下式子计算:
根据上面的描述,最后搭建的反正切模型如下:
2.3 仿真结果
foc_control如下:
让电机系统处于有传感器的双闭环状态下,然后使用SMO观测在旁边观测,最后对比一下电机转子的真实
θ
\theta
θ和SMO估算出来
θ
\theta
θ,如下:
可以发现估算出来的
θ
\theta
θ与电机真实
θ
\theta
θ非常接近,这代表算法成功了。
3 移植验证
将算法移植到MCU中,首先让电机运行在电流闭环下,然后用SMO预测电机角度,如下:
可以看到估算出的
θ
\theta
θ非常不好,这里只要有两个原因,第一就是现在还没有实现速度闭环,所以目前的电流很不稳定,再加上现在的电流也和目前电机的速度不匹配,预估的结果非常不好。接下来我们就要加上速度环,实现双闭环,再看看SMO的表现。
下图则是加入速度环的SMO的波形,此时FOC的
θ
\theta
θ已经是由SMO估算出来的。
再来看看调速性能:
至此,使用SMO已经可以让电机转起来了。
下面贴上我的测试代码: