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);
user4015003:@TI工程师,TI工程师可以回复一下这个问题吗?
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);
Annie Liu:
为更加有效地解决您的问题,我们建议您将问题发布在E2E英文技术论坛上https://e2e.ti.com/support/microcontrollers/c2000/f/171,将由资深的工程师为您提供帮助。我们的E2E英文社区有TI专家进行回复,并得到全球各地工程师的支持,分享他们的知识和经验。