04Park 变换

alpha-beta 到 dq 同步旋转坐标

本模块主旨
跳到转子上看 αβ → AC 变 DC:给 PI 创造工作前提的旋转变换,所有 dq 串扰、过零抖、低分编码器异响都在这里发生。

学完应能回答

查看完整 Walkthrough(9 步 + 4 误区)

总览
Park 变换 = "与转子同步看世界"。它把交流控制变成直流控制,给 PI 创造工作前提。

零基础速入

类比
Park 变换就是**站在旋转的木马上看周围**——你和木马一起转,木马上其他点对你看起来就**不动了**。Iαβ 在静止地面看是一个旋转的箭头,但你跳到转子上跟它一起转,那个箭头突然变成"指向固定方向、长度固定"的两根棍子(Id, Iq)。从此 PI 控制器只需控直流量,AC 难题瞬间消失。
核心概念
同一个电流矢量,αβ 静止坐标系下是个高速正弦变化的 AC 量;dq 同步旋转坐标系下变成稳定的 DC 量。Park 是这两个视角的旋转变换。

为什么要学

第一手操作
右侧把"电角度 θ"从 0 缓慢拖到 360°,看左侧 d/q 轴跟着转。同时观察 Id/Iq 的两条线段长度此消彼长——同一个 αβ 矢量,θ 不同投影出来 Id/Iq 完全不同。

学习目标

核心概念

公式

Park 变换
Id = Iα·cos θ + Iβ·sin θ\nIq = −Iα·sin θ + Iβ·cos θ

θ 是电角度。本质是 αβ 平面绕原点旋转 −θ。

反 Park(FOC 输出端用)
Uα = Vd·cos θ − Vq·sin θ\nUβ = Vd·sin θ + Vq·cos θ

电流 PI 在 dq 域算出 Vd/Vq 后,旋转 +θ 回到 αβ 给 SVPWM。

PMSM 转矩
Te = 1.5·p·(ψf·Iq + (Ld−Lq)·Id·Iq)

表贴式 Ld=Lq → Te ≈ 1.5·p·ψf·Iq,Iq 直接决定转矩。

工程意义

STM32 移植指南

常见误区

  • 角度方向(顺/逆时针)和电机相序不匹配,电机反转或转不动。
  • 机械角度直接当电角度(漏乘极对数)。
  • 编码器零位没对齐 → 启动一上电 Iq=0 也有转矩偏移。
  • sin/cos 符号写错(反 Park 与 Park 必须用同一个 θ 同一种符号)。

调试方法

建议实验

STM32 C 代码骨架

/* ============================================
 * park.h — Park / 反 Park 变换
 * STM32 FPU 直接算 sincosf;老芯片可换查表
 * ============================================ */

typedef struct { float d; float q; } dq_t;
typedef struct { float alpha; float beta; } alpha_beta_t;

/* αβ → dq (Park) */
static inline dq_t park(float alpha, float beta, float theta_e) {
    float s, c;
    sincosf(theta_e, &s, &c);    // 单次同时算
    dq_t o;
    o.d =  alpha * c + beta * s;
    o.q = -alpha * s + beta * c;
    return o;
}

/* dq → αβ (反 Park)*/
static inline alpha_beta_t inv_park(float vd, float vq, float theta_e) {
    float s, c;
    sincosf(theta_e, &s, &c);
    alpha_beta_t o;
    o.alpha = vd * c - vq * s;
    o.beta  = vd * s + vq * c;
    return o;
}

/* === 编码器零位对齐(启动时一次性执行)===
 * 给定 Vd > 0、Vq = 0,转子被强制对齐到 d 轴零位。
 * 然后清编码器计数器,记录这一刻为 encoder_zero。
 */
void align_encoder_zero(uint32_t *out_zero) {
    /* 给 d 轴施加 1A 等效电流(开环电压模式) */
    set_open_loop_voltage(2.0f /*Vd*/, 0.0f /*Vq*/, 0.0f /*theta_e*/);
    HAL_Delay(800);                 // 等转子稳定
    *out_zero = ENCODER->CNT;       // 此刻 d 轴零位
    set_open_loop_voltage(0, 0, 0); // 释放
}

/* 用法:
 *   align_encoder_zero(&calib.enc_zero);   // 上电一次
 *   // 之后每 PWM 中断:
 *   theta_e = encoder_to_theta_e(ENCODER->CNT, calib.enc_zero, p);
 *   dq_t i = park(i_alpha, i_beta, theta_e);
 */

下一步

随堂题

同一个 Iα=5, Iβ=0,电角度 θ 从 0° 变到 90°,Id/Iq 怎么变?
  1. 始终 Id=5, Iq=0
  2. Id 从 5 变到 0、Iq 从 0 变到 5 (正确)
  3. Id/Iq 同时 5
  4. 不变
提示:Id = α cos θ + β sin θ,Iq = −α sin θ + β cos θ。θ=0 → (5,0),θ=90° → (0,5)。
编码器零位偏 10° 没校准,给 Iq=5、Id=0 命令,Id 实际值大约多少?
  1. 0
  2. 5
  3. 5·sin(10°) ≈ 0.87 (正确)
  4. 5·cos(10°) ≈ 4.92
提示:Park 角度误差 Δθ 让 Iq 命令"溢"到 Id 上一份 sin(Δθ) 比例。Iq 自己只剩 cos(Δθ)·5。
表贴式 PMSM (Ld=Lq),转矩主要由谁决定?
  1. Id
  2. Iq (正确)
  3. |αβ| 总幅值
  4. 电频率 ω
提示:Te = 1.5p(ψf·Iq + (Ld−Lq)·IdIq)。Ld=Lq 时第二项为 0,Iq 是唯一决定者。
弱磁控制中注入负 Id 的物理意义是?
  1. 增加转矩
  2. 减小等效磁链 → 降低反电动势 → 换取更高转速 (正确)
  3. 降低损耗
  4. 保护硬件
提示:负 Id 沿 −d 方向去减弱永磁磁链 ψf,让 BEMF = Ke·ω 减小,给逆变器输出腾出电压余量。
Park 和反 Park 在 FOC 链路上的作用顺序?
  1. 两个都在最前
  2. Park 先(采样侧),反 Park 后(输出侧) (正确)
  3. 反 Park 先
  4. 同时使用
提示:ADC → Clarke → Park → PI → 反 Park → SVPWM → 桥臂。Park 把"测量 αβ"变 dq;反 Park 把"PI 输出 Vdq"变回 αβ。

相关公式索引

Park 变换
Id = Iα cosθ + Iβ sinθ, Iq = -Iα sinθ + Iβ cosθ