arduino UNO硬件中断读取霍尔信号错乱问题求解

开发板采用arduinouno,2脚连接轮毂电机的一相霍尔(共3相霍尔,只采集一相计算当前速度,此电机转一圈有15个脉冲信号),
轮毂电机为5.5寸,滑板车用24V直流无刷轮毂电机
连接好硬件,采用硬件中断
现象:手转动电机,每圈脉冲信号读取正常为15个,当给电机一个PWM,让电机转动后,出来的脉冲信号一圈有几万多个
代码及现象如下:

img

然后主程序屏蔽电机,用手转动,非常正常,一圈15个脉冲

img

开始以为是电磁干扰,电机转起来影响了霍尔,但我用时间中断来做,让电机转起来,脉冲读的就很正常(不改变任何接线)

img

现在感觉是只要电机转,硬件中断会被频繁触发似的,求问,这是啥情况

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    问题分析

    从问题描述和现象来看,电机转动时硬件中断被频繁触发,并且输出的脉冲信号数量达到了几万个。这可能是因为电机转动时产生的电磁噪声导致了误触发硬件中断,从而造成了读取脉冲信号数量的错乱。

    解决方案

    为了解决这个问题,你可以尝试以下几个方法:

    1. 使用滤波电路

    在霍尔传感器的输出引脚上添加一个滤波电路,可以有效地抑制电机产生的干扰信号。这可以通过串联一个小电容或者使用低通滤波器实现。

    2. 添加硬件抗干扰措施

    可以尝试在电机和Arduino之间增加一些抗干扰措施,例如使用电磁屏蔽罩、增加地线连接、使用屏蔽线缆等。

    3. 调整中断触发条件

    可以尝试调整硬件中断的触发条件,例如增加中断触发的电平变化次数,减少误触发的可能性。

    下面是一个示例代码,展示了如何使用Arduino UNO的硬件中断来读取霍尔信号,并添加了滤波电路来减少干扰:

    const int hallPin = 2;  // 设置霍尔传感器的引脚
    const int interruptPin = 0;  // 设置中断引脚(使用了Arduino UNO的2号外部中断引脚)
    
    volatile int pulseCount = 0;  // 存储脉冲计数值
    
    void setup() {
      pinMode(hallPin, INPUT);
      pinMode(interruptPin, INPUT_PULLUP);  // 设置中断引脚为输入模式,并启用上拉电阻
      attachInterrupt(digitalPinToInterrupt(interruptPin), incrementPulseCount, CHANGE);  // 绑定中断处理函数
      Serial.begin(9600);
    }
    
    void loop() {
      // 读取脉冲计数值并输出
      int currentPulseCount = pulseCount;
      Serial.println(currentPulseCount);
      delay(1000);
    }
    
    void incrementPulseCount() {
      // 滤波电路
      // 在这里可以添加滤波电路的代码,例如使用RC滤波器
      // ...
    
      // 增加脉冲计数值
      pulseCount++;
    }
    

    请注意,上述代码中的滤波电路部分需要根据实际情况进行设计和实现,具体的滤波电路可以根据电机和霍尔传感器的特性来选择。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

问题的关键是:
开始以为是电磁干扰,电机转起来影响了霍尔,但我用时间中断来做,让电机转起来,脉冲读的就很正常(不改变任何接线)