计算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 ?
我仍然不明白 left
和 rigth
在您的代码中代表什么,但这是我实现它的方式:
- 在捕获模式下将计时器配置为 5 us 刻度(或其他一些值)。不要启动它。启用捕获和更新(溢出)事件中断。
- 当您想进行测量时,重置定时器计数器并启动定时器并触发信号传输(如果有多个传感器,同时启动所有传感器)
- 等待捕获事件中断。这对于多个通道(对于多个传感器)应该是一样的。
- 对于每个捕获中断,获取对应的CCR寄存器值为
capture[n]
。
- 让定时器运行。最终会触发更新(溢出)中断。
- 在更新(溢出)中断中,寻找你没有得到捕获中断的通道。你没有得到中断的那些超出了范围。在更新中断中停止定时器。
- 对于每个捕获的通道,
distance = (capture[n] * 5) * 10^-6 * 340
以米为单位。
量纲分析会有所帮助。我假设你的 5us/tick 刻度是正确的——我没有检查。你应该很容易就能弄清楚这一点。提示:计算按下按钮和释放按钮之间的滴答声,然后按住按钮一秒钟:)
left
和 right
是单向距离的计时器滴答单位 - 你
如果它们是前向+反射距离,则必须将这些值除以 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。
假设我有一个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 ?
我仍然不明白 left
和 rigth
在您的代码中代表什么,但这是我实现它的方式:
- 在捕获模式下将计时器配置为 5 us 刻度(或其他一些值)。不要启动它。启用捕获和更新(溢出)事件中断。
- 当您想进行测量时,重置定时器计数器并启动定时器并触发信号传输(如果有多个传感器,同时启动所有传感器)
- 等待捕获事件中断。这对于多个通道(对于多个传感器)应该是一样的。
- 对于每个捕获中断,获取对应的CCR寄存器值为
capture[n]
。 - 让定时器运行。最终会触发更新(溢出)中断。
- 在更新(溢出)中断中,寻找你没有得到捕获中断的通道。你没有得到中断的那些超出了范围。在更新中断中停止定时器。
- 对于每个捕获的通道,
distance = (capture[n] * 5) * 10^-6 * 340
以米为单位。
量纲分析会有所帮助。我假设你的 5us/tick 刻度是正确的——我没有检查。你应该很容易就能弄清楚这一点。提示:计算按下按钮和释放按钮之间的滴答声,然后按住按钮一秒钟:)
left
和right
是单向距离的计时器滴答单位 - 你 如果它们是前向+反射距离,则必须将这些值除以 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。