stm32/mcu/pwm-motor.md

PWM 与电机控制原理

知识库 · STM32 📅 初版 2026-09-15

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.5ms0°
1.5ms90°(中位)
2.5ms180°

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 实证小节待硬件到货后追加