当前位置: 首页 > news >正文

第 5 篇:让轮子真正转起来——PWM、编码器与 PID 闭环

第 5 篇:让轮子真正转起来——PWM、编码器与 PID 闭环

回顾全套小车工厂模型:

第1篇看懂main入口、头文件工具箱、开机初始化、while(1)主线流水线;
第2篇掌握变量储物盒、嵌入式专用定宽数据类型;
第3篇学会分支循环控制流、函数模块化、枚举状态机;
第4篇搞懂中断定时闹钟、volatile关键字、中断标准三步写法;
本篇进入车间动力核心,讲透小车能动的整套关键技术:PWM电子油门、编码器测速码表、PID速度闭环、陀螺仪角度纠偏。前面所有铺垫全部落地,本篇真正让小车稳、直、准地跑起来。


0. 引子:小车乱跑的根本原因

只写好程序框架、逻辑、中断,小车依然跑不稳。

如果直接给电机固定电压,你会遇到两个必现问题:

1.四轮转速不一样:电机出厂存在个体差异、地面摩擦力不均,同样电压下四轮速度参差不齐,小车必然跑偏;

2.速度无法稳定:电池电压下降、行驶阻力变化时,车速会自主波动,完全不受程序控制。

想让小车可控、直行、不漂移,必须配齐整套动力三件套:

( 1 )PWM:调节电机动力大小(油门)

( 2 )编码器:读取车轮真实转速(测速眼睛)

( 3 )PID闭环:自动微调油门,稳住速度、修正偏差(智能大脑)


1. PWM:电机的无级电子油门

1.1 什么是PWM(大白话讲解)

单片机无法像电源一样直接无级调节输出电压,它采用高频快速通断电的方式,依靠“通电时长占比”模拟出平均电压,以此控制电机转速。

通俗比喻:就像快速反复开关手电筒,开得久、关得短,光线就亮;开得短、关得久,光线就暗。只要开关频率足够高,人眼和电机都感知不到卡顿,运转效果和恒定调压完全一致,转速顺滑无抖动。

核心概念:占空比

占空比 = 高电平通电时长 / 一个完整PWM周期时长

占空比越大 → 电机平均供电电压越高 → 转速越快;反之则转速越慢。

1.2 项目硬件配置(TIM1高级定时器)

本项目使用TIM1 高级定时器输出4路独立PWM波形,分别对应控制四个麦轮电机,硬件自动输出波形,无需CPU持续干预,效率极高:

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;// 复用PWM输出模式TIM_TimeBaseInitStructure.TIM_Period=1000-1;// PWM计数最大值,区间0~999TIM_TimeBaseInitStructure.TIM_Prescaler=72-1;// 72MHz时钟分频TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;// 选择PWM模式1TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;TIM_CtrlPWMOutputs(TIM1,ENABLE);// 高级定时器必须开启总输出

最终输出PWM频率为1KHz,无高频噪音,电机运行平稳顺滑。

1.3 调节车速的本质:修改PWM比较值

代码中通过修改比较值,精准调节每一路电机的动力输出:

voidTIM1_SetCH1(uint16_tpwm){TIM_SetCompare1(TIM1,pwm);}

数值有效范围0~999

- 0:占空比为0,电机完全停转;

- 999:满占空比,电机全速运行。

1.4 正负速度,控制电机正反转

重点区分:PWM只控制转速大小,不控制转向

小车通过额外的GPIO高低电平区分电机转向:

- 速度数值为正 → 正转引脚拉高,电机正转;

- 速度数值为负 → 反转引脚拉高,电机反转。

这也呼应了第二篇的知识点:车轮速度变量必须用int16_t(支持正负数值),如果使用无符号的uint16_t,无法区分正负转速,小车彻底无法后退,运动逻辑完全错乱。

1.5 纯开环控制的致命缺陷

仅固定输出PWM数值,属于开环控制。这种模式下,哪怕四路PWM数值完全一致,受电机公差、地面摩擦、电池电压波动影响,四个车轮实际转速必然不同,小车行驶一定会跑偏、漂移,无法稳定直行。

想要解决跑偏问题,必须实时获取车轮真实转速,编码器正式登场


2. 编码器:车轮的高精度测速码表

2.1 编码器通俗原理

麦轮内置正交编码器,车轮每转动极小角度,编码器就会输出一组A、B两相脉冲信号。

核心逻辑:

- 车轮转得越快,单位时间内脉冲数量越多;

- 车轮转得越慢,单位时间内脉冲数量越少;

- A、B两相相位差,可精准判断电机正转、反转。

STM32定时器支持硬件正交解码,无需CPU手动计数,硬件自动统计脉冲数量,测速精准、不占用系统资源。

项目硬件分配:TIM2/TIM3/TIM4/TIM5 四个定时器,分别独立采集四个车轮的编码器数据。

2.2 5ms定时采集测速标准逻辑

