01电机基础

结构、极对数、电角度与机械角度

本模块主旨
极对数 + 电角度 + 转矩公式 + BEMF —— 把电机铭牌翻译成 FOC 第一行 C 代码用得到的四个数。

学完应能回答

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

总览
"机械 → 电角度"的乘极对数是 FOC 第一公里。后面所有模块默认你已经会算电角度。

零基础速入

类比
电机就像一群推秋千的人——定子绕组通电后产生磁极("手"),转子带着永磁体("秋千")被周期性地往同一个方向推。FOC 要解决的核心问题就是"什么时候推、推多大力",让秋千越荡越快、越荡越稳。
核心概念
FOC 控制的所有数学,都建立在"机械角度 → 乘极对数 → 电角度 → 控制磁场方向"这条最基础的链条上。

为什么要学

第一手操作
右侧把"极对数"从 4 改到 8,看右边两个圆环:机械角度 θm 不变(45°),电角度 θe 跳到 360°——8 极对电机,机械转一圈,电角度要循环 8 圈。

学习目标

核心概念

公式

电角度
θe = polePairs × θm

θm 是机械角度(编码器实际读到的值),polePairs 是极对数。控制算法用的是 θe,这是 FOC 第一行代码。

电频率
fe = (rpm / 60) × polePairs

机械 1500 rpm 的 4 极对电机,电频率 = 25 × 4 = 100 Hz。这个值决定 PWM 频率应该至少是它的几十倍。

电磁转矩
Te = 1.5 × p × (ψf × Iq + (Ld - Lq) × Id × Iq)

p 为极对数,ψf 为永磁体磁链;表贴式电机 Ld=Lq,转矩近似 Te ≈ 1.5 × p × ψf × Iq,与 Iq 成正比。这是为什么 q 轴叫"转矩轴"。

反电动势
BEMF = Ke × ω

转速越高反电动势越大;当 BEMF 接近母线电压时,控制器没电压余量了,就需要弱磁。

工程意义

STM32 移植指南

常见误区

  • 直接把机械角度送进 Park(电机会抖动或不转)。
  • 极对数填成"极数"——8 极电机的极对数是 4,不是 8。
  • 没做编码器零位对齐就直接闭环。
  • 混用相电流(Ia)、线电流(Iab)、dq 电流的单位和缩放。

调试方法

建议实验

STM32 C 代码骨架

/* ============================================
 * motor.h — 电机参数与角度计算
 * 适配 STM32F4/G4/H7,PWM 中心对齐 16kHz
 * ============================================ */
typedef struct {
    uint8_t  pole_pairs;     // 极对数(不是极数)
    float    rs;             // 相电阻 Ω
    float    ld_h;           // d 轴电感 H
    float    lq_h;           // q 轴电感 H
    float    psi_f;          // 永磁磁链 Wb
    float    rated_current;  // 额定电流 A
} motor_param_t;

/* 编码器原始值 → 电角度(rad)
 * encoder_raw: 0 ~ ENCODER_RESOLUTION-1
 * encoder_zero: 启动时对齐得到的零位偏置 */
static inline float encoder_to_theta_e(
    uint32_t encoder_raw,
    uint32_t encoder_zero,
    uint8_t  pole_pairs)
{
    /* 1. 减零位偏置,得到机械角度计数 */
    int32_t mech = (int32_t)encoder_raw - (int32_t)encoder_zero;
    if (mech < 0) mech += ENCODER_RESOLUTION;

    /* 2. 乘极对数 → 电角度计数(防溢出) */
    uint32_t elec = ((uint32_t)mech * pole_pairs) % ENCODER_RESOLUTION;

    /* 3. 归一化到 [0, 2π) */
    return (float)elec * (2.0f * M_PI / ENCODER_RESOLUTION);
}

/* 在 ADC 中断的最开头调用,整个 FOC 链的起点 */
volatile float g_theta_e;
void ADC_IRQHandler_Begin(void) {
    g_theta_e = encoder_to_theta_e(
        ENCODER_GetCount(),
        g_param.encoder_zero,
        g_param.pole_pairs);
    /* 之后是 Clarke → Park → PI → 反 Park → SVPWM */
}

下一步

随堂题

一台铭牌写"8 极、4 对极"的 PMSM,FOC 中应该用极对数等于多少?
  1. 8
  2. 4 (正确)
  3. 16
  4. 2
提示:"极"指磁极总数(N+S 都数),"对极"=极/2。FOC 算法用极对数,本题为 4。
4 极对电机以 1500 rpm 转动,电频率是多少?
  1. 25 Hz
  2. 50 Hz
  3. 100 Hz (正确)
  4. 6000 Hz
提示:fe = rpm/60 × polePairs = 25 × 4 = 100 Hz。PWM 频率应至少是它的 50 倍以上。
若把机械角度 θm 直接当成 θe 送进 Park 变换,最可能出现什么现象?
  1. 电机正常转动只是慢一点
  2. 电机抖动或不转 (正确)
  3. 电流变小
  4. 没影响,FOC 自动纠正
提示:θe 应是 θm × 极对数。差了几倍后 dq 投影完全错位,Iq 实际投到 Id 上,几乎产生不了转矩。
表贴式 PMSM (Ld=Lq) 在 Id=0 控制下,电磁转矩主要由什么决定?
  1. Id
  2. Iq (正确)
  3. 母线电压
  4. PWM 频率
提示:Te = 1.5p(ψf·Iq + (Ld-Lq)IdIq)。Ld=Lq 时第二项为 0,Iq 直接等比例决定转矩。
为什么 FOC 启动前必须做"编码器零位对齐"?
  1. 硬件要求
  2. 让控制器知道 d 轴在哪里,才能正确算 dq 投影 (正确)
  3. 保护编码器
  4. 减少 PWM 噪声
提示:d 轴沿转子永磁体 N 极,对齐就是把"编码器读数 = 0"和"d 轴指向定子 A 相"绑在一起。不对齐会导致 Id/Iq 命令与实际方向有恒定偏差。