计算STM32F定时器的距离

Calculating distance for STM32F Timer

假设我有一个STM32F4,系统时钟为8MHz,时间为(TIM3_PSC = 39)。我正在连接超声波传感器 HC-SR04

我正在做定时器中断,想计算距离和可以计算的最大距离。

所以我的工作是:1/8MHz * TIM32_PSC = 0.000000125 * 40 = 5uS 是定时器周期。

假设以下代码:

float distance; // in m
    …
void TIM3_IRQHandler(void)
{
    static uint16_t left;
    if (…)
    {
        left = TIM3->CCR1;
    } 
    else
    {
        uint16_t right = TIM3->CCR1;
        distance = ______________________________________________
    }
    TIM3->SR &= ~TIM_SR_CC1IF;
}

所以距离应该是 = (右 - 左 * 340/2)

对吗?

对于最大距离,它是 MaxDistance = 340m/s / 5uS = 68Meters ?

我仍然不明白 leftrigth 在您的代码中代表什么,但这是我实现它的方式:

  1. 在捕获模式下将计时器配置为 5 us 刻度(或其他一些值)。不要启动它。启用捕获和更新(溢出)事件中断。
  2. 当您想进行测量时,重置定时器计数器并启动定时器并触发信号传输(如果有多个传感器,同时启动所有传感器)
  3. 等待捕获事件中断。这对于多个通道(对于多个传感器)应该是一样的。
  4. 对于每个捕获中断,获取对应的CCR寄存器值为capture[n]
  5. 让定时器运行。最终会触发更新(溢出)中断。
  6. 在更新(溢出)中断中,寻找你没有得到捕获中断的通道。你没有得到中断的那些超出了范围。在更新中断中停止定时器。
  7. 对于每个捕获的通道,distance = (capture[n] * 5) * 10^-6 * 340 以米为单位。

量纲分析会有所帮助。我假设你的 5us/tick 刻度是正确的——我没有检查。你应该很容易就能弄清楚这一点。提示:计算按下按钮和释放按钮之间的滴答声,然后按住按钮一秒钟:)

  • leftright 是单向距离的计时器滴答单位 - 你 如果它们是前向+反射距离,则必须将这些值除以 2,
  • 一个滴答单位是5us,
  • 声速为 340m/s。

因此:

distance = (right-left) * 5us/tick * 340m/s

      [                s     m ]
[m] = [ (tick-tick) *------*---]
      [               tick   s ]

      [ tick    s     m ]
    = [------*------*---]
      [  1     tick   s ]

      [ m ]
    = [---] = [m]
      [ 1 ]

在 C:

// floating point
float distance = (right - left) * 5E-6 * 340.0;

在整数中,1 毫米将是一个合理的输出单位,因为每个刻度有 1.7 毫米的声音传播。但内部计算需要以 dmm(deca-millimeter = 0.1mm)为单位进行以保持精度。

// integer, in 1mm units
int distance = ((right - left) * (340*5E-6/1E-4) + 5) / 10;

维度分析:

       [                 m    s    / m          ]
       [ (tick - tick) *---*------/----- + dmm  ]
       [                 s   tick/  dmm         ]
[mm] = [----------------------------------------]
       [                    dmm                 ]
       [                   -----                ]
       [                     mm                 ]

       [         m     dmm        ]
       [ tick *------*----- + dmm ]
       [        tick    m         ]
     = [--------------------------]
       [             dmm          ]
       [            -----         ]
       [              mm          ]

       [               mm  ]
     = [ (dmm + dmm)*----- ] = [mm]
       [              dmm  ]

同样,1dmm = 0.1mm。