我们沿用第四篇的TIM7 5ms定时中断,固定周期读取四轮转速,保证测速时序统一、精度一致:

Speed1=Encoder1_Get();Speed2=Encoder2_Get();Speed3=Encoder3_Get();Speed4=Encoder4_Get();

单次测速函数逻辑简单高效,读完即刻清零计数器,避免脉冲累积误差:

int16_tEncoder1_Get(void){int16_tTemp=TIM_GetCounter(TIM2);// 读取5ms内累计脉冲数TIM_SetCounter(TIM2,0);// 读取后立即清零计数器returnTemp;// 返回脉冲增量,代表实时车速}

每5ms的脉冲增量,直接对应车轮的实时转速,正负数值对应正反转。

2.3 为什么车速变量必须加 volatile

Speed1~Speed4 属于典型的中断、主线共享变量

- 中断服务函数:负责实时修改转速数据;

- 主循环:负责读取数据、PID运算、屏幕显示。

如果不加volatile修饰,编译器会开启变量缓存优化,主线会一直读取旧的缓存数据,出现屏幕车速卡死、速度反馈失效、PID不调节等隐形bug。


3. PID闭环控制:小车稳定行驶的核心算法

3.1 开环 vs 闭环,一秒看懂差距

-开环控制:只固定输出PWM油门,不管车轮实际转速,被动接受行驶状态,车速波动大、极易跑偏;

-闭环控制:设定目标车速,编码器反馈真实车速,PID算法自动增减PWM油门,强行让实际转速贴合目标转速。

通俗比喻:就像汽车定速巡航,上坡自动加大油门补动力,下坡自动减小油门防超速,全程稳住设定速度。

3.2 P、I、D三项通俗白话解读

不用复杂公式,零基础也能看懂核心作用:

-P(比例项):快速纠偏:目标速度与实际速度差值越大,调节力度越强,快速缩小转速偏差,解决大范围速度误差;

-I(积分项):消除稳态误差:P只能修正大偏差,长期存在的微小转速差无法消除,I会累积微小误差、逐步补齐,让小车匀速行驶更稳、轨迹更直;

-D(微分项):防抖防震荡:预判速度变化趋势,提前收力,避免转速忽快忽慢、车身抖动。

3.3 项目实用方案:增量式PI控制

小车编码器采集的脉冲存在轻微噪声,开启D微分项容易放大噪声,导致电机异响、车身抖动。因此本项目采用工程最优方案:舍弃D项,使用PI控制,兼顾稳定性与精准度。

采用增量式算法,每次仅在上一次输出基础上微调,转速变化顺滑无突变:

floaterror=tgt-(float)real;s->pid_output+=Kp*(error-s->last_err)+Ki*error;// 限制PWM输出区间,防止过载、炸机if(s->pid_output>PWM_MAX)s->pid_output=PWM_MAX;if(s->pid_output<PWM_MIN)s->pid_output=PWM_MIN;

3.4 四轮独立PID控制

项目为四个车轮配置了独立PID控制器,互不干扰、单独修正。精准解决电机个体差异,让四个车轮转速高度统一,从根源减少行驶跑偏。

3.5 模式切换必须重置PID

小车切换前进、平移、旋转等运动模式时,必须调用PID重置函数,清空积分累积值。如果不重置,上一种模式残留的积分输出会叠加到新模式上,导致小车起步抖动、瞬间窜动,影响行驶稳定性。


4. 陀螺仪角度闭环:彻底解决直行跑偏

仅靠四轮速度PID,只能保证四个车轮转速一致,但地面打滑、机械装配误差、单侧阻力变化,依然会让车头慢慢偏移,小车越跑越偏。想要真正跑直线,必须增加角度闭环

4.1 MPU6050航向角采集

依托TIM7定时中断,固定周期读取MPU6050陀螺仪原始角速度,通过积分运算换算出小车车头航向角yaw,实时掌握车头朝向。

4.2 差速纠偏原理(类比开车)

和手动开车修正方向逻辑完全一致:

- 车头向左偏移 → 右侧车轮加速、左侧车轮减速,微调回正;

- 车头向右偏移 → 左侧车轮加速、右侧车轮减速,微调回正。

通过左右轮差速微调,自动修正车头角度,保证直行轨迹笔直。

4.3 自动基准归零,解决陀螺仪漂移

陀螺仪长期积分会产生数值漂移,导致轻微跑偏。项目设置自动校准逻辑:小车无大幅度角度偏移时,每隔1秒自动刷新航向基准零点,抵消漂移误差,长期行驶依然稳定。


5. 本篇小结

知识点通俗理解
PWM电机电子油门,通过占空比精准控制动力大小
编码器车轮测速码表,脉冲数量、正负对应车速与转向
开环控制固定油门无反馈,车速不稳、极易跑偏
PID速度闭环智能定速巡航,自动微调油门,稳住四轮转速一致
P比例项快速修正大范围速度偏差
I积分项消除微小稳态误差,让匀速行驶更笔直
增量式PI渐进式微调输出,小车行驶丝滑无抖动
角度闭环陀螺仪实时纠偏,彻底解决直行跑偏问题
PID重置切换运动模式清空积分,防止起步抖动窜动

6. 第4篇趣味思考标准答案

思考1:Timer7_5ms_Count不加 volatile 会出现哪些故障?

该变量是整车唯一统一时间基准,几乎所有定时功能都依赖它,失效后果极其严重:

1. 遥控超时断连保护失效,遥控器失联后小车不会自动刹车,存在失控风险;

2. OLED屏幕定时刷新逻辑卡死,画面长期静止不更新;

3. 软件延时、周期定时任务全部失效,整车时序逻辑瘫痪。

思考2:中断漏清标志、不判断标志分别会怎样?

1.漏清中断标志:硬件会持续触发中断请求,主线程序彻底卡死,小车完全失控;

2.不判断标志:多中断源场景下,会误触发无关逻辑,导致数据错乱、功能异常。


本篇趣味思考(答案见第 6 篇末尾)

1. 如果去掉PID积分项(Ki),小车匀速直行会出现什么问题?

2. 编码器A、B两相接线颠倒,对车速显示和PID控制会造成什么影响?


7. 交流

我目前也是嵌入式自学新手,本篇内容是结合自己麦轮小车项目实操总结而来,部分知识点理解可能存在偏差,讲解也有不够严谨的地方。

1. 技术大佬如果发现文中存在错误、逻辑漏洞,欢迎评论区指正,我会及时修正文章;

2. 零基础小白有看不懂的知识点、实操踩坑问题,都可以留言提问,我看到会逐条回复;

3. 大家也可以分享自己做智能小车的经验、代码优化思路,一起交流学习,共同进步!

祝愿各位大佬项目开发一路顺畅,调试零bug,思路源源不断;

祝愿所有入门小白少踩弯路,快速吃透STM32,早日做出属于自己的智能小车!


下篇预告

《第 6 篇:无线遥控与通信协议——NRF24L01 怎么把按键变成小车指令》

讲解NRF无线收发机制、遥控按键解析、一问一答通信帧,彻底打通「遥控器按键 → 小车运动」完整链路。

http://www.jsqmd.com/news/1233071/

相关文章:

  • 深入解析ePWM事件触发与数字比较:硬件级实时控制的关键技术
  • Adobe Animate停运:动画制作工具的技术遗产与替代方案
  • 沧州市青县2026最新黄金回收门店及联系方式指南 黄金回收白银回收铂金回收店铺TOP5排行榜 - 大熊猫898989
  • 智能代码Agent:自动修复API变更引发的兼容性问题
  • 昇腾Ascend C异步Iterate接口:AIC与AIV通信性能优化实战
  • 高德问店AI选址:数据智能驱动实体商业决策创新
  • Java 稀疏数组实现(二维数组 ↔ 稀疏数组 互转)
  • 2026年物流公司推荐榜:高效智慧物流/冷链专线/整车零担/跨境货运头部企业实力优选 - 甄选服务推荐
  • 深度学习GPU推理优化:调度策略与性能调优实战
  • 微电网优化运行:可再生能源与储能的不确定性挑战
  • 深入解析CPSW中断与DMA寄存器:嵌入式网络驱动性能优化实战
  • 基于Java的“番茄TV”视频点播系统的设计
  • ARM AINTC中断控制器:嵌入式实时系统的核心机制与实战配置
  • 图片转视频工具:原理、实现与优化指南
  • AI赋能:提升效率与落地的关键路径
  • C++多线程高性能金融系统架构:从零构建微秒级行情处理引擎
  • Linux进程与线程的核心区别及多线程编程实践
  • STC单片机驱动16X16 LED点阵的硬件设计与软件实现
  • 2026 年新发布:文县专业的高铁施工巡检车供应商哪家好,揭秘:这辆车如何让高铁安全率飙升10% - 实业推荐官【官方】
  • Spring EL表达式:动态配置与业务逻辑的终极解决方案
  • Pinia 实战:模块化架构设计、统一调度与持久化方案全解
  • 504网关超时错误解析与解决方案
  • 2026年跨行业转行面试没经验?AI三步挖掘可迁移能力,让面试官觉得「你是对的人」
  • Ubuntu 20.04搭建vsftpd服务器完整指南
  • 瑞德克斯平台:产品理解成本的标准分析
  • IE终结与现代浏览器技术演进及迁移策略
  • AI技术革命催生的22个新兴职业与能力矩阵
  • MLCC技术解析:从基础原理到AI与车规应用
  • U盘系统盘制作与恢复全指南
  • C++网店购物管理系统实战:面向对象设计、STL应用与数据持久化