1. 课程导论与项目全景:PID控制概述、电机控制应用场景、项目整体架构与开发环境搭建
各位同学,欢迎来到《PID参数整定与电机控制项目集成调试实战》的第一章。
我是你们这门课的主讲。在嵌入式这一行摸爬滚打了十几年,从最早的8位单片机玩到现在的多核处理器,踩过的坑、烧过的板子,说实话,我自己都数不清了。但要说哪个知识点让我又爱又恨,那绝对是PID控制。
为什么?因为它看起来简单——就三个系数,一个公式。但真正要把一个电机调得又稳又准,没个几十次试错,你根本找不到感觉。我记得我第一次调一个直流有刷电机的位置环,P给大了,电机抖得像筛糠;I给大了,超调直接飞出去;D给大了,噪声放得比信号还大。那会儿真想砸电脑。
这门课,就是要把我这些年积累的“血泪经验”掰开揉碎了讲给你听。咱们不搞虚的,直接上项目,从原理到代码,从仿真到实物,一步步把PID整明白。
1.1 什么是PID控制?——说白了就是“纠偏”
PID控制,全称比例-积分-微分控制。你把它想象成一个纠偏器就行。
你设定一个目标值,比如让电机转到90度。系统当前实际角度是0度。PID控制器就开始干活:
- P(比例):看当前偏差有多大。偏差大,输出就大。这是主力,但容易过头。
- I(积分):看历史偏差累积了多少。专门对付系统静差,比如摩擦力导致的停不准。
- D(微分):预测偏差的变化趋势。提前刹车,抑制超调。
公式长这样:
u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
其中:
u(t):控制输出(比如PWM占空比)e(t):当前偏差(目标值 - 当前值)Kp:比例系数Ki:积分系数Kd:微分系数
核心理解:PID不是魔法,它只是一个根据误差计算修正量的算法。你给它正确的反馈,它给你正确的输出。反馈错了,一切白搭。
1.2 电机控制的应用场景——你每天都在用
电机控制无处不在。你想想看:
- 工业机器人:六轴机械臂,每个关节都是一个伺服电机,位置、速度、力矩三环控制。
- 无人机:四个无刷电机,通过PID控制转速差实现悬停、翻滚。
- 3D打印机:步进电机走直线,需要精确的位置控制,防止丢步。
- 智能家居:扫地机器人、电动窗帘、智能门锁,里面都有电机。
- 汽车电子:电子油门、电动助力转向、水泵油泵,全是电机。
我在项目中遇到过最典型的一个场景:给一家工厂做AGV小车的底盘驱动。两个直流电机,差速转向。刚开始用开环控制,结果地面稍微有点不平,小车就跑偏。后来上了PID闭环,用编码器测速做速度环,再叠加一个位置环做路径跟踪,效果立竿见影。
我的建议:学电机控制,先从直流有刷电机入手。它结构简单,模型清晰,是理解PID控制的最佳切入点。别一上来就搞无刷FOC,容易劝退。
1.3 项目整体架构——我们到底要做什么?
这门课的核心项目,是一个基于STM32的直流有刷电机位置/速度双闭环控制系统。我们会在一个实际的硬件平台上,从零开始搭建整个系统。
整体架构分为四层:
| 层级 | 组件 | 说明 |
|---|---|---|
| 应用层 | 上位机/串口指令 | 发送目标位置、速度,接收实时反馈 |
| 控制层 | PID控制器(位置环+速度环) | 核心算法,定时中断执行 |
| 驱动层 | PWM生成、编码器采集 | 硬件外设配置,信号调理 |
| 硬件层 | STM32、电机驱动板、直流电机、编码器 | 物理平台 |
下面这张图,就是我们整个项目的系统框架。你看一眼,心里就有数了。
注意:双环控制的顺序不能搞反。一定是外环(位置环)输出给内环(速度环)做给定。我曾经见过有人把速度环输出直接当位置环给定,结果系统直接发散。顺序错了,神仙也救不了。
1.4 开发环境搭建——工欲善其事,必先利其器
在开始写代码之前,先把环境搭好。我建议你按照下面的步骤来,一步都不要跳。
1.4.1 硬件清单
- 主控板:STM32F103C8T6(蓝板子)或STM32F407(如果你预算够)
- 电机驱动:L298N 或 TB6612(推荐TB6612,发热小)
- 直流电机:带霍尔编码器的直流减速电机(比如MG513P30_12V)
- 电源:12V/2A 直流电源(给电机供电),USB线(给板子供电)
- 调试工具:J-Link 或 ST-Link,示波器(非必须,但有最好)
1.4.2 软件工具链
| 工具 | 版本建议 | 用途 |
|---|---|---|
| Keil MDK | V5.38 或更新 | 代码编写、编译、调试 |
| STM32CubeMX | V6.10 或更新 | 硬件初始化代码生成 |
| 串口助手 | SSCOM 或 Putty | 与板子通信,查看数据 |
| Git | 最新版 | 版本管理,方便回退 |
1.4.3 搭建步骤
- 安装Keil MDK:一路默认,记得勾选ARM Compiler V6。
- 安装STM32CubeMX:需要Java环境,提前装好JDK 11+。
- 安装驱动:ST-Link驱动、CH340串口驱动(如果你的板子用CH340)。
- 创建工程:用CubeMX选好芯片型号,配置时钟(72MHz)、定时器(PWM输出)、编码器接口(TIM编码器模式)、串口(USART1)。
- 生成代码:在CubeMX里点“Generate Code”,选择Keil MDK作为IDE。
- 编译验证:打开生成的Keil工程,点编译,0 Error 0 Warning才算通过。
一个小技巧:CubeMX生成的代码里,HAL库的初始化函数都在 MX_XXX_Init() 里。你写自己的代码时,不要改这些初始化函数,而是在 main() 的 while(1) 之前加你自己的初始化逻辑。这样以后用CubeMX重新生成代码时,你的代码不会被覆盖。