带有STM32霍尔传感器的无刷直流电机的速度测量

2019-07-14 17:52发布

3相BLDC,带有3个霍尔传感器,120度,2极对下图显示了这种情况: 1.png 我在微处理器的XOR模式下设置了一个定时器。PSC为[19 - 1],计数器周期为[10000 - 1],而定时器时钟为80MHz。我的电机最高转速为3000RPM。计时器设置为XOR模式,每次转换都会生成一个事件。根据STM32F407参考手册,在这种模式下,每次转换都会将CCR寄存器复位为0.这意味着如果我将该寄存器加6次,我应该得到一个完整的“电气旋转”或半个“物理旋转”,因为电机是2极对。我的问题: 我刚刚随机选择了计时器PSC和计数器周期的数字......这些数字将如何影响我的测量?例如,这些数字可以覆盖1到3000 RPM的速度吗?我在XOR ISR中有以下代码......这段代码有意义吗?
  1. <font size="4">static uint32_t speed = 0;
  2. static uint32_t time = 0;
  3. static int isMeasuring = 0;

  4. void XOR_ISR() {   
  5.      uint8_t state = readHallStateFromGPIO();
  6.     if(state == 0b101 && isMeasuring == 0) {
  7.         time = 0;
  8.         isMeasuring = 1;
  9.         time += TIM4->CCR1;
  10.     } else if(isMeasuring == 1 && state != 0b101) {
  11.         time += TIM4->CCR1;
  12.     } else if(isMeasuring == 1 && state == 0b101) {
  13.         time += TIM4->CCR1;
  14.         speed = time;
  15.         isMeasuring = 0;
  16.     }</font>
复制代码
这里,速度(假设我的代码是正确的,应该为整个霍尔传感器的时间段加上定时器值)。然后我将通过将频率转换为时间并将其转换为RPM,并因为极对而乘以2。它是否正确?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
天地直方
2019-07-15 00:25
我阅读了代码,我有一些疑问,你是否尝试测量每个XORed脉冲之间的时间?我想这void XOR_ISR()将在每个脉冲的向上边缘被调用。这应该是相当简单的,例如:
void XOR_ISR(){
    long time = TIM4->CCR1;
    int rpm = 10/time; // 60 * 1/(time*6)
}
我会添加一个移动平均计算器来平滑测量结果。
上限:最大运行速度为3000RPM时,车轮每秒转动3000/60 = 50次。由于车轮上总共有6个极,这意味着每6次ISR称为完全旋转。这意味着每秒脉冲50 * 6 = 300次。或者每1.6毫秒一个脉冲。看到你的定时器时钟以80MHz运行,每个脉冲计数到66640。这将提供非常准确的高速读数。
下限:然而,它可能使较低速度的读数更复杂一些。假设车轮以10 RPM的转速旋转。这导致每秒10/60 * 6 = 1个脉冲。这意味着每个脉冲计时器将计数到80 000 000。正如@Harry所说,这只适用于long5位备用变量。
我的想法:以80 MHz运行计时器有点矫枉过正。我会稍微降低时钟频率,以便在非常低的RPM下使测量更加稳健。但这一切都取决于你想要测量的最小RPM。10RPM?1RPM?0.1RPM?你需要确保您的计数器不会溢出。
准确度:最大的测量误差可以在最多一半的定时器周期内消失。这将是1 / 80MHz / 2 = 6.25ns。在最大RPM为3000RPM时,这将导致6.25ns / 1.6ms = 0.00036%的误差。这是0.11RPM RPM的错误。这对大多数应用程序非常有用。
我希望这有帮助!如果有人发现我的数学问题,请告诉我

一周热门 更多>