01电机基础
结构、极对数、电角度与机械角度
本模块主旨
极对数 + 电角度 + 转矩公式 + BEMF —— 把电机铭牌翻译成 FOC 第一行 C 代码用得到的四个数。学完应能回答
- 能区分"极数 vs 极对数",并从铭牌"8 极 3000 rpm 220V"反算出额定电频率 200 Hz
- 能口算 θe = polePairs × θm、fe = rpm/60 × polePairs,并解释为什么 6 极对压缩机 PWM 选 16 kHz 而不是 4 kHz
- 理解 PMSM 转矩公式 τ = 1.5·p·[ψf·Iq + (Ld−Lq)·Id·Iq] 三段含义,区分 SPM 和 IPM 工程含义
- 能用 BEMF = ψf·ω_e 反算"6000 rpm 6 极对 ψf=0.05 Wb"时的反电动势峰值并解释为什么需要弱磁
- 掌握"上电四件套"标定流程:极对数 → 编码器零位 → Rs(直流注入)→ Ld/Lq(高频注入)
- 会用 STM32 编码器接口 (TIM2 TI1/TI2 4 倍频 + Z 输入捕获) 把机械角度变成电角度
总览
"机械 → 电角度"的乘极对数是 FOC 第一公里。后面所有模块默认你已经会算电角度。零基础速入
类比
电机就像一群推秋千的人——定子绕组通电后产生磁极("手"),转子带着永磁体("秋千")被周期性地往同一个方向推。FOC 要解决的核心问题就是"什么时候推、推多大力",让秋千越荡越快、越荡越稳。核心概念
FOC 控制的所有数学,都建立在"机械角度 → 乘极对数 → 电角度 → 控制磁场方向"这条最基础的链条上。为什么要学
- 极对数搞错,电角度就会差几倍,电机会抖动甚至反转——是 FOC 上电就转不动的最常见原因。
- 机械角度(你眼睛看到转子转的角度)和电角度(控制器算法用的角度)是两个量,不能混用。
- 后面所有模块(Clarke / Park / SVPWM / 弱磁)都以"我此刻知道电角度是多少"为前提。
第一手操作
右侧把"极对数"从 4 改到 8,看右边两个圆环:机械角度 θm 不变(45°),电角度 θe 跳到 360°——8 极对电机,机械转一圈,电角度要循环 8 圈。学习目标
- 区分 DC、BLDC、PMSM、异步电机的控制差异
- 理解定子、转子、永磁体、绕组、霍尔和编码器的作用
- 掌握机械角度、电角度、极对数之间的关系
核心概念
- 机械角度是转子实体转过的角度,电角度是磁场周期对应的角度。极对数越多,转子一圈内电角度转得越多。
- PMSM 的转矩主要来自 q 轴电流,d 轴通常对准永磁体磁链;表贴式电机常用 Id=0,内嵌式电机还会用 MTPA。
- 反电动势与转速、磁链相关,速度越高,控制器需要的电压余量越大。
公式
电角度
θ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 接近母线电压时,控制器没电压余量了,就需要弱磁。
工程意义
- 调试 FOC 第一件事是确认极对数(Datasheet 或者拆机数齿)。错了所有 dq 都错。
- Rs / Ld / Lq / Ke / Kt / J / B 这 7 个参数决定电流环带宽和观测器精度。买电机时尽量要齐。
- 机械角度反馈精度(编码器分辨率 ÷ 极对数)决定了电流环最大 dq 误差。低分辨率 + 高极对数 = 大误差。
STM32 移植指南
- 编码器或霍尔读到 θm(机械),用 (uint16_t)((theta_raw * polePairs) % ENCODER_RESOLUTION) 得到 θe。
- 初始化阶段必须做"对齐"——给定一个已知 dq 电压,让转子停在 d 轴零位,再清编码器零点。
- 极对数、Rs、Ls、Ke 放在 motor_param_t 结构体里,从 Flash 加载,方便切换电机不重新编译。
常见误区
- 直接把机械角度送进 Park(电机会抖动或不转)。
- 极对数填成"极数"——8 极电机的极对数是 4,不是 8。
- 没做编码器零位对齐就直接闭环。
- 混用相电流(Ia)、线电流(Iab)、dq 电流的单位和缩放。
调试方法
- 空载、低母线电压(先 12V)下手动给 Iq=1A、θe 缓慢累加,看转子能不能跟住。
- 在 SWO/RTT/串口里每 PWM 周期记录 θm 和 θe,正常应该 θe 跑得比 θm 快 polePairs 倍。
- 示波器抓三相电流,应该是 120° 相差的对称正弦。
建议实验
- 极对数 4 → 8,机械角度不变,看电角度循环数变化。
- 机械转速 0 → 6000 rpm,看电频率随之变化(公式 fe = rpm × p / 60)。
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 中应该用极对数等于多少?
- 8
- 4 (正确)
- 16
- 2
提示:"极"指磁极总数(N+S 都数),"对极"=极/2。FOC 算法用极对数,本题为 4。
4 极对电机以 1500 rpm 转动,电频率是多少?
- 25 Hz
- 50 Hz
- 100 Hz (正确)
- 6000 Hz
提示:fe = rpm/60 × polePairs = 25 × 4 = 100 Hz。PWM 频率应至少是它的 50 倍以上。
若把机械角度 θm 直接当成 θe 送进 Park 变换,最可能出现什么现象?
- 电机正常转动只是慢一点
- 电机抖动或不转 (正确)
- 电流变小
- 没影响,FOC 自动纠正
提示:θe 应是 θm × 极对数。差了几倍后 dq 投影完全错位,Iq 实际投到 Id 上,几乎产生不了转矩。
表贴式 PMSM (Ld=Lq) 在 Id=0 控制下,电磁转矩主要由什么决定?
- Id
- Iq (正确)
- 母线电压
- PWM 频率
提示:Te = 1.5p(ψf·Iq + (Ld-Lq)IdIq)。Ld=Lq 时第二项为 0,Iq 直接等比例决定转矩。
为什么 FOC 启动前必须做"编码器零位对齐"?
- 硬件要求
- 让控制器知道 d 轴在哪里,才能正确算 dq 投影 (正确)
- 保护编码器
- 减少 PWM 噪声
提示:d 轴沿转子永磁体 N 极,对齐就是把"编码器读数 = 0"和"d 轴指向定子 A 相"绑在一起。不对齐会导致 Id/Iq 命令与实际方向有恒定偏差。