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.

例程BLDC3—1中速度计算模块speed—prd中的问题

感谢大佬们的解答

在官方给的那个英文文件了看了半天也没看懂SpeedScaler和BaseRpm的作用,以及他们是怎么计算出来的

球大佬们教教我


  • 我们可以先看例程里面是如何计算转速的,再反过来看看这个参数是如何变成这个值的。
    这个是关于速度的相关参数初始化:
    // Initialize the SPEED_PR module
    speed1.InputSelect = 0;
    speed1.BaseRpm = 120*(BASE_FREQ/POLES);
    speed1.SpeedScaler = (Uint32)(ISR_FREQUENCY/(1*BASE_FREQ*0.001));

    这个是中断里面对转速计算的调用,即每转一圈,记录下当前的VitrualTimer的计数值
    if ((pwm1.CmtnPointer==5)&&(PreviousState==4)&&(hall1.CmtnTrigHall==0x7FFF))
    {
    speed1.TimeStamp = VirtualTimer;
    SPEED_PR_MACRO(speed1);
    }
    而计数器是在中断函数里面进行累加的,计数器的计数累加的频率是中断的频率
    // ------------------------------------------------------------------------------
    // Increase virtual timer and force 15 bit wrap around
    // ------------------------------------------------------------------------------
    VirtualTimer++;
    VirtualTimer &= 0x00007FFF;

    那么我们正常计算转速是这样的:
    转速频率 = 中断频率/两次VitrualTimer计数值之差, 即Fisr/Δt , Fisr 为中断频率(ISR_FREQUENCY/0.001), Δt为两次vitual timer 计数值之差
    如果换算成RPM,
    转速RPM = Fisr *60*2/(Δt*P), P为电机极数
    其中BaseRPM的定义为120*(BASE_FREQ/POLES);
    那么转速RPM = Fisr *60*2/(Δt*P) = (Fisr * BaseRPM)/(BASE_FREQ*Δt) = BaseRPM * SpeedScaler /Δt
    这也是SPEED_PR_MACRO(speed1) 去计算的:

    v.EventPeriod = v.NewTimeStamp - v.OldTimeStamp; \
    \
    if (v.EventPeriod < 0) \
    v.EventPeriod += 32767; /* 0x7FFF = 32767*/ \
    } \
    \
    v.Speed = _IQdiv(v.SpeedScaler,v.EventPeriod); \
    \

    v.SpeedRpm = _IQmpy(v.BaseRpm,v.Speed);

    转速频率 = 1/(T*K*n*Δt)
    同理换算成转速 = 60*2/(T*K*n*Δt*P)

  • BaseRpm 是 speed1 类的成员,Rpm 是 rounds per minute,即转速。 电气转速 除以 极对数 则是 机械转速。

    SpeedScaler 是 speed1类的成员,用 系统频率 除以 转速, 则是将 转速 rpm 转换成一个跟 系统时钟 clk 为单位的变量 , 即 一个机械转动周期 里 经历 的 sys clk数 (= 1 / sys freq )。
  • 真的十分感谢您的细心回答,笔芯!!!

  • 很高兴能帮到您!
  • 您好,请问BASE_FREQ是什么的频率呢,又是怎么确定的呢?
  • BASE_FREQ 是电机的额定运行频率 也叫基频 ,与电机的额定转速,磁极对数有关

    额定转速=60*基频/(磁极对数)

    应该在工程内有定义,您可以search一下

    #define BASE_FREQ 200 // Base electrical frequency (Hz)
  • 感谢您的回答,我还有一个疑问
    VirtualTimer++;
    VirtualTimer &= 0x00007FFF;
    请问这个计数器自加一次的时间是多少呢?是基于ISR_FREQUENCY吗,我看到定义ISR_FREQUENCY=20MHz,请问这个频率是要通过设置寄存器配置的吗?
    再次感谢您的回答!!!