【问题标题】:Arduino timer seems to be crashing?Arduino 计时器似乎崩溃了?
【发布时间】:2013-06-20 08:23:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: timer arduino dmx512


    【解决方案1】:

    Arduino 上有两个计时器,您可以将这两个计时器放在一边。 DmxSimple 明确表示它使用计时器#2,而对于 NewPing 则不清楚。但是 NewPing 库可以在不使用计时器的情况下工作。您可以使用 DmxSimple 的计时器(这是与其总线接近实时交互所必需的)使 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);
    

    【讨论】:

    • 感谢您的帮助,zmo!我已经想办法了,看来。我在 NewPing 库 Timer2 中更改为 Timer4。虽然我真的不知道自己在做什么,但我一直在尝试和错误,直到得到一些有用的结果。
    • 您的建议,但是,在 Ping 代码中使用延迟,对我没有帮助,因为我真的必须避免任何类型的延迟陷阱,因为我的程序的其余部分需要一个常量(和“不间断”)更新。
    • 也许你想看看修改后的 NewPing 库,我尝试用 Timer 4 替换 Timer 2。说我正在开发 Arduino Mega 1280 可能会很有趣。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多