stm32/mcu/pwm-motor.md
PWM 与电机控制原理
PWM 与电机控制原理
✅ 舵机实证已补:SG90 上板跑通,见 同一只舵机的两代驱动:延时法 vs 定时器 PWM(2026-09-17 实测:三点标定、容限上限 2500µs 静默拒收、单帧断粮、TIM2 重映射送回 PA15)。本页仍为原理梳理,套件 demo38_SERVO 的自测小节待补。姊妹篇:定时器与中断:从 1 秒心跳到五阶段状态机——本文所有 PWM 都建立在定时器之上。
#一、元信息
| 字段 | 值 |
|---|---|
| 主题 | PWM 输出与电机控制(直流 / 舵机 / 步进 / 三相) |
| 内容性质 | 📘 理论篇(原理先行,实证待补) |
| 验证状态 | ❌ 未验证(理论梳理,舵机实证待硬件到货后追加) |
| 硬件关联 | 洋桃 1 号开发板(STM32F103C8T6,72MHz);套件 demo38_SERVO 待实证 |
| 核心机制 | 定时器 PWM:CNT 自增计数 + ARR 定周期 + CCR 定占空比,CPU 只写 CCR,波形硬件自动生成 |
#二、PWM 硬件逻辑:CNT / ARR / CCR
PWM 输出只涉及三个角色:
- CNT:自增计数器,从 0 数到 ARR 后回 0,循环往复;
- ARR:自动重装载值,决定周期(数多少个数算一圈);
- CCR:比较值,决定翻转点——CNT < CCR 输出高电平,CNT ≥ CCR 输出低电平。
txtCNT(计数器) 0 ──── 1 ──── … ──── CCR ──── … ──── ARR ──┐
▲ │
└──────────── 计满回 0,重新数 ↺─────────┘
OUT(输出引脚)┌─────── 高电平 ──────┬─────── 低电平 ─────┐
│ CNT < CCR │ CNT ≥ CCR │
└─────────────────────┴────────────────────┘
◄─────── 一个 PWM 周期 = ARR + 1 个计数 ──────►
频率 f = 72MHz ÷ ((PSC + 1) × (ARR + 1))
占空比 D = CCR ÷ (ARR + 1)
最关键的一点:CPU 只写 CCR 一个寄存器,波形由硬件自动生成。主循环再忙、中断再多,波形一个沿都不会抖——"数时间、翻电平"这种专业活交给硬件,这正是定时器的价值。
#三、直流电机:占空比就是油门
- 占空比 = 平均电压 ≈ 转速:PWM 高电平时电机通电、低电平断电,绕组电感把电流"抹平",等效平均电压 = 电源电压 × 占空比。CCR 调大 → 占空比变大 → 转速升高。
- 单片机引脚带不动电机:GPIO 只能输出几~几十 mA,电机动辄几百 mA 到几 A,必须经驱动芯片(L298N / MOS 管放大电路)中转。
- H 桥换向:IN1 / IN2 两个方向脚决定电流流向——IN1=1、IN2=0 正转,IN1=0、IN2=1 反转;PWM 接在使能脚(EN)上做调速。
- 调速只需一行:
cTIM_SetCompare1(TIM2, 新CCR); /* CCR 变大 → 占空比变大 → 电机加速 */
#四、舵机:50Hz 与 0.5~2.5ms 脉宽(待实证)
舵机看的是周期 20ms(50Hz)的 PWM 里高电平脉宽:
| 脉宽 | 角度 |
|---|---|
| 0.5ms | 0° |
| 1.5ms | 90°(中位) |
| 2.5ms | 180° |
72MHz 下常用配置(理论示例):PSC = 71(计数频率 1MHz,1 个计数 = 1µs),ARR = 19999(20ms 周期);则 CCR = 500 / 1500 / 2500 对应 0° / 90° / 180°——改 CCR 就是"掰"角度。
⚠️ 套件 demo38_SERVO 待实证:实测角度与脉宽的对应关系、驱动代码与波形截图,待硬件到货后在本节追加。
#五、步进电机:脉冲频率就是转速
- 步进电机不看占空比、看脉冲:脉冲频率 = 转速(拍数固定时),脉冲个数 = 转过的角度;
- 定时器中断发节拍:每进一次中断翻一拍相序表(四相八拍等),节拍越密转得越快——和本站定时器与中断里的状态机是同一套写法;
- 加减速 = 改 ARR:启动时 ARR 大(节拍慢),逐渐减小 ARR 提速,停车前再反向放大——软件上就是每隔 N 步调整一次 ARR / 预分频。
#六、三相电机:互补 PWM 与死区
- 无人机 / 电调的三相电机需要三路相位错开的 PWM:高级定时器 TIM1 / TIM8 一次输出三对互补通道(CH1/CH1N、CH2/CH2N、CH3/CH3N),配合换相逻辑驱动三个桥臂;
- 硬件死区(DTG):同一桥臂的上下管绝不能同时导通(直通 = 电源对地短路)。高级定时器能在互补对之间自动插入死区时间,一个寄存器配置搞定,比软件延时插空可靠得多。
#七、闭环:编码器 + PID,进出都是定时器
- 开环的弱点:负载一重,直流电机转速往下掉、步进电机失步——PWM 给得再准也架不住"看不见实际效果";
- 闭环链路:编码器 → 定时器输入捕获 / 编码器模式测出实际转速 → PID 运算 → 修正 CCR;
- 测速的"进"、调速的"出",两端都是定时器——进出都是定时器。
#八、结论:电机控制 ≈ 定时器应用
电机的转速(直流)、角度(舵机 / 步进)、力矩(电流环)本质都是"电平时间"的函数;而定时器正是芯片里管电平时间的专业户——PWM 输出、输入捕获、编码器接口、互补死区,全是它的技能。所以:电机控制 ≈ 定时器应用。定时器的中断玩法见姊妹篇定时器与中断,学好定时器,电机控制就只剩应用层的组合题。
#九、参考库/链接
- STM32F103 参考手册(RM0008):TIM 定时器章节(PWM 模式、互补输出与死区 DTG、编码器接口模式)
- 洋桃1号官方例程:
demo38_SERVO(舵机,待实证) - L298N 数据手册(H 桥驱动 / 使能脚 PWM 调速)
#十、相关阅读
#11、更新日志
📝共 1 条记录
| 日期 | 类型 | 更新内容 |
|---|---|---|
| 2026-09-15 | 新增 | 首次建档(理论篇);38_SERVO 实证小节待硬件到货后追加 |