测速模块程序如下,
void speed_frq_calc(SPEED_MEAS_QEP *v)
{
_iq Tmp1;
// Differentiator // Synchronous speed computationif ((v->ElecTheta < _IQ(0.9))&(v->ElecTheta > _IQ(0.1)))为什么要有这个限制?
// Q21 = Q21*(GLOBAL_Q-GLOBAL_Q)
Tmp1 = _IQmpy(v->K1,(v->ElecTheta – v->OldElecTheta));
else Tmp1 = _IQtoIQ21(v->Speed);这句话说不满足0.1-0.9之间的转速就等于原来的转速,为什么啊?
// Low-pass filter // Q21 = GLOBAL_Q*Q21 + GLOBAL_Q*Q21
Tmp1 = _IQmpy(v->K2,_IQtoIQ21(v->Speed))+_IQmpy(v->K3,Tmp1);这句话什么意思?注解说是滤波,滤什么波?
if (Tmp1>_IQ21(1))
v->Speed = _IQ(1);
else if (Tmp1<_IQ21(-1))
v->Speed = _IQ(-1); else
v->Speed = _IQ21toIQ(Tmp1);
// 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);
}
baidu zou:
回复 Jay:
你好
// 在角度0.9到0.1的过程中会有一个过零过程,过零时,转速计算不能按下面这个公式直接计算。
但是有没有可能角度从0.8过零然后变到0.2呢?
// 这是一种比较简单的处理办法,你也可以根据自己的需要来修改。
也就是说这是让过零时的速度等于原来的速度来近似以免算出负的速度对吧。
测速模块程序如下,
void speed_frq_calc(SPEED_MEAS_QEP *v)
{
_iq Tmp1;
// Differentiator // Synchronous speed computationif ((v->ElecTheta < _IQ(0.9))&(v->ElecTheta > _IQ(0.1)))为什么要有这个限制?
// Q21 = Q21*(GLOBAL_Q-GLOBAL_Q)
Tmp1 = _IQmpy(v->K1,(v->ElecTheta – v->OldElecTheta));
else Tmp1 = _IQtoIQ21(v->Speed);这句话说不满足0.1-0.9之间的转速就等于原来的转速,为什么啊?
// Low-pass filter // Q21 = GLOBAL_Q*Q21 + GLOBAL_Q*Q21
Tmp1 = _IQmpy(v->K2,_IQtoIQ21(v->Speed))+_IQmpy(v->K3,Tmp1);这句话什么意思?注解说是滤波,滤什么波?
if (Tmp1>_IQ21(1))
v->Speed = _IQ(1);
else if (Tmp1<_IQ21(-1))
v->Speed = _IQ(-1); else
v->Speed = _IQ21toIQ(Tmp1);
// 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);
}
ACIMFOC:
if (Tmp1>_IQ21(1)) //以下限定了速度的运行范围!相当于速度值的限幅?
v->Speed = _IQ(1); //当速度值超过正转时的基准值时,把基准值赋值给速度
else if (Tmp1<_iq21(-1)) v-="">Speed = _IQ(-1); //当速度值超过反向旋转的基准值时,把反向的基准值赋值给速度
else v->Speed = _IQ21toIQ(Tmp1);//在运行范围内取计算值
请问,以上程序中,为什么要对速度进行限幅??? 如果电机速度的运行范围超过这个速度标么值1,则怎么处理???
测速模块程序如下,
void speed_frq_calc(SPEED_MEAS_QEP *v)
{
_iq Tmp1;
// Differentiator // Synchronous speed computationif ((v->ElecTheta < _IQ(0.9))&(v->ElecTheta > _IQ(0.1)))为什么要有这个限制?
// Q21 = Q21*(GLOBAL_Q-GLOBAL_Q)
Tmp1 = _IQmpy(v->K1,(v->ElecTheta – v->OldElecTheta));
else Tmp1 = _IQtoIQ21(v->Speed);这句话说不满足0.1-0.9之间的转速就等于原来的转速,为什么啊?
// Low-pass filter // Q21 = GLOBAL_Q*Q21 + GLOBAL_Q*Q21
Tmp1 = _IQmpy(v->K2,_IQtoIQ21(v->Speed))+_IQmpy(v->K3,Tmp1);这句话什么意思?注解说是滤波,滤什么波?
if (Tmp1>_IQ21(1))
v->Speed = _IQ(1);
else if (Tmp1<_IQ21(-1))
v->Speed = _IQ(-1); else
v->Speed = _IQ21toIQ(Tmp1);
// 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);
}
Jay:
回复 ACIMFOC:
你好。
对速度限幅是算法用Q格式进行运算事先规定的。
如果你的电机速度会超过标么值1,那么请将转速基值放大,以确保标么值不会超过1。
测速模块程序如下,
void speed_frq_calc(SPEED_MEAS_QEP *v)
{
_iq Tmp1;
// Differentiator // Synchronous speed computationif ((v->ElecTheta < _IQ(0.9))&(v->ElecTheta > _IQ(0.1)))为什么要有这个限制?
// Q21 = Q21*(GLOBAL_Q-GLOBAL_Q)
Tmp1 = _IQmpy(v->K1,(v->ElecTheta – v->OldElecTheta));
else Tmp1 = _IQtoIQ21(v->Speed);这句话说不满足0.1-0.9之间的转速就等于原来的转速,为什么啊?
// Low-pass filter // Q21 = GLOBAL_Q*Q21 + GLOBAL_Q*Q21
Tmp1 = _IQmpy(v->K2,_IQtoIQ21(v->Speed))+_IQmpy(v->K3,Tmp1);这句话什么意思?注解说是滤波,滤什么波?
if (Tmp1>_IQ21(1))
v->Speed = _IQ(1);
else if (Tmp1<_IQ21(-1))
v->Speed = _IQ(-1); else
v->Speed = _IQ21toIQ(Tmp1);
// 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);
}
ACIMFOC:
回复 Jay:
您好,请问转速基准值放大在程序哪里体现?
按照公式:标么值=实际值/基准值。但在TI的程序中,并没有程序反映这个关系式,而这个基准值往往是我们假定是多少,再通过标么值来换算实际值。不知我的理解是否正确???
测速模块程序如下,
void speed_frq_calc(SPEED_MEAS_QEP *v)
{
_iq Tmp1;
// Differentiator // Synchronous speed computationif ((v->ElecTheta < _IQ(0.9))&(v->ElecTheta > _IQ(0.1)))为什么要有这个限制?
// Q21 = Q21*(GLOBAL_Q-GLOBAL_Q)
Tmp1 = _IQmpy(v->K1,(v->ElecTheta – v->OldElecTheta));
else Tmp1 = _IQtoIQ21(v->Speed);这句话说不满足0.1-0.9之间的转速就等于原来的转速,为什么啊?
// Low-pass filter // Q21 = GLOBAL_Q*Q21 + GLOBAL_Q*Q21
Tmp1 = _IQmpy(v->K2,_IQtoIQ21(v->Speed))+_IQmpy(v->K3,Tmp1);这句话什么意思?注解说是滤波,滤什么波?
if (Tmp1>_IQ21(1))
v->Speed = _IQ(1);
else if (Tmp1<_IQ21(-1))
v->Speed = _IQ(-1); else
v->Speed = _IQ21toIQ(Tmp1);
// 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);
}
dingzhiyong:
回复 Jay:
/ Low-pass filter// Q21 = GLOBAL_Q*Q21 + GLOBAL_Q*Q21
Tmp1 = _IQmpy(v->K2,_IQtoIQ21(v->Speed))+_IQmpy(v->K3,Tmp1);这句话什么意思?注解说是滤波,滤什么波?
// 这里滤波滤的是转速波形,为了转速能够比较平滑一些,不会因为某一次角度的误差引起较大波动。jay,你是我的偶像。这个滤波用的什么知识点?为什么电角度滤波就能得到速度?
测速模块程序如下,
void speed_frq_calc(SPEED_MEAS_QEP *v)
{
_iq Tmp1;
// Differentiator // Synchronous speed computationif ((v->ElecTheta < _IQ(0.9))&(v->ElecTheta > _IQ(0.1)))为什么要有这个限制?
// Q21 = Q21*(GLOBAL_Q-GLOBAL_Q)
Tmp1 = _IQmpy(v->K1,(v->ElecTheta – v->OldElecTheta));
else Tmp1 = _IQtoIQ21(v->Speed);这句话说不满足0.1-0.9之间的转速就等于原来的转速,为什么啊?
// Low-pass filter // Q21 = GLOBAL_Q*Q21 + GLOBAL_Q*Q21
Tmp1 = _IQmpy(v->K2,_IQtoIQ21(v->Speed))+_IQmpy(v->K3,Tmp1);这句话什么意思?注解说是滤波,滤什么波?
if (Tmp1>_IQ21(1))
v->Speed = _IQ(1);
else if (Tmp1<_IQ21(-1))
v->Speed = _IQ(-1); else
v->Speed = _IQ21toIQ(Tmp1);
// 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);
}
user4057038:
回复 Jay:
您好,请问K1是什么呀?看文档说是1/fb*T,fb是基准频率,基准频率是个什么东西?