离散域观测器状态方程
永磁同步电机扰动观测器无位置传感器控制,该方法仅需要根据反电动势估计结果进行一次反正切计算即可得到转子位置,只需要设计一个观测器增益,非常好调试,没有PLL等位置观测器,参数整定简单。 模型控制器部分全部采用离散域设计,模型可自由选择死区仿真使能和死区时间,所有参数都统一到init里,方便修改电机参数,适配不同电机参数。

最近在调永磁同步电机的无感方案时发现个宝藏设计——基于扰动观测器的位置观测方案。这玩意儿相比传统龙伯格观测器少了至少三倍工作量,特别适合我这种手头有三台电机要调试的懒人。

核心思路就像在玩消消乐,把反电动势里的位置信息直接怼进观测器。传统的龙伯格要搞两个观测器还得配PLL锁相环,这里直接把q轴反电动势当扰动项处理。关键代码就这五六行:
def disturbance_observer(v_alpha, v_beta, i_alpha, i_beta, dt):
global x_obs # 观测器状态量
e = np.array([i_alpha, i_beta]) - C @ x_obs # 输出误差
x_obs = A @ x_obs + B @ np.array([v_alpha, v_beta]) + L * e # 观测器更新
return x_obs[2], x_obs[3] # 返回反电动势估计值
观测器增益L直接决定动态响应,实测取电机基频的2~5倍就能用。比如1.5kW电机基频50Hz,L取300rad/s时响应速度刚好够用。这比传统方案需要调PI参数+锁相环带宽省事多了,老司机闭着眼睛都能设参数。

永磁同步电机扰动观测器无位置传感器控制,该方法仅需要根据反电动势估计结果进行一次反正切计算即可得到转子位置,只需要设计一个观测器增益,非常好调试,没有PLL等位置观测器,参数整定简单。 模型控制器部分全部采用离散域设计,模型可自由选择死区仿真使能和死区时间,所有参数都统一到init里,方便修改电机参数,适配不同电机参数。

位置解算更是省心到离谱,直接把估计的反电动势扔给np.arctan2完事:
theta_est = np.arctan2(-e_alpha_est, e_beta_est) # 位置解算
参数配置统一在init文件这点必须点赞,改电机型号时不用满世界找变量。像这样:
# init_params.py
MOTOR = {
'Rs': 1.2, # 定子电阻
'Ld': 0.005, # d轴电感
'Lq': 0.006, # q轴电感
'flux': 0.12, # 永磁体磁链
'deadtime': 2e-6 # 死区时间
}
OBSERVER = {
'L': 300, # 观测器增益
'enable_deadtime': True # 死区仿真开关
}
仿真时发现个有意思的现象:当死区时间超过3us时,位置估计波形会出现毛刺。这时候在电流采样后加个移动平均滤波立马见效:
# 电流预处理
def current_filter(raw_i):
window = np.ones(5)/5 # 5点移动平均
return np.convolve(raw_i, window, mode='same')
实测波形显示(如图1),位置跟踪误差能稳定在±0.15rad以内。红色是真实位置,蓝色虚线是估计值,在突加减载时也没出现明显振荡。个人觉得这个设计最爽的地方是参数物理意义明确——观测器增益直接对应系统带宽,调参侠们不用再对着十几个PI参数怀疑人生了。

!位置跟踪效果图:真实位置与估计值曲线高度重合,动态过程无明显超调

当然这方案也不是万能的,转速低于5%额定值时估计精度会下降。不过对于风机水泵这类不需要零速启停的场合,已经比那些需要注入高频信号的方法实用多了。下次准备试试在观测器里加入磁饱和补偿,看看能不能把低速段性能再提一提。

更多推荐

所有评论(0)