TI中文支持网
TI专业的中文技术问题搜集分享网站

HVPM_Sensorless例程中对SMO算法的几点疑问

/* =================================================================================
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;
*/

谢谢大家!

user4880999:

我最近也在搞这个,帮你顶一下。。。坐等其他解答。。。解答一下Ealpha=(wc/s+wc)Zalpha  可以变成sEalpha=wc(Zalpha-Ealpha)。。。由此变成时间域,就可以求出上式。。。

兄弟,你有下面这个的公式或者框图结构?

/* 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 )); \

/* =================================================================================
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;
*/

谢谢大家!

user4680001:

同求求解释

赞(0)
未经允许不得转载:TI中文支持网 » HVPM_Sensorless例程中对SMO算法的几点疑问
分享到: 更多 (0)