Arduino中断频率

时间:2015-03-25 13:26:12

标签: c++ c arduino interrupt

我正在使用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时,代码再次工作。我做错了什么?

2 个答案:

答案 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>