我使用的是TMDSHVMTRPFCKIT开发板,在测算速度比时候用了低通滤波,如下:
/* Low-pass filter*/ \
/* Q21 = GLOBAL_Q*Q21 + GLOBAL_Q*Q21*/ \
v.Tmp = _IQmpy(v.K2,_IQtoIQ21(v.Speed))+_IQmpy(v.K3,v.Tmp);
没看懂这个滤波器的理论依据是什么(我试了巴特沃斯变换,不对),求解释
完整代码如下:
#define BASE_FREQ 100 // Base electrical frequency (Hz)
float32 T = 0.001/ISR_FREQUENCY; // Samping period (sec), see parameter.h
// Initialize the Speed module for QEP based speed calculation
speed1.K1 = _IQ21(1/(BASE_FREQ*T));
speed1.K2 = _IQ(1/(1+T*2*PI*5)); // Low-pass cut-off frequency
speed1.K3 = _IQ(1)-speed1.K2;
speed1.BaseRpm = 120*(BASE_FREQ/POLES);
#define SPEED_FR_MACRO(v) \
/* Differentiator*/ \
/* Synchronous speed computation */ \
if ((v.ElecTheta < _IQ(0.9))&(v.ElecTheta > _IQ(0.1))) \
/* Q21 = Q21*(GLOBAL_Q-GLOBAL_Q)*/ \
v.Tmp = _IQmpy(v.K1,(v.ElecTheta - v.OldElecTheta)); \
else v.Tmp = _IQtoIQ21(v.Speed); \
/* Low-pass filter*/ \
/* Q21 = GLOBAL_Q*Q21 + GLOBAL_Q*Q21*/ \
v.Tmp = _IQmpy(v.K2,_IQtoIQ21(v.Speed))+_IQmpy(v.K3,v.Tmp); \
/* Saturate the output */ \
v.Tmp=_IQsat(v.Tmp,_IQ21(1),_IQ21(-1)); \
v.Speed = _IQ21toIQ(v.Tmp); \
/* Update the electrical angle */ \
v.OldElecTheta = v.ElecTheta; \
/* Change motor speed from pu value to rpm value (GLOBAL_Q -> Q0)*/ \
/* Q0 = Q0*GLOBAL_Q => _IQXmpy(), X = GLOBAL_Q*/ \
v.SpeedRpm = _IQmpy(v.BaseRpm,v.Speed);
#endif // __SPEED_FR_H__