# 低速时霍尔测速未更新导致PID读到旧值

> 原文链接：https://robotics.hellobike.com/pitfalls/2017-07-28-robotics-se-12847
> 频道：pitfalls | 更新日期：2017-07-28 | 标签：auto, stackexchange, motor, pid, wheeled-robot
> 核心摘要：低速或停转时霍尔脉冲间隔过长导致频率值滞后，通过1ms定时超时将速度置零。

# 低速时霍尔测速未更新导致PID读到旧值

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[Handling PID DC motor control at low speeds](https://robotics.stackexchange.com/questions/12847/handling-pid-dc-motor-control-at-low-speeds)（Robotics Stack Exchange #12847）

**状态**：已解决

## 问题

4轮车后轮用PID控制直流电机，霍尔传感器每转2个脉冲；低速时PID以50Hz运行但捕获比较未更新，可能在电机停转后仍返回上次频率。

## 环境

STM32 Cortex-M3；霍尔传感器；PID 50Hz；100%占空比240Hz，低速约14.33Hz。

## 解决办法

1. 配置STM32每1ms触发一次`systick`中断，在该ISR中将全局超时变量递减到0。
2. 在霍尔脉冲捕获比较ISR中，将同一全局变量设置为超时值，例如`100`。
3. 查询霍尔频率时先检查该变量；若为0则返回0，否则返回上次测得频率。
4. 原文中最慢检测周期约73.2ms，使用100ms超时作为缓冲。

原问题作者：Dibly；采纳答案作者：Dibly。原内容依 CC BY-SA 4.0 授权，本页摘要同样依 CC BY-SA 4.0 授权。
:::

## 原始参考来源 (Sources)

- [Robotics Stack Exchange #12847：Handling PID DC motor control at low speeds](https://robotics.stackexchange.com/questions/12847/handling-pid-dc-motor-control-at-low-speeds)