This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

2812 PMSM3_4测速模块的疑问



测速模块程序如下,

void speed_frq_calc(SPEED_MEAS_QEP *v)
{

_iq Tmp1;

// Differentiator
// Synchronous speed computation
if ((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);

}

  • 你好。

    测速模块程序如下,

    void speed_frq_calc(SPEED_MEAS_QEP *v)
    {

    _iq Tmp1;

    // Differentiator
    // Synchronous speed computation
    if ((v->ElecTheta < _IQ(0.9))&(v->ElecTheta > _IQ(0.1)))为什么要有这个限制?

    // 在角度0.9到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);

    }

  • 你好

    // 在角度0.9到0.1的过程中会有一个过零过程,过零时,转速计算不能按下面这个公式直接计算。

    但是有没有可能角度从0.8过零然后变到0.2呢?

    // 这是一种比较简单的处理办法,你也可以根据自己的需要来修改。

    也就是说这是让过零时的速度等于原来的速度来近似以免算出负的速度对吧。

  • // 在角度0.9到0.1的过程中会有一个过零过程,过零时,转速计算不能按下面这个公式直接计算。

    但是有没有可能角度从0.8过零然后变到0.2呢?

    这个可以通过电机的最大转速来判断,即在一个控制周期中,电机的电角度最大可能变化量为多少,如果不超过0.2的话,那么例程<0.1/>0.9的判断就不会有问题。

    // 这是一种比较简单的处理办法,你也可以根据自己的需要来修改。

    也就是说这是让过零时的速度等于原来的速度来近似以免算出负的速度对吧。

    是的。因为电机的机械时间常数一般比电时间常数长好多,0.2的电角度变化范围内,转速不会变大很大。

  • if (Tmp1>_IQ21(1)) //以下限定了速度的运行范围!相当于速度值的限幅?

    v->Speed = _IQ(1); //当速度值超过正转时的基准值时,把基准值赋值给速度

    else if (Tmp1<_iq21(-1)) v-="">Speed = _IQ(-1); //当速度值超过反向旋转的基准值时,把反向的基准值赋值给速度

    else v->Speed = _IQ21toIQ(Tmp1);//在运行范围内取计算值

    请问,以上程序中,为什么要对速度进行限幅??? 如果电机速度的运行范围超过这个速度标么值1,则怎么处理???

  • 你好。

    对速度限幅是算法用Q格式进行运算事先规定的。

    如果你的电机速度会超过标么值1,那么请将转速基值放大,以确保标么值不会超过1。

  • 您好,请问转速基准值放大在程序哪里体现?

    按照公式:标么值=实际值/基准值。但在TI的程序中,并没有程序反映这个关系式,而这个基准值往往是我们假定是多少,再通过标么值来换算实际值。不知我的理解是否正确???

  • / Low-pass filter // Q21 = GLOBAL_Q*Q21 + GLOBAL_Q*Q21 Tmp1 = _IQmpy(v->K2,_IQtoIQ21(v->Speed))+_IQmpy(v->K3,Tmp1);这句话什么意思?注解说是滤波,滤什么波? // 这里滤波滤的是转速波形,为了转速能够比较平滑一些,不会因为某一次角度的误差引起较大波动。 jay,你是我的偶像。这个滤波用的什么知识点?为什么电角度滤波就能得到速度?
  • 您好,请问K1是什么呀?看文档说是1/fb*T,fb是基准频率,基准频率是个什么东西?