我正在使用Arduino uno来测量直流电机的速度。我有一个光电传感器,当马达转满一圈时,它会发出脉冲。当马达的转速大于90赫兹时,我遇到的问题就开始了。一旦我达到90 As,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接收到90 it的中断时,它不会执行中断中的代码。当马达低于90赫兹之后,代码再次工作。我做错了什么?
发布于 2015-03-25 21:42:03
看起来好像blink就是你的ISR。如果是这样的话,您不应该在该例程中进行调试I/O,原因有两个。第一个问题是你正在调用一个可能阻塞的进程。第二个是is应该做他们的事情并完成(应该是高效的)。我的猜测是,如果您从ISR中删除调试I/O,并将信息传回被中断的任务(当然是安全的),您将能够以大于90 hz的频率处理中断。
发布于 2015-03-25 22:24:52
只是添加到@Bruce answer。您在中断中使用串行IO。每次打印大约15-20个字符(取决于计算的值)。每个字符由8位数据+ 1起始位+ 1停止位= 10位编码。所以,说20*10=200比特。波特率为19200bps,因此传输200比特所需的时间为200/19200秒,或以频率19200/200=96Hz表示。因此,这是20个字符的传输所能达到的最大频率,它接近您测量的90Hz (请考虑我没有考虑传输之间的任何时间间隔开销)。
https://stackoverflow.com/questions/29256998
复制相似问题