电机驱动开发学习17. FOC速度外环闭环控制

电机驱动开发学习17. FOC速度外环闭环控制

  • [一、FOC 速度外环是什么](#一、FOC 速度外环是什么)
    • [1.1 为什么速度环比电流环慢?](#1.1 为什么速度环比电流环慢?)
    • [1.4 速度环为什么不能只靠 PI「自己适配」?](#1.4 速度环为什么不能只靠 PI「自己适配」?)
    • [1.2 两种运行模式](#1.2 两种运行模式)
    • [1.3 本章硬件限制(继承 lesson16)](#1.3 本章硬件限制(继承 lesson16))
  • 二、实验简介
    • [2.1 本章目标](#2.1 本章目标)
    • [2.2 硬件](#2.2 硬件)
  • 三、程序设计
    • [3.1 目录结构](#3.1 目录结构)
    • [3.2 速度外环核心代码](#3.2 速度外环核心代码)
    • [3.3 主循环调用顺序](#3.3 主循环调用顺序)
    • [3.4 参数建议](#3.4 参数建议)
  • [四、FreeMASTER 与串口](#四、FreeMASTER 与串口)
    • [4.1 FreeMASTER 监视变量](#4.1 FreeMASTER 监视变量)
    • [4.2 VOFA+ FireWater](#4.2 VOFA+ FireWater)
    • [4.3 串口命令](#4.3 串口命令)
  • 五、主程序流程
    • [5.1 初始化](#5.1 初始化)
    • [5.2 调试流程](#5.2 调试流程)
    • [5.3 手工调参步骤(串口 + Scope)](#5.3 手工调参步骤(串口 + Scope))
      • [5.3.1 准备](#5.3.1 准备)
      • [5.3.2 第一步:只调电流内环(lesson16 摸底)](#5.3.2 第一步:只调电流内环(lesson16 摸底))
      • [5.3.3 第二步:调速度外环](#5.3.3 第二步:调速度外环)
      • [5.3.4 推荐调参顺序(抄作业)](#5.3.4 推荐调参顺序(抄作业))
      • [5.3.5 串口命令与环状态速查](#5.3.5 串口命令与环状态速查)
  • 六、调试与整定
    • [6.1 算法说明(当前版)](#6.1 算法说明(当前版))
    • [6.2 「转速超不了 400,lesson11 能到 700」?](#6.2 「转速超不了 400,lesson11 能到 700」?)
    • [6.3 推荐验证步骤](#6.3 推荐验证步骤)
    • [6.4 常见问题](#6.4 常见问题)
    • [6.5 速度环整定经验](#6.5 速度环整定经验)
    • [6.6 与 lesson11 / lesson16 对照](#6.6 与 lesson11 / lesson16 对照)
    • [6.7 安全提示](#6.7 安全提示)
  • 七、本章小结

一、FOC 速度外环是什么

lesson16 已实现 DQ 双轴电流内环 :给定 I q _ r e f I_{q\_ref} Iq_ref,PI 自动调节 V d / V q V_d/V_q Vd/Vq,电机输出对应转矩。本章在电流环 外侧 再套一层 速度环 ,构成 FOC 最常用的 串级双闭环

环路 周期 输入 SP 反馈 输出
速度外环 50 ms 目标 RPM 霍尔 RPM PI → Iq (mA)
电流内环 25 ms I q _ r e f I_{q\ref} Iq_ref / I d _ r e f = 0 I{d\_ref}=0 Id_ref=0 Park 后 Id/Iq Vd/Vq → PWM

控制链路:
#mermaid-svg-ZNqiewZ7Mx7iZuP0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .error-icon{fill:#552222;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .marker.cross{stroke:#333333;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 p{margin:0;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .cluster-label text{fill:#333;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .cluster-label span{color:#333;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .cluster-label span p{background-color:transparent;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .label text,#mermaid-svg-ZNqiewZ7Mx7iZuP0 span{fill:#333;color:#333;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .node rect,#mermaid-svg-ZNqiewZ7Mx7iZuP0 .node circle,#mermaid-svg-ZNqiewZ7Mx7iZuP0 .node ellipse,#mermaid-svg-ZNqiewZ7Mx7iZuP0 .node polygon,#mermaid-svg-ZNqiewZ7Mx7iZuP0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .rough-node .label text,#mermaid-svg-ZNqiewZ7Mx7iZuP0 .node .label text,#mermaid-svg-ZNqiewZ7Mx7iZuP0 .image-shape .label,#mermaid-svg-ZNqiewZ7Mx7iZuP0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .rough-node .label,#mermaid-svg-ZNqiewZ7Mx7iZuP0 .node .label,#mermaid-svg-ZNqiewZ7Mx7iZuP0 .image-shape .label,#mermaid-svg-ZNqiewZ7Mx7iZuP0 .icon-shape .label{text-align:center;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .node.clickable{cursor:pointer;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .arrowheadPath{fill:#333333;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .cluster text{fill:#333;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .cluster span{color:#333;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .icon-shape,#mermaid-svg-ZNqiewZ7Mx7iZuP0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .icon-shape p,#mermaid-svg-ZNqiewZ7Mx7iZuP0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .icon-shape .label rect,#mermaid-svg-ZNqiewZ7Mx7iZuP0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZNqiewZ7Mx7iZuP0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} g_fm_target_rpm
SP 斜坡 50ms
PI_speed → Iq mA
motor_hall_get_rpm
g_fm_target_iq mA
PI_Iq 25ms
Id_ref=0
PI_Id
三相电流
Park
霍尔电角度
Vq
Vd
InvPark
|V|→占空比→六步换相

与 lesson11 的区别 :lesson11 速度环 直接输出 PWM ;本章速度环输出 Iq 电流给定,由 FOC 电流内环把「需要多大转矩电流」转化为电压矢量。这是工业 FOC 驱动的标准级联结构。

1.1 为什么速度环比电流环慢?

  1. 带宽分工:电流环负责快速抑制电流扰动(25 ms);速度环只需跟踪转速,50 ms 足够,且能滤除霍尔测速噪声。
  2. 级联稳定性 :外环慢、内环快,内环可近似为外环的「快速执行器」,整定顺序:先电流环、后速度环
  3. 输出限幅:速度 PI 微调限幅 ±400 mA;主通道为前馈 + 超速减力(见 §1.4)。

1.4 速度环为什么不能只靠 PI「自己适配」?

教科书 / 官方 MCSDK 里,速度环理想形态是:

text 复制代码
Iq_ref = Kp×(SP−ACT) + Ki×∫(SP−ACT)dt    ← 积分自动消静差
电流环跟踪 Iq_ref → PWM → 转速

lesson17 在六步板 + 霍尔 6 态上,这条链路不完整 ,纯 PI 直接出 Iq 会出现:Iq 顶满但 PWM 上不去、降 SP 转速不降、0↔满 PWM 振荡、固定 +100 RPM 静差等。因此代码在 PI 之外增加了 工程补丁(不是 FOC 理论要求,是本平台折中):

补丁 作用 若删掉会怎样
前馈 SP×1.0 mA/RPM 粗估力矩,减轻 PI 负担 加速慢或 Iq 积分顶满
PI 微调 ksp/ksi 在 ±400 mA 内修小偏差 单独调它对大静差作用有限
超速 Iq×SP/ACT 单象限无法负 Iq 制动,用减力代替 ACT 长期高于 SP
duty_cap∝当前PWM 六步下减 Iq 往往减不了 PWM,直接限占空比 t 300 仍 400+ RPM
欠速 Iq≥120mA 防止电流环因 Iq 过小关 PWM 「转几下停一下」

分工 :PI(+ksp/ksi)管小偏差和慢跟踪;前馈 / duty_cap 管大偏差、降 SP、单象限不能制动。到 lesson18 SVPWM 后电流环可控性更好,可逐步减小前馈和 duty_cap,让 PI 承担更多------更接近「速度环自己适配」。

与官方对比:

项目 ST FOC / MCSDK lesson17(六步板)
速度 PI 输出 ±Iq,Workbench 标定 前馈 + PI 微调 Iq≥0
减速 负 Iq 制动 Iq 减力 + duty_cap 滑降
执行端 SVPWM 六步 + |V|→PWM
测速 霍尔 FIFO 等 EMA 2/8,±30~50 RPM 纹波

1.2 两种运行模式

模式 使能变量 谁给定 Iq 典型用途
速度闭环 g_fm_speed_loop_en=1(自动带电流环) 速度 PI 恒速运行、负载扰动自动加力
仅电流闭环 w 0 + s 1 串口 c / 按键 K3/K4 验证电流环、锁轴、整定 Kpq/Kiq

1.3 本章硬件限制(继承 lesson16)

霍尔仅 6 态、执行端仍为六步 + ∣ V ∣ → |V|\to ∣V∣→PWM,Id/Iq 会有纹波;速度环 能转、能跟 SP 趋势,但 RPM 稳态精度受霍尔分辨率限制。完整平滑控制见后面的 SVPWM章节。


二、实验简介

2.1 本章目标

在 lesson16 工程基础上增加 FOC 速度外环

  • 新增 g_fm_pi_speed,50 ms 周期,输出 I q _ r e f I_{q\_ref} Iq_ref
  • w 1 启速度环时 自动开启电流内环g_fm_curr_loop_en=1
  • FreeMASTER 监视 RPM / Iq / Id;VOFA+ 在速度模式下发 RPM SP/ACT/Iq
  • 保留过流、堵转保护与电流零偏校准

2.2 硬件

与 lesson4~16 相同:野火骄阳 F407 + 无刷驱动板 + 霍尔 BLDC。


三、程序设计

3.1 目录结构

复制代码
User/
├── foc/
│   └── bsp_foc.c/h       # Clark / Park / InvPark
├── pid/
│   ├── bsp_pi.c/h        # 抗饱和 PI(电流环 + 速度环共用)
│   └── bsp_pid_app.c/h   # 速度外环 + DQ 电流内环 + 串口
├── freemaster/
│   └── bsp_fm_vars.h     # g_fm_target_rpm、g_fm_speed_loop_en 等
└── main.c

3.2 速度外环核心代码

采用 前馈 + PI 微调 + 超速减力 + duty_cap(详见 §1.4):

c 复制代码
iq_ff   = SP * 1.0f;                         /* 主通道:400RPM→400mA */
iq_trim = pi_cal(&g_fm_pi_speed, ramp, ACT); /* 微调 ±400mA */
iq_ma   = iq_ff + iq_trim;
if (ACT > SP+25)  iq_ma *= SP/ACT;           /* 超速减力(单象限) */
if (欠速)         iq_ma = max(iq_ma, 120);   /* 防 PWM 被关到 0 */
/* 电流环输出再经 duty_cap = SP/ACT×当前PWM 限幅 */

电流内环 dq_current_loop_control() 不变 ,始终跟踪 g_fm_target_iq

3.3 主循环调用顺序

text 复制代码
while (1) {
    deal_dq_curr_serial_data();
    deal_key_input();
    motor_protect_sync();
    foc_spd_poll();          /* 50 ms 速度外环 */
    dq_curr_poll();          /* 25 ms DQ 电流内环 */
    motor_stall_poll();
    motor_hall_speed_poll();
    motor_overcurrent_poll();
    dq_curr_vofa_poll();
}

3.4 参数建议

项目 初值 说明
Ksp / Ksi 1.0 / 0.15 微调 ±400mA;主通道前馈 SP×1.0(见 §1.4)
Kpq / Kiq 0.4 / 35 电流内环
前馈 1.0 mA/RPM 400→400mA;超速可减力,欠速才保 120mA
PWM 限速 SP/ACT×当前 duty 比按 5500 算更能压 +100 静差
Iq 上限 4000 mA 饱和 500ms 且 RPM 不涨 → 自动清积分退回前馈
RPM 目标 300~800 空载起步,勿一次给满 3000

整定顺序 :先 w 0 + s 1 把电流环调稳 → 再 w 1 启速度环,从小 RPM(如 300)阶跃验证。


四、FreeMASTER 与串口

4.1 FreeMASTER 监视变量

符号 含义
g_fm_target_rpm 速度 SP(RPM)
g_fm_actual_rpm 霍尔反馈 RPM
g_fm_error_rpm SP - ACT
g_fm_speed_loop_en float 1.0=速度外环开
g_fm_curr_loop_en float 1.0=电流内环开
g_fm_target_iq Iq 给定(速度环或手动)
g_fm_iq_actual / g_fm_id_actual d/q 反馈电流
g_fm_pi_speed 速度环 PI 参数与状态
g_fm_pi_iq / g_fm_pi_id 电流环 PI

速度闭环 Scope 建议g_fm_target_rpmg_fm_actual_rpmg_fm_target_iq 同屏。

4.2 VOFA+ FireWater

模式 ch0 ch1 ch2
速度闭环 (w 1) RPM SP RPM ACT Iq SP (mA)
仅电流环 Iq SP Iq ACT PWM

115200、协议 FireWater、3 通道。

4.3 串口命令

命令 作用 示例
t [rpm] 设目标转速 t 500
w 1 / w 0 启 / 仅停速度外环 w 1 / w 0
c [mA] 设 Iq(须 w 0 c 1500
ksp / ksi 速度环 PI ksp 8
kpq / kiq / kpd / kid 电流环 PI kiq 80
s 1 / s 0 仅电流环 / 全停 s 1
pid 打印状态 pid
r 清全部 PI 积分 r
cal 零偏重校准 cal
v [pwm] / `d [0 1]` 开环(须 s 0w 0

推荐启速度闭环

text 复制代码
t 500    # 先设低目标转速
w 1      # 启速度环(自动开电流环)

停转 (勿与 w 0 混淆):

命令 速度环 电流环 电机
w 0 保持curr_loop 仍为 1) 继续按上次 g_fm_target_iq
s 0 停转 + 重校准
t 0 + w 1 Iq→0 滑停

为什么 w 0 后还在转?

w 0 只关速度外环、清速度 PI,不关电流内环,也不把 g_fm_target_iq 置 0w 1 时速度环最后写入的 Iq 仍由电流环跟踪,电机继续转------便于切到「仅电流环」(w 0 后用 c 改 Iq)。要停转请用 s 0

按键:速度环运行时 K3/K4 调整 RPM ±50;仅电流环时 K3/K4 调整 Iq ±200 mA。


五、主程序流程

5.1 初始化

  1. 时钟、LED、串口、ADC(零偏校准约 2 s)
  2. bldcm_init():TIM8 PWM + TIM5 霍尔
  3. dq_curr_init():默认 RPM=500、Iq=1500 mA,双环均关
  4. 确认 pid 输出 cal=1

5.2 调试流程

text 复制代码
① 上电等 3 s → pid 看 cal=1
② 仅电流环摸底:w 0 → c 1000 → s 1 → 确认能转、Iq 有跟随趋势
③ s 0 → t 300 → w 1 → 观察 RPM 向 300 靠拢、g_fm_target_iq 自动变化
④ 加载(手轻触转子)→ 看 Iq 给定上升、RPM 试图回到 SP
⑤ FreeMASTER 同时看 RPM / Iq / PWM

5.3 手工调参步骤(串口 + Scope)

原则 :先电流内环、后速度外环;每次只改一个参数 ;改完 r 清积分再观察 5~10 s。

速度环主通道是代码里的 前馈 SP×1.0 mA/RPMksp/ksi 只在 ±400 mA 范围内微调(见 §1.4)。

5.3.1 准备

串口 (115200):连上后等上电约 3 s,发 pid,确认 cal=1

FreeMASTER Scope 建议同屏拖 4~6 路:

变量 看什么
g_fm_target_rpm 速度目标 SP
g_fm_actual_rpm 霍尔转速 ACT
g_fm_target_iq 速度环输出的 Iq 给定
g_fm_pwm_out 最终 PWM
g_fm_iq_actual 电流环反馈(会有纹波)
g_fm_error_rpm SP − ACT

5.3.2 第一步:只调电流内环(lesson16 摸底)

电流环不好,速度环一定不稳。须先 w 0(或未开过速度环)

text 复制代码
s 0                    # 全停,等 cal=1
c 800                  # Iq 给定 800 mA(空载起步)
s 1                    # 只开电流环

观察 5 s,再逐步 c 1000c 1200... 确认能稳转。

命令 默认值 可调范围 增大后现象 减小后现象
kpq 0.5 Kpq=0.4 0~50 iq_actual 更跟手,易振荡/噪声大 跟随慢、target_iqpwm 脱节
kiq 50 Kiq=35 0~500 静差小,易超调、Id/Iq 纹波放大 电流跟不准、力矩软
kpd / kid 0.4 / 35 同左 Id 更贴 0(六步下 Id 本就有纹波) 一般少动

电流环合格参考 (空载,c 1000):

  • 电机能连续转,不周期性「快停快起」
  • g_fm_pwm_out 在几百~三千级,不长期顶 5500
  • g_fm_iq_actual 有 ±几百 mA 纹波可接受,但不要长期 ±几千

调满意后:s 0r

5.3.3 第二步:调速度外环

text 复制代码
t 400                  # 先给中等转速,勿一次 1000+
w 1                    # 开速度环(自动开电流环)

等 ACT 稳定 5~10 s,再试阶跃:t 300 → 等 5 s → t 500

命令 默认值 可调范围 增大后现象 减小后现象
ksp 1.5 1.0 0~50 响应快,ACT 易冲过头、振荡 跟 SP 慢;对大静差作用有限
ksi 0.25 0.15 0~20 小误差消除快,易超调/振荡 长期偏差消得慢;仍只微调 ±400mA

t 400 稳定偏高 ~100 RPM(ACT≈500),单靠 ksp/ksi 往往不够 ------主因是前馈 1.0 mA/RPM 对本机偏大,需在 bsp_pid_app.hFOC_SPD_IQ_FF_PER_RPM(如 0.9)重新编译。

速度环合格参考(空载):

  • t 400 后 ACT 在 350~450 一带(±50 RPM 纹波可接受)
  • g_fm_target_iq几百~一两千 mA,不长期顶 4000
  • g_fm_pwm_out 不周期性掉到 0(若掉 0 见 §6.4)
  • t 后 ACT 方向对(升 SP 转速升,降 SP 转速降),允许数秒滑降

5.3.4 推荐调参顺序(抄作业)

text 复制代码
# --- 电流环 ---
s 0 → pid          # cal=1
c 800 → s 1        # 能转即可
# 若抖得厉害:kiq 25 → r → 再看;仍抖:kpq 0.3
# 若跟不准:kiq 45 → r → 再看
s 0 → r

# --- 速度环 ---
t 400 → w 1
# 等 8 s,Scope 看 ACT / target_iq / pwm_out
# 略振荡:ksp 0.8 → ksi 0.1 → r
# 静差偏大:改宏 FOC_SPD_IQ_FF_PER_RPM 0.9 烧录(比加大 ksi 更有效)
t 300 → 等 5 s → t 500 → 等 5 s    # 阶跃测试

每次改参后建议:r(清积分)→ 等 5~10 s → 再 pid 看打印的 K 值是否生效。

5.3.5 串口命令与环状态速查

你想... 命令
看全部状态 pid
清 PI 积分 r
只关速度环(电机仍转 w 0
停转 s 0
速度环运行中改 Iq 不行 ,须先 w 0
改速度 Kp/Ki ksp 1.0ksi 0.15(注意是 ksi 不是 kis)

六、调试与整定

6.1 算法说明(当前版)

text 复制代码
g_fm_target_rpm ──→ SP 斜坡 ──→ Iq_ff(SP×1.0) + PI微调(±400mA)
                         ↓
              电流内环 PI → Vd/Vq → InvPark → |V|→PWM(超速 duty_cap)

Scope 判读(重要):

现象 含义
target_iq=5500pwm≈3000 速度 PI 积分饱和,内环未跟上 → 已改前馈+微调
iq_actual ±400~500 大幅振荡 电流内环/六步 FOC 纹波 ,先 w 0+s 1 调 Kpq/Kiq
pwm 顶 5500 仍上不去 反电势/母线到顶,非速度环参数问题

6.2 「转速超不了 400,lesson11 能到 700」?

根因:PWM 映射 bug,不是电机转不动。

lesson11 速度 PI 直接输出 PWM 0~5500。lesson17 电流环把电压矢量映射为:

text 复制代码
旧:duty = |V| / Vbus × 5500  →  电压圆饱和时 |V|=Vbus/√3  →  duty≈3175(58%)← 你 Scope 里的值
新:duty = |V| / v_max × 5500  →  饱和时 duty=5500,与 lesson11 满量程一致

所以 ACT 卡在 ~395、pwm 长期 3175FOC 占空比算错顶死(已改)。

t 300 仍 700 不降 :六步板光减 target_iq 减不了 PWM,必须 限 duty 。现已加 duty_cap = 5500×SP/ACT;超速 >80RPM 时开环 duty。

text 复制代码
t 500 → ACT 应靠近 500(不再冲到 700)
t 300(从 700 转)→ pwm 应降到 ~2300,ACT 缓慢下降

先 Scope 四变量(5~10 s):

变量 顶满说明
g_fm_target_iq =5500 → 力矩饱和,需确认是否电压/PWM 也满
g_fm_pwm_out 旧版长期 3175 =5500/√3 → PWM 映射 bug;新版饱和应接近 5500
g_fm_iq_actual 远小于 g_fm_target_iq电流内环跟不准,先整定 Kpq/Kiq
g_fm_fault_code ≠0 → 保护关断

常见根因:

  1. 旧版 Iq 顶 3500 → 已改 5500
  2. boot 踢动 + 速度环 → Iq 跟不准时仍强推 duty=800 → 已禁用
  3. Ksp/Ksi 过大 + 单象限 → 略超 SP 就 Iq=0 再猛加 → 已降 Ksp/Ksi + 死区 + Iq 斜坡

6.3 推荐验证步骤

text 复制代码
r → t 500 → w 1              # pwm_out 应能超过 3175,ACT 往 500 升
r → t 400 → w 1 → t 200      # 降 SP:target_iq=0、pwm→0,ACT 滑降
Scope: g_fm_pwm_out, g_fm_target_iq, g_fm_actual_rpm

6.4 常见问题

现象 可能原因 处理
t 500 / t 200 大幅振荡 硬滑降 Iq=0↔满 PWM;Kiq=80 过大;ksi 命令无效 已去掉硬滑降;Kiq→35;反馈钳位 ±2500mA
t 300 但 ACT 仍在 400 降 SP 需硬滑降 target_iq=0pwm→0(仅 decel 分支)
g_fm_target_iq 顶在 5500 负载大或已到电压/PWM 上限 g_fm_pwm_out;先整定电流内环
160↔380 大幅振荡 Ksp 过大或内环未整定 ksp 1.5 ksi 0.2;先 w 0+s 1 调电流环
r 后 Iq 不变 旧版 bug 当前版 r 会立即重算并打印 Iq=xxx mA
RPM 毛刺导致 Iq 跳 霍尔 6 态测速 死区 ±25 RPM + Iq 斜坡;可再略减 Ksp

6.5 速度环整定经验

现象 原因 处理
转速上升极慢 Ksp/Ksi 过小 略增 Ksp 或 Ksi
RPM 大幅振荡 Ksp 过大 减小 Ksp
转速有静差 Ksi 过小 增大 Ksi
启动过冲大 双环积分未清 启环前 r;降低初始 t
改 SP 冲击大 阶跃过猛 已有 SP 斜坡;可减小 FOC_SPD_RAMP_STEP_RPM

6.6 与 lesson11 / lesson16 对照

项目 lesson11 速度环 lesson17 FOC 双环
外环输出 PWM 0~5500 Iq → 电流环 → PWM
PWM 上限 5500(100%) 旧版误限 3175(58%),已改对齐 5500
700 RPM 可达 旧版 ~400 顶死;改映射后应可继续升高

6.7 安全提示

  • 首次速度闭环请 空载、低 RPM(300~500),手勿靠近转子
  • 异常立即 s 0 或断电
  • 速度环运行中 不要c 改 Iq(由 PI 自动给定);须先 w 0

实验效果:

目前的六步换相要调电机平滑运行很困难,后面重点看SPWM调试效果。

七、本章小结

  • FOC 速度外环 = 霍尔 RPM 反馈 + PI 直接输出 Iq,与 DQ 电流内环构成串级双闭环(对齐 ST MCSDK 结构)。
  • 速度环 50 ms + SP 斜坡,电流环 25 ms;先整定内环、再整定外环。
  • 六步板 单象限无制动:降 SP 靠 Iq→0 滑降,RPM 有 ±30~50 纹波属正常。
  • w 1 自动开启电流环;w 0 + s 1 可退回仅电流环调试。
  • 霍尔粗角度 + 六步驱动的限制仍在,RPM/Iq 会有纹波;后续 lesson18 SVPWM 改善执行端。

参考:野火《电机应用开发实战指南》、lesson16 DQ 双轴电流环lesson11 速度环控制

源码: https://gitee.com/xundh/learn-motor-stm32