代码之家  ›  专栏  ›  技术社区  ›  Pertev

使用for循环作为延迟的替代方案?

  •  0
  • Pertev  · 技术社区  · 1 年前

    仅仅询问for循环函数是否用作计时器而不是延迟,也会在主循环中对其他代码行造成不必要的干扰。

    void okLED() {
      for (long i = 0; i < 150000; i++) {
        digitalWrite(LED_BUILTIN, HIGH);
      }
      for (long j = 0; j < 150000; j++) {
        digitalWrite(LED_BUILTIN, LOW);
      }
    }
    
    void slowLED() {
      for (long i = 0; i < 25000; i++) {
        digitalWrite(LED_BUILTIN, HIGH);
      }
      for (long j = 0; j < 20000; j++) {
        digitalWrite(LED_BUILTIN, LOW);
      }
      for (long k = 0; k < 25000; k++) {
        digitalWrite(LED_BUILTIN, HIGH);
      }
      for (long l = 0; l < 110000; l++) {
        digitalWrite(LED_BUILTIN, LOW);
      }
    }
    

    像这样的东西。

    我想建立一个基于Arduino的尾灯系统,该系统与来自RC控制的油门信号互连。

    2 回复  |  直到 1 年前
        1
  •  4
  •   Lundin    1 年前

    Arduino人工世界之外的真正嵌入式系统几乎从不使用繁忙延迟/繁忙等待循环作为控制时序的手段。这种繁忙的等待是非常有问题的,因为它们毫无理由地拖延程序执行并导致100%的CPU利用率和100%的电流消耗。

    在专业环境中使用的替代方案涉及硬件计时器。专用定时器硬件外围设备,或专用实时时钟硬件外围设备。这些可以通过轮询标志或通过中断来使用。

    特别是为了控制LED,定时器外设的“输出比较”功能可用于在定时器用完时自动激活/停用GPIO引脚。PWM特性也是非常常见的,特别是用于减少电流消耗或在RGB的情况下启用多种颜色。

    在任何一种情况下,这些各种硬件特征中的任何一个都允许在主程序侧以并行方式控制LED。

        2
  •  1
  •   Gabriel Staples    1 年前

    无论您使用的是忙for循环还是忙等待 delay() 功能,两者都不好。

    立即闪烁研究: https://docs.arduino.cc/built-in-examples/digital/BlinkWithoutDelay

    有关更高级的协作多任务处理技术,请参阅我的答案: How to do high-resolution, timestamp-based, non-blocking, single-threaded cooperative multi-tasking

    对于读取RC PWM控制信号,这很复杂,但我这里有一个老例子: https://github.com/ElectricRCAircraftGuy/PWM_Reader2_WORKS_PERFECTLY_Hayden_car_lights

    Here's the core code 。它以与油门设置成比例的速率使LED闪烁。

    YouTube video:

    enter image description here