Quantcast
Channel: C2000™︎ 微控制器论坛 - 最近的话题
Viewing all articles
Browse latest Browse all 12274

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

$
0
0

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

谢谢大家!


Viewing all articles
Browse latest Browse all 12274

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>