Arduino定时器似乎要崩溃了



对于一个有一些互动装置的展览,我必须创建一个系统,从三个超声波PING传感器读取数据,并在一个输出端连接DMX调光器。

所以我拿了我的Arduino Mega板,围绕它构建了一些硬件(DMX的信号逆变器),并使用库DmXSimple测试了DMX调光器。它工作得很好!

下一步:测试PING传感器。我使用了库NewPing,并连接了传感器。它工作得很好!

现在两者结合在一起,在一个程序中:使用相同的代码导入两个库。不工作!

定时器碰撞?嗯…不管怎样,我不知道如何解决这个问题。我该怎么办?如果是计时器问题(即两个库调用相同的计时器),我真的不知道如何修改库以使其工作。

Arduino上有两个计时器,您可以将两者都放在一边。DmxSimple明确地说它使用定时器#2,而对于NewPing则不清楚。但是NewPing库可以在不使用计时器的情况下工作。您可以使用DmxSimple的计时器(这对于与其总线的近实时交互是必需的)使其工作,而您可以在循环函数中处理声纳ping:

void loop() {
    int dst = sonar.ping_cm();
    delay(50);
    DmxSimple.write(1, dst);
}

你不应该让计时器冲突。

查看NewPing的源代码,如果您使用timer_us()/timer_ms()函数,它使用Timer2,但是没有定时器。但是如果你在Arduino Leonardo(或Arduino Micro或任何其他基于ATmega32U4的微控制器)上运行它,它将使用Timer4,这与DmxSimple不冲突。

如果你想修补NewPing库以使用Timer3,你可能想在NewPing.cpp中替换它:

OCR2A = 249;
TIMSK2 |= (1 << OCIE2A);

OCR3A = 640;
TIMSK3 |= (1 << OCIE3A);

and in stop_timer:

TIMSK2 &= ~(1 << OCIE2A);

TIMSK3 &= ~(1 << OCIE3A);

最新更新