/* =================================================================================
File name: SMOPOS.H
==================================================================================*/
#ifndef __SMOPOS_H__
#define __SMOPOS_H__
typedef struct { _iq Valpha; // Input: Stationary alfa-axis stator voltage
_iq Ealpha; // Variable: Stationary alfa-axis back EMF
_iq Zalpha; // Output: Stationary alfa-axis sliding control
_iq Gsmopos; // Parameter: Motor dependent control gain
_iq EstIalpha; // Variable: Estimated stationary alfa-axis stator current
_iq Fsmopos; // Parameter: Motor dependent plant matrix 问题1,这里为何是matrix? 应该就是一个常数吧?
下面是SMO_CONST_MACRO里的一小段程序
#define SMO_CONST_MACRO(v) \
\
v.Fsmopos = exp((-v.Rs/v.Ls)*(v.Ts)); \
v.Gsmopos = (v.Vb/v.Ib)*(1/v.Rs)*(1-v.Fsmopos);
#endif
_iq Vbeta; // Input: Stationary beta-axis stator voltage
_iq Ebeta; // Variable: Stationary beta-axis back EMF
_iq Zbeta; // Output: Stationary beta-axis sliding control
_iq EstIbeta; // Variable: Estimated stationary beta-axis stator current
_iq Ialpha; // Input: Stationary alfa-axis stator current
_iq IalphaError; // Variable: Stationary alfa-axis current error
_iq Kslide; // Parameter: Sliding control gain
_iq Ibeta; // Input: Stationary beta-axis stator current
_iq IbetaError; // Variable: Stationary beta-axis current error
_iq Kslf; // Parameter: Sliding control filter gain
_iq Theta; // Output: Compensated rotor angle
_iq E0; // Parameter: 0.5
} SMOPOS;
/*-----------------------------------------------------------------------------
Default initalizer for the SMOPOS object.
-----------------------------------------------------------------------------*/
#define SMOPOS_DEFAULTS { 0,0,0,0,0,0,0,0,0,0,0, \
0,0,0,0,0,0,_IQ(0.5) \
}
/*------------------------------------------------------------------------------
Prototypes for the functions in SMOPOS.C
------------------------------------------------------------------------------*/
#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 */ \ 问题2,这个E0设置的有什么用?
/* 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)); \ 问题3,这个低通滤波器为什么这样编写啊? 看不懂,离散化的增量式编写方法吗
\
/* Rotor angle calculator -> Theta = atan(-Ealpha,Ebeta) */
v.Theta = _IQatan2PU(-v.Ealpha,v.Ebeta); 问题4,用arctan求转角,仅仅确定-90°到+90°范围,不是360度范 围,可能会出现估计转角和真实位置差180°的情况吧,怎么考虑?
#endif
/* Extended version of sliding control calculator
if (_IQabs(v.IalphaError) < E0)
v.Zalpha = _IQmpy(v.Kslide,_IQdiv(v.IalphaError,E0));
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,_IQdiv(v.IbetaError,E0));
else if (v.IbetaError >= E0)
v.Zbeta = v.Kslide;
else if (v.IbetaError <= -E0)
v.Zbeta = -v.Kslide;
*/
谢谢大家!