首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino中断频率

Arduino中断频率
EN

Stack Overflow用户
提问于 2015-03-25 21:26:12
回答 2查看 1.6K关注 0票数 0

我正在使用Arduino uno来测量直流电机的速度。我有一个光电传感器,当马达转满一圈时,它会发出脉冲。当马达的转速大于90赫兹时,我遇到的问题就开始了。一旦我达到90 As,Arduino就不会进入中断功能。

我的代码:

代码语言:javascript
复制
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赫兹之后,代码再次工作。我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2015-03-25 21:42:03

看起来好像blink就是你的ISR。如果是这样的话,您不应该在该例程中进行调试I/O,原因有两个。第一个问题是你正在调用一个可能阻塞的进程。第二个是is应该做他们的事情并完成(应该是高效的)。我的猜测是,如果您从ISR中删除调试I/O,并将信息传回被中断的任务(当然是安全的),您将能够以大于90 hz的频率处理中断。

票数 3
EN

Stack Overflow用户

发布于 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 (请考虑我没有考虑传输之间的任何时间间隔开销)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29256998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档