news 2026/9/30 7:23:53

【STM32踩坑日记】电机速度闭环与 PID 控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【STM32踩坑日记】电机速度闭环与 PID 控制

一、电机速度闭环整体流程

电机通过编码器测速获得实际转速,与设定的目标转速进行比较,通过 PID 计算控制电压,再转换成 PWM 驱动电机。

目标转速 Ω* ↓ PID控制 ↓ 目标电压 Ua ↓ Ua / Vbat → PWM占空比 ↓ 电机 ↓ 编码器 ↓ 实际转速 Ω └────反馈

二、App_Motor.c

1. PID初始化

左右电机分别使用一个 PID:

PID_Init(&pid_motor_l,0.5,7,0);PID_Init(&pid_motor_r,0.5,7,0);

参数:

Kp = 0.5 Ki = 7 Kd = 0

由于Kd = 0,所以实际是PI控制器。

同时限制输出:

PID_LimitConfig(&pid_motor_l,+8.4f,-8.4f);

即控制电压范围:

−8.4V∼+8.4V-8.4V \sim +8.4V−8.4V∼+8.4V

2. 电机速度控制

App_Motor_Proc()每1ms执行一次:

① 编码器获取实际转速 ② PID计算控制电压 Ua ③ 根据电池电压计算PWM占空比 ④ 输出PWM

PWM计算:

Duty=UaVbat×100%Duty=\frac{U_a}{V_{bat}}\times100\%Duty=Vbat​Ua​​×100%

这样可以根据当前电池电压调整占空比。

3. 设置目标转速

App_Motor_SetOmega_L(Omega);App_Motor_SetOmega_R(Omega);

本质上就是修改 PID 的:

SP = 目标转速

4. 电机开关

App_Motor_Cmd(On);

除了控制 PWM,还会:

PID_Reset()

清除 PID 的历史误差、积分和时间状态,避免重新启动时继承之前的 PID 状态。


三、pid_simple.c

1. PID基本计算

首先计算误差:

e=SP−FBe=SP-FBe=SP−FB

其中:

  • SP:目标值
  • FB:实际反馈值

然后计算 P、I、D 三部分:

P=KpeP=K_p eP=Kp​e

I=Ki∫e dtI=K_i\int e\,dtI=Ki​∫edt

D=KddedtD=K_d\frac{de}{dt}D=Kd​dtde​

最后:

CO=P+I+DCO=P+I+DCO=P+I+D

在本项目中:

Kd=0K_d=0Kd​=0

所以实际使用:

CO=Kpe+Ki∫e dtCO=K_pe+K_i\int e\,dtCO=Kp​e+Ki​∫edt

即PI控制。


2. 离散算法实现

程序运行在 STM32 上,需要每次采样时计算一次,所以使用离散形式。

时间间隔:

deltaT=(t_k-t_k_1)*1e-6f;

积分采用梯形积分:

Ik=Ik−1+ek+ek−12ΔtI_k=I_{k-1}+\frac{e_k+e_{k-1}}{2}\Delta tIk​=Ik−1​+2ek​+ek−1​​Δt

微分:

Dk=ek−ek−1ΔtD_k=\frac{e_k-e_{k-1}}{\Delta t}Dk​=Δtek​−ek−1​​

因此 PID 每次计算都需要保存:

上一次时间 上一次误差 上一次积分值

3. 限幅

PID 输出进行限幅:

if(CO>UpperLimit)CO=UpperLimit;if(CO<LowerLimit)CO=LowerLimit;

防止输出超过电机允许范围。

同时对积分值进行限制,避免积分不断累积造成积分饱和。


四、两个文件的关系

App_Motor.c │ ├── 编码器 → 获取实际转速 │ ├── PID → 计算 Ua │ ├── 电池 → 获取 Vbat │ └── PWM → 驱动电机

其中:

App_Motor.c负责整个电机速度控制流程,pid_simple.c负责具体的 PID 算法。

最终记住这一条就够了:

目标转速 ↓ 速度误差 ↓ PI计算 ↓ Ua ↓ Ua / Vbat ↓ PWM ↓ 电机 ↓ 编码器测速 ↓ 反馈
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 7:21:55

文档站信息架构设计:让核心事实稳定出现在页面中

很多文档站在内容不断增加后&#xff0c;会出现一个典型问题&#xff1a;页面数量越来越多&#xff0c;但用户和解析工具却越来越难找到基础信息。原因通常不在于内容太少&#xff0c;而在于内容被分散在导航、弹窗、图片、异步接口和多层跳转中。重要信息没有固定位置&#xf…

作者头像 李华
网站建设 2026/9/30 7:20:15

8.4 电商运营

《提示词竞争力&#xff1a;与大模型高效对话》章节分享~~持续更新-CSDN博客 开一家网店&#xff0c;最难的阶段不是铺货&#xff0c;而是让店铺在一堆同类产品中被看见。标题决定流量能不能进来&#xff0c;详情页决定用户进来后能不能留住&#xff0c;差评决定信任感会不会垮…

作者头像 李华
网站建设 2026/9/30 7:19:13

FileX 文件秘书:本地电脑文件管理小工具,简单实用

软件下载&#xff1a;FileX 文件秘书 电脑用久了&#xff0c;磁盘里文件越堆越多。想找一个文件名含特定字符的文档&#xff0c;系统自带搜索要等很久&#xff1b;想看看 C 盘哪些大文件占了空间&#xff0c;手动一层层文件夹点开非常麻烦&#xff1b;找到一批文件之后&#x…

作者头像 李华
网站建设 2026/9/30 7:18:36

盈兴通:无尘纸材质怎么选?看这4类就够

无尘纸并非普通纸巾&#xff0c;而是采用气流成网技术制成的干法非织造布&#xff0c;核心要求是低发尘、低离子残留、防静电、高吸液。 目前主流材质分为以下几类&#xff1a; 1. 全木浆无尘纸&#xff08;低尘擦拭纸&#xff09; 成分&#xff1a;100%原生木浆 特点&…

作者头像 李华