开发板采用arduinouno,2脚连接轮毂电机的一相霍尔(共3相霍尔,只采集一相计算当前速度,此电机转一圈有15个脉冲信号),
轮毂电机为5.5寸,滑板车用24V直流无刷轮毂电机
连接好硬件,采用硬件中断
现象:手转动电机,每圈脉冲信号读取正常为15个,当给电机一个PWM,让电机转动后,出来的脉冲信号一圈有几万多个
代码及现象如下:
然后主程序屏蔽电机,用手转动,非常正常,一圈15个脉冲
开始以为是电磁干扰,电机转起来影响了霍尔,但我用时间中断来做,让电机转起来,脉冲读的就很正常(不改变任何接线)
现在感觉是只要电机转,硬件中断会被频繁触发似的,求问,这是啥情况
不知道你这个问题是否已经解决, 如果还没有解决的话:从问题描述和现象来看,电机转动时硬件中断被频繁触发,并且输出的脉冲信号数量达到了几万个。这可能是因为电机转动时产生的电磁噪声导致了误触发硬件中断,从而造成了读取脉冲信号数量的错乱。
为了解决这个问题,你可以尝试以下几个方法:
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++;
}
请注意,上述代码中的滤波电路部分需要根据实际情况进行设计和实现,具体的滤波电路可以根据电机和霍尔传感器的特性来选择。
问题的关键是:
开始以为是电磁干扰,电机转起来影响了霍尔,但我用时间中断来做,让电机转起来,脉冲读的就很正常(不改变任何接线)