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、电机驱动板、直流电机、编码器 物理平台

下面这张图,就是我们整个项目的系统框架。你看一眼,心里就有数了。

项目系统框架图 上位机 / 串口指令 位置环 PID 速度环 PID PWM 生成 直流电机 + 编码器 速度反馈 位置反馈 说明:位置环输出作为速度环的给定,速度环输出控制PWM,编码器提供双环反馈

注意:双环控制的顺序不能搞反。一定是外环(位置环)输出给内环(速度环)做给定。我曾经见过有人把速度环输出直接当位置环给定,结果系统直接发散。顺序错了,神仙也救不了。

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 搭建步骤

  1. 安装Keil MDK:一路默认,记得勾选ARM Compiler V6。
  2. 安装STM32CubeMX:需要Java环境,提前装好JDK 11+。
  3. 安装驱动:ST-Link驱动、CH340串口驱动(如果你的板子用CH340)。
  4. 创建工程:用CubeMX选好芯片型号,配置时钟(72MHz)、定时器(PWM输出)、编码器接口(TIM编码器模式)、串口(USART1)。
  5. 生成代码:在CubeMX里点“Generate Code”,选择Keil MDK作为IDE。
  6. 编译验证:打开生成的Keil工程,点编译,0 Error 0 Warning才算通过。

一个小技巧:CubeMX生成的代码里,HAL库的初始化函数都在 MX_XXX_Init() 里。你写自己的代码时,不要改这些初始化函数,而是在 main() 的 while(1) 之前加你自己的初始化逻辑。这样以后用CubeMX重新生成代码时,你的代码不会被覆盖。