This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

HVPM_SenlorLess调试(BUILDLEVEL==LEVEL6)这段程序让lsw=2时,将滑模观测器估计的smo1.Theta引后到程序中计算park变换和ipark变换器时,电机抖动。



HVPM_SenlorLess调试(BUILDLEVEL==LEVEL6)这段程序让lsw=1时能正常工作smo1.Thetat和rg1.Out均为锯齿波,方向相同,两者之间有一点相位差;但让lsw=2时,电机立即达到最大转速,,能观测到smo1.Theta是一个频率很高的锯齿波且旋转方向与lsw=1时相反。刚开始怀疑是速度环(pid1_spd)参数没调好,后来就利用下面的程序段1将速度环从程序中断开,当IqRef = _IQ(0.05)时,电机还是立即达到最大转速,能观测到smo1.Theta是一个频率很高的锯齿波,方向与lsw=1时相同;,当IqRef = _IQ(0.015)时,smo1.Theta是一个频率与rg1.Out相同,但不是锯齿波,而是一个不规则的三角波,电机来抖动不旋转,在这种情况下调试了滑模观测器SMO_MACRO(v)程序(如下面程序段2)中的smo1.Kslide和smo1.Kslf这两个参数,smo1.Theta仍是一个频率与rg1.Out相同,但形状更不规则,三相永磁同步电机仍然抖动,当smo1.Kslide和smo1.Kslf调到某个值时,电机又达到电大转速,能观测到smo1.Theta是一个频率很高的锯齿波,方向与lsw=1时相同。

        请问大师们,在lsw=2时(此时无位置传感器和速度传感器),也就是将滑模观测器估计的smo1.Theta引后到程序中计算park变换和ipark变换器时,怎样才能使电机平稳旋转?

       十分感谢大家能回复!

程序段1:

// -----------------------------------------------------------------------------
// Connect inputs of the PID_REG3 module and call the PID IQ controller macro
// ------------------------------------------------------------------------------
if(lsw==0) pid1_iq.Ref = 0;
else if(lsw==1) pid1_iq.Ref = IqRef;
else pid1_iq.Ref =IqRef;//原来的程序是else pid1_iq.Ref =tpid1_spd.Out;修改为else pid1_iq.Ref =IqRef;
pid1_iq.Fdb = park1.Qs;

程序段2:

/*------------------------------------------------------------------------------
Prototypes for the functions in SMOPOS.C
------------------------------------------------------------------------------*/

_iq E0 =_IQ(0.5);
_iq invE0=_IQ(2.0);

#define SMO_MACRO(v) \
\
/* 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 */ \
if (_IQabs(v.IalphaError) < E0) \
v.Zalpha = _IQmpy(v.Kslide,_IQmpy(v.IalphaError,invE0)); \
else if (v.IalphaError >= E0) \
v.Zalpha = v.Kslide; \
else if (v.IalphaError <= -E0) \
v.Zalpha = -v.Kslide; \
if (_IQabs(v.IbetaError) < E0) \
v.Zbeta = _IQmpy(v.Kslide,_IQmpy(v.IbetaError,invE0)); \
else if (v.IbetaError >= E0) \
v.Zbeta = v.Kslide; \
else if (v.IbetaError <= -E0) \
v.Zbeta = -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);