1. 课程导入
欢迎进入《STM32机器人电机闭环:PWM、编码器反馈和PID调速》的第一章。在机器人运动控制中,让电机“转起来”只是起点,让电机“按预期精确地转”才是工程挑战的核心。开环控制下,电机转速会随负载、电压波动而漂移;而闭环控制则通过“测量-比较-修正”的循环,让系统具备自我纠偏能力。本章将为你建立闭环控制的全局视野,明确学习路径,并回答一个根本问题:为什么你的机器人必须从“开环”走向“闭环”。
1.1 为什么需要闭环控制:从开环的局限说起
开环控制是最简单的电机驱动方式:STM32 输出一个固定占空比的 PWM 信号,电机就以某个速度旋转。你不需要知道电机实际转多快,也不关心它是否受到干扰。这种模式在玩具车、风扇等场景中足够用,但一旦进入机器人领域,问题就暴露了。
假设你的机器人底盘使用两个直流电机,左侧电机负载较大(例如压在粗糙地面上),右侧电机空载。即使你给两个电机完全相同的 PWM 占空比,左侧电机的实际转速也会明显低于右侧。结果就是:机器人无法走直线,而是向左侧偏转。这就是开环控制的致命缺陷——它无法感知输出是否达到了预期。
更具体地说,开环系统存在以下问题:
- 负载扰动:机器人爬坡、碰撞障碍物或携带不同重量的负载时,电机转速会下降,但控制器毫不知情。
- 电源波动:电池电压随放电过程逐渐下降,同样的 PWM 占空比产生的电机端电压也会下降,导致转速漂移。
- 电机差异:即使是同一批次生产的电机,其内部摩擦、绕组电阻也存在微小差异,导致相同 PWM 下转速不一致。
- 无法精确调速:如果你需要电机精确地以 100 RPM 旋转,开环控制只能“大概”达到,误差可能高达 ±20%。
闭环控制的核心思想是:不断测量实际输出,与目标值比较,根据误差动态调整控制量。在电机控制中,这个“测量”由编码器完成,“调整”由 PID 算法完成。闭环系统能够自动补偿负载变化、电源波动和电机差异,让实际转速始终逼近目标转速。
1.2 核心概念:PWM、编码器与PID
在进入具体实现之前,我们需要建立三个核心概念的清晰认知。它们是整个闭环系统的三大支柱,缺一不可。
1.2.1 PWM(脉冲宽度调制)
PWM 是一种通过快速开关电源来模拟模拟电压的技术。STM32 的定时器可以产生频率固定、占空比可调的方波信号。占空比(Duty Cycle)定义为高电平时间与整个周期的比值,范围从 0% 到 100%。
对于直流电机而言,PWM 的平均电压决定了电机的平均电流,进而决定了电机的转矩和转速。例如,一个 12V 的电机,如果 PWM 占空比为 50%,其平均电压约为 6V,电机大约以半速旋转。PWM 的频率通常在 10kHz 到 50kHz 之间,频率太低会听到电机啸叫,频率太高则可能增加开关损耗。
在 STM32 中,PWM 生成通常使用高级定时器(如 TIM1、TIM8)或通用定时器(如 TIM2、TIM3)的 PWM 模式。你需要配置预分频器(PSC)、自动重载寄存器(ARR)和比较寄存器(CCR),其中 CCR/ARR 的比值就是占空比。
1.2.2 编码器反馈
编码器是闭环系统的“眼睛”。增量式编码器是最常用的类型,它输出两路相位差 90° 的方波信号(A 相和 B 相)。通过检测 A/B 相的边沿和相位关系,可以判断电机的旋转方向和转速。
STM32 的定时器可以工作在编码器模式,硬件自动对 A/B 相脉冲进行计数。每检测到一个完整的正交脉冲序列,计数器值就增加或减少 1。通过读取计数器值的变化量和采样周期,可以计算出电机的实际转速。
编码器的分辨率通常用“每转脉冲数”(PPR)表示。例如,一个 500 PPR 的编码器,配合 4 倍频技术(检测 A/B 相的所有边沿),每转可产生 2000 个计数脉冲。分辨率越高,速度测量越精确,但也会带来更高的中断频率和计算负担。
1.2.3 PID 控制器
PID(比例-积分-微分)控制器是闭环控制的核心算法。它根据目标值(期望转速)和测量值(实际转速)之间的误差,计算出控制量(PWM 占空比)。
PID 的三个环节各有分工:
- 比例(P):误差越大,修正力度越大。P 项直接响应当前误差,但过大的 P 会导致振荡。
- 积分(I):累积历史误差,消除稳态误差。I 项能解决“系统始终差一点达不到目标”的问题,但过大的 I 会导致超调。
- 微分(D):预测误差变化趋势,抑制振荡。D 项能提高系统稳定性,但对噪声敏感。
PID 的输出公式为:u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt。在数字系统中,我们使用离散化形式,以固定的采样周期(如 10ms)计算一次。
| 核心概念 | 作用 | STM32 实现方式 | 关键参数 |
|---|---|---|---|
| PWM | 控制电机平均电压 | 定时器 PWM 模式 | 频率、占空比(CCR/ARR) |
| 编码器 | 测量实际转速和方向 | 定时器编码器模式 | PPR、倍频系数、采样周期 |
| PID | 计算修正量 | 定时器中断 + 软件算法 | Kp、Ki、Kd、输出限幅 |
1.3 整体框架:从硬件到算法的完整链路
一个典型的 STM32 电机闭环控制系统,其硬件和软件架构可以分解为以下几个层次。理解这个框架,有助于你在后续章节中定位每个知识点。
1.3.1 硬件层
硬件层包括:STM32 微控制器(负责计算和控制)、电机驱动芯片(如 L298N、TB6612,负责放大 PWM 信号驱动电机)、直流电机(执行机构)、增量式编码器(反馈元件)以及电源系统。STM32 通过 GPIO 输出 PWM 信号给驱动芯片,驱动芯片将 PWM 信号转换为电机所需的电流和电压。编码器安装在电机轴上,将旋转运动转换为电信号反馈给 STM32 的定时器输入引脚。
1.3.2 软件层
软件层分为三个主要模块:
- PWM 生成模块:初始化定时器,配置 PWM 频率和初始占空比,提供设置占空比的接口函数。
- 编码器读取模块:初始化编码器模式,定期读取计数器值,计算转速(单位:RPM 或 rad/s)。
- PID 控制模块:在定时器中断服务函数中,读取目标转速和实际转速,计算误差,执行 PID 算法,更新 PWM 占空比。
整个控制循环的典型周期为 1ms 到 20ms。周期越短,控制越及时,但 CPU 负担也越大。对于大多数机器人应用,5ms 到 10ms 的周期已经足够。
1.3.3 数据流视角
从数据流的角度看,系统的工作流程如下:
目标转速(用户设定)
↓
误差计算:e(t) = 目标转速 - 实际转速
↓
PID 算法:u(t) = Kp*e(t) + Ki*∫e(t)dt + Kd*de(t)/dt
↓
PWM 占空比更新(限制在 0% ~ 100%)
↓
电机驱动 → 电机旋转
↓
编码器测量 → 实际转速(反馈)
↓
(回到误差计算,形成闭环)
这个循环不断重复,使得实际转速始终跟随目标转速。即使负载突然增加导致转速下降,编码器会立即检测到误差增大,PID 会相应增加 PWM 占空比,从而补偿负载扰动。
1.4 学习目标与课程路径
完成本章及后续章节的学习后,你将能够:
- 掌握 STM32 定时器的高级用法:包括 PWM 输出、编码器接口模式、输入捕获和中断优先级配置。
- 理解并实现增量式 PID 算法:能够手动整定 Kp、Ki、Kd 参数,并处理积分饱和、微分噪声等实际问题。
- 构建完整的电机闭环系统:从硬件接线到软件代码,能够独立完成一个可调速、抗扰动的电机控制系统。
- 具备调试和排障能力:能够使用串口、逻辑分析仪或示波器观察 PWM 波形、编码器脉冲和转速曲线,快速定位问题。
| 章节模块 | 核心内容 | 实践目标 |
|---|---|---|
| PWM 生成 | 定时器配置、占空比控制 | 用 STM32 输出可调 PWM 驱动电机 |
| 编码器读取 | 正交解码、转速计算 | 实时读取电机转速并显示 |
| PID 控制 | 算法原理、参数整定 | 实现转速闭环,抗负载扰动 |
| 系统集成 | 中断、滤波、限幅 | 完成一个完整的机器人电机控制模块 |
1.5 实战场景:为什么你的机器人需要闭环
让我们通过一个具体的场景来加深理解。假设你正在制作一个两轮差速驱动机器人,目标是让它以 0.5 m/s 的速度直线前进。
开环方案:你给两个电机相同的 PWM 占空比(例如 60%),然后祈祷它能走直线。但实际结果是:由于电机差异和地面摩擦不均,机器人会向右偏转。你尝试手动调整 PWM 值,但每次电池电压变化或地面材质改变,都需要重新调整。
闭环方案:你为每个电机安装编码器,并编写 PID 控制程序。设定目标转速为 200 RPM(对应 0.5 m/s)。当左侧电机因负载增大而转速下降到 180 RPM 时,编码器检测到误差为 -20 RPM,PID 控制器自动增加左侧 PWM 占空比,直到转速恢复到 200 RPM。整个过程在几十毫秒内完成,机器人始终保持直线行驶。
这个案例揭示了闭环控制的三个关键优势:自动补偿扰动、提高精度、减少人工干预。在后续章节中,我们将逐步实现这个系统。
1.6 常见误区与总结
初学者在学习电机闭环控制时,常犯以下错误,需要特别警惕:
- 误区一:PID 参数越大越好。实际上,过大的 Kp 会导致系统振荡,过大的 Ki 会导致超调,过大的 Kd 会放大噪声。参数整定需要循序渐进。
- 误区二:忽略 PWM 频率的影响。PWM 频率过低会导致电机转速波动明显,频率过高则可能超出驱动芯片的开关能力。一般选择 10kHz~20kHz。
- 误区三:编码器采样周期与 PID 周期混淆。编码器读数需要在一个固定的时间窗口内累计脉冲数,而 PID 计算周期应与此匹配。如果采样周期不固定,PID 的积分项和微分项都会失真。
- 误区四:没有输出限幅。PID 计算出的控制量可能超过 100% 占空比,必须进行限幅,否则 PWM 寄存器溢出会导致异常输出。
总结来说,本章为你建立了电机闭环控制的整体认知:为什么需要闭环(抗扰动)、用什么实现闭环(PWM+编码器+PID)、系统如何组织(硬件+软件+数据流)。接下来的章节将逐一深入每个技术细节,从 STM32 定时器配置开始,逐步构建一个完整的、可用的电机调速系统。