STM32 HAL PID 示例
基于 CubeMX 生成工程的 HAL PID 教学模板,以及定时器、编码器和 PWM 的接入方法。
本页面是 PID 第一课配套的 STM32 HAL 教学模板。它与标准库版本采用相同的 PID 思路,但把 CubeMX 外设初始化和应用层控制逻辑分开,便于重新生成代码后继续维护。
文件说明
- pid_controller.h:PID 控制器结构体和函数声明;
- pid_controller.c:带显式采样周期、积分限幅、条件积分和测量值微分的 PID 核心;
- control_loop_hal.h:HAL 控制循环接口声明;
- control_loop_hal.c:展示定时器回调、编码器反馈、方向 GPIO 和 PWM 输出。
CubeMX 需要配置的外设
- 一个基础定时器
htim_control:产生固定控制节拍;示例按1 ms中断、40 ms控制更新理解; - 一个 PWM 定时器
htim_pwm:示例使用TIM_CHANNEL_1,周期值需要配置为与输出范围匹配; - 一个编码器定时器
htim_encoder:配置为 Encoder Interface,读取位置计数并用相邻采样差得到速度反馈; - 两个电机方向 GPIO:示例使用
MOTOR_IN1_GPIO_Port/MOTOR_IN1_Pin和MOTOR_IN2_GPIO_Port/MOTOR_IN2_Pin,名称需要按工程实际替换。
main.c 中的调用位置
在 CubeMX 生成的 main.c 的 USER 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 自动生成的初始化函数。