我正在使用Arduino uno来测量直流电机的速度。 我有一个光电传感器,当电机转了一圈时会产生一个脉冲。 当电机速度> 1时,我开始出现问题。 90Hz的。 一旦达到90Hz,Arduino就不会进入中断功能。
我的代码:
int pin = 13;
volatile int state = LOW;
volatile unsigned long startTijd = 0;
volatile unsigned long eindTijd = 0;
unsigned int frequentie = 0;
volatile int count = 0;
void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, FALLING); //LOW, HIGH, FALLING, RISING, CHANGE
Serial.begin(19200);
}
void loop()
{
noInterrupts();
digitalWrite(pin, state);
interrupts();
}
void blink()
{
if (count == 0) {
startTijd = micros();
}
count++;
if (count == 31) {
count = 0;
eindTijd = micros();
eindTijd -= startTijd;
Serial.print(eindTijd);
Serial.print(" ms. - ");
frequentie = 30 * 1000000 / eindTijd;
Serial.print(frequentie);
Serial.println(" Hz.");
}
state = !state;
}
我的问题是:当Arduino接收到90Hz的中断时,它不会执行中断中的代码。此后电机低于90Hz时,代码再次工作。我做错了什么?
答案 0 :(得分:2)
看起来眨眼就是你的ISR。如果是这种情况,那么您不应该在该例程中进行调试I / O,原因有两个。首先,您正在调用可能阻止的进程。第二是ISR应该完成他们的工作并完成(应该是高效的)。我的猜测是,如果从ISR中删除调试I / O并将信息传递回中断的任务(当然是安全的),您将能够以超过90赫兹的速度为中断服务。
答案 1 :(得分:1)
只是添加到@Bruce的答案。您正在中断中使用串行IO。每次打印大约15-20个字符(取决于计算的值)。每个字符由8
位数据+ 1
起始位+ 1
停止位= 10
位编码。所以,比如20*10=200
位。波特率为19200
bps,因此传输200位所需的时间为200/19200
秒,或者频率为19200/200=96Hz
。因此,这是传输20个字符时可实现的最大频率,接近您测量的90Hz
(考虑到我不考虑传输之间的任何时间间隔开销)。 / p>