【问题标题】:Calculating distance for STM32F TimerSTM32F定时器的计算距离
【发布时间】:2021-01-28 15:22:31
【问题描述】:

假设我有一个 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;
}

所以距离应该是 = (right - left * 340/2)

是吗?

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

【问题讨论】:

  • 我对超声波测距不熟悉。 left & rigth 是什么?
  • @Tagli 左右传感器读数
  • 似乎不对。 (左右)应该放在括号中,如果没有别的,你肯定是指ususec,而不是uS(微西门子)。但无论如何,如果不深入研究,这个公式似乎是假的; 5us 计时器周期必须以某种方式存在,因为您不会将左右值与任何物理时间单位相乘。如果您将问题稍微去本地化,您可能会更幸运地找到合格的答案。
  • @dialer 我得到了右 - 左传感器读数的差异......然后我乘以物理单位声速 340,因为我有两个传感器,所以我除以 2。跨度>

标签: c stm32


【解决方案1】:

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

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

【讨论】:

  • 左侧是左侧传感器的传感器读数,右侧也是
  • @andrelamothe 这什么也解释不了,“传感器读数”是什么意思?在您的代码中,当外部触发信号发生时,它看起来只是 捕获的计时器值。这里的答案是假设相同的。
  • 最大距离呢?
【解决方案2】:

维度分析会有所帮助。我假设你的 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(十毫米=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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2012-01-19
    • 2014-08-28
    相关资源
    最近更新 更多