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);