1

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

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

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

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

定时器碰撞?嗯......无论如何 - 我不知道如何解决这个问题。我应该怎么办?如果是计时器问题(即两个库都调用同一个计时器),我真的不知道如何修改库以使其正常工作。

4

1 回答 1

1

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的微控制器)上运行它,它将使用与 DmxSimple 不冲突的 Timer4。

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

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

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

在 stop_timer 中:

TIMSK2 &= ~(1 << OCIE2A);

TIMSK3 &= ~(1 << OCIE3A);
于 2013-06-20T13:11:01.783 回答