三相永磁同步电机无感滑膜观测控制TI源代码解析

断了今生、忘了曾经 提交于 2020-02-12 11:50:09

日期:20200211
作者:LJL
参考文档:DMC MATH
(文档地址:C:\ti\controlSUITE\libs\app_libs\motor_control\math_blocks\v4.1~Docs)
参考源码:smopos.h,smopos_const.h
(代码地址:C:\ti\controlSUITE\libs\app_libs\motor_control\math_blocks\v4.1)
1、 技术背景
永磁同步电机与直流无刷电机的区别在于两者的反电动势。无刷直流电机通常情况下转子磁极采用瓦型磁钢,经过磁路设计,可以获得梯形波的气隙磁密,定子绕组多采用集中整距绕组,因此感应反电动势也是梯形波的;通常说的永磁同步电动机具有定子三相分布绕组和永磁转子,在磁路结构和绕组分布上保证感应电动势波形为正弦,外加的定子电压和电流也应为正弦波,一般靠交流变压变频器提供。
对于永磁同步电机的控制,为了获得最大转矩,提高效率,目前主流的控制方法是采用空间矢量控制方法,产生三相正弦电流。在没有位置传感器的情况下,需要设计一种观测方法获得电机转子的位置。经过研究发现,现阶段常用的一种位置观测方法是,根据电机运行时的电流反馈和电机αβ的反电动势估计,估算出电机转子的当前角度位置,也就是滑膜观测器。
假设电机模型如下图所示。

在这里插入图片描述首先在两相静止坐标系下重写电机电压方程。
在这里插入图片描述
对电压方程进行改写,将微分项移到左边,得到如下表达式:
在这里插入图片描述
其中s表示αβ的向量,A为-R/L I,B为-1/L I,其中I为22的单位矩阵。*
设计滑膜控制器,采用一种bang-bang控制,也就是根据αβ的电流估计值与实际电流在αβ坐标系下的解算值之间的误差量,计算控制量输出。滑膜观测器的数学表达式可以写为如下形式。
在这里插入图片描述
上式中,除Z(控制器输出的控制量)之外,所有变量均为估计值,输出量就是判断电流估计误差值得符号,确定输出控制量的正负号,也就是在两个模态之间滑动的状态。将上面式子求解微分方程并进行离散化,可以得到如下的表示结果。
在这里插入图片描述
其中,F与G的结果分别为:
在这里插入图片描述
注:e^(-R/L Ts)是根据严格的微分方程求解的得到的结果值,当采样时间间隔足够小时,可以对求解结果采用迈克劳林展开的形式,得到简化结果1-R/L Ts,其中Ts为采样时间间隔。在TI源代码中,这部分采用的是指数函数形式,在初始化时执行一遍,以后计算利用初始化计算的结果值。
滑膜观测器的输出包含高频谐波信号,直接采用该信号会导致计算结果偏差较大,因此对该信号设计低通滤波器,采用滤波结果计算电机转子位置估算值。
考虑一阶低通滤波器如下图所示。

在这里插入图片描述
输入电压与输出电压之间的关系可以表示为:
e_x=RC (de_y)/dt+e_y
将上式写成差分方程的形式,则可以表示为:
y(n+1)=y(n)+k*(x(n)-y(n))
其中k为Ts/RC
将反电动势与滑膜观测器输出带入上式,可以得到滤波后的反电动势,带入反正切函数,即可得到电机转子位置的估计值。
θ=arctan⁡(e_α/e_β )
将上述计算电角度值带入闭环控制系统,计算电压矢量。
2、 程序解析
了解上述技术背景知识后,分析TI源代码无感电机控制程序。
在程序初始化时,首先计算滑膜观测器的两个固定参数F和G,代码如下:

```	v.Fsmopos = exp((-v.Rs/v.Ls)*(v.Ts));				\
	v.Gsmopos = (v.Vb/v.Ib)*(1/v.Rs)*(1-v.Fsmopos);

v.Vb为电压基准值,在这里可以设置为母线电压,v.Ib为电流基准值,可以设置为电流环的输出最大值。
然后进入定时控制中断,首先使用开环的方式驱使电机运行,同时估算电机转子位置。

 /*	Sliding mode current observer	*/																\
    v.EstIalpha = _IQmpy(v.Fsmopos,v.EstIalpha) + _IQmpy(v.Gsmopos,(v.Valpha-v.Ealpha-v.Zalpha));		\
    v.EstIbeta  = _IQmpy(v.Fsmopos,v.EstIbeta)  + _IQmpy(v.Gsmopos,(v.Vbeta -v.Ebeta -v.Zbeta ));		\
																										\
	/*	Current errors	*/																				\
    v.IalphaError = v.EstIalpha - v.Ialpha;																\
    v.IbetaError  = v.EstIbeta  - v.Ibeta;																\
    																									\
	/*  Sliding control calculator	*/																	\
	/* v.Zalpha=v.IalphaError*v.Kslide/v.E0) where E0=0.5 here*/										\
	v.Zalpha = _IQmpy(_IQsat(v.IalphaError,v.E0,-v.E0),_IQmpy2(v.Kslide));								\
	v.Zbeta  = _IQmpy(_IQsat(v.IbetaError ,v.E0,-v.E0),_IQmpy2(v.Kslide));								\
																										\
	/*	Sliding control filter -> back EMF calculator	*/												\
    v.Ealpha = v.Ealpha + _IQmpy(v.Kslf,(v.Zalpha-v.Ealpha));											\
    v.Ebeta  = v.Ebeta  + _IQmpy(v.Kslf,(v.Zbeta -v.Ebeta));											\
																										\
	/*	Rotor angle calculator -> Theta = atan(-Ealpha,Ebeta)	*/										\
	v.Theta = _IQatan2PU(-v.Ealpha,v.Ebeta); 

第42、43行计算两相静止坐标系下的电流估计值,参考公式
在这里插入图片描述
第46与47行计算电流的估计误差,采用电流估计值与电流实际值作差计算。
第51行与52行为滑膜观测器控制量计算。其中v.E0为bang-bang控制的上下边界值,v.Kslide为滑模控制增益值。
第55和56行对控制量进行滤波处理,参考上述一阶低通滤波的差分方程,v.Kslf为滤波方程的增益系数。。
第59行为对滤波输出结果经过反正切求解,得到电机电角度估算值。
注意:_IQtan2PU为IQmath库的反正切求解函数,其输出结果为0-1,表示角度为0-2pi。atan2函数,即所谓的四象限反正切函数,其本质就是运用极坐标来实现对角度的计算,相比于atan函数的取值范围(-pi/2, pi/2),atan2函数的取值范围为(-pi, pi],该函数之所以称之为四象限反正切函数,是因为它能够区分四个象限,而atan函数是无法区分象限的。
由于反电动势经过低通滤波,角度估算结果必然存在相位差,需要认为进行相位补偿。根据低通滤波相位滞后特性,相位值为:
θ=arctan⁡(ω_e/ω_c )
其中,ω_e为电机运行估算电角度转速,ω_c为低通滤波器的截止频率。
将上述计算结果与滑膜观测器反正切计算结果相加,即为滑膜观测器的角度估算值。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!