STM32 HAL PID 示例

基于 CubeMX 生成工程的 HAL PID 教学模板,以及定时器、编码器和 PWM 的接入方法。

本页面是 PID 第一课配套的 STM32 HAL 教学模板。它与标准库版本采用相同的 PID 思路,但把 CubeMX 外设初始化和应用层控制逻辑分开,便于重新生成代码后继续维护。

文件说明

CubeMX 需要配置的外设

  • 一个基础定时器 htim_control:产生固定控制节拍;示例按 1 ms 中断、40 ms 控制更新理解;
  • 一个 PWM 定时器 htim_pwm:示例使用 TIM_CHANNEL_1,周期值需要配置为与输出范围匹配;
  • 一个编码器定时器 htim_encoder:配置为 Encoder Interface,读取位置计数并用相邻采样差得到速度反馈;
  • 两个电机方向 GPIO:示例使用 MOTOR_IN1_GPIO_Port/MOTOR_IN1_PinMOTOR_IN2_GPIO_Port/MOTOR_IN2_Pin,名称需要按工程实际替换。

main.c 中的调用位置

在 CubeMX 生成的 main.cUSER CODE BEGIN 2 区域调用:

ControlLoop_HAL_Init();

USER CODE BEGIN 3 区域反复调用:

ControlLoop_HAL_Run();

HAL_TIM_PeriodElapsedCallback() 只负责产生控制请求,不执行 ADC 阻塞读取、串口打印、显示刷新或复杂处理。实际项目也可以改成 DMA 采样完成后再触发控制,但采样和 PID 更新必须保持确定的时序。

控制链

CubeMX 定时器初始化
        │
        ├─ HAL_TIM_PeriodElapsedCallback() 产生控制请求
        │
        ├─ 编码器计数器 → 相邻采样差 → 速度反馈
        │
        ├─ PID_Controller_Update() → 控制输出
        │
        └─ GPIO 方向 + __HAL_TIM_SET_COMPARE() → 电机

重要边界

这个目录不是完整的 .ioc 工程,不能在不知道具体芯片、定时器、通道、GPIO 和电机驱动器的情况下保证直接编译。先在 CubeMX 中完成硬件配置,再把代码放入应用层或 USER CODE 区域。不要直接修改 CubeMX 自动生成的初始化函数。