简介:围绕永磁同步电机(PMSM)无传感器磁场定向控制与PLL估算,这份中文PDF面向电机控制嵌入式开发者、电控算法学习者及需要低成本无感方案的工程人员,重点解决无位置/速度传感器条件下转子位置与转速估计、FOC解耦及高速弱磁控制等问题。文档以Microchip AN2520为骨架,串联Clarke/Park变换、PI调节、角度速度估算器、弱磁模块与空间矢量调制,并讨论表面贴装式PMSM的数学模型、恒转矩与恒功率运行、估算器抗温度与电磁噪声等工程要点,同时给出dsPICDEM MCLV-2开发板验证思路及AN1078、AN908等延伸参考。资源包仅含1个PDF文件,约1.83MB,轻量便于查阅和随查随用。已有2323人学习,适合作为无感FOC入门到进阶的算法框架与调试排错参考,也可用于理解PLL估算器和弱磁策略的实现边界与风险提示。
1. 先砍传感器,再谈性能
去年有个学生拿着一块自己画的驱动板来找我,说电机一上电就堵转,偏偏编码器还没装。他的需求很具体:一台小型表贴式永磁同步电机,轴端没有空间装编码器,线束要短,成本要压到最低,但转速得跑到 4000 RPM。这就是永磁同步电机无传感器磁场定向控制最典型的落地场景——用 PLL 估算器从反电动势里把转子角度和电角速度“读”出来,再用基于公式的弱磁把转速顶过基速。这套方案适合两类人:做电机驱动毕设或课设、需要一条能跑通的控制链路的学生;以及要把驱动器 BOM 里那颗编码器和它的线束砍掉的从业者。代价得提前说清——低速段估算精度天然吃亏,零速大转矩不在能力范围内,任何承诺“零速满载无感”的说法都值得怀疑。
2. 总体架构:从三相桥到 SVPWM 的八个模块职责划分
2.1 三层结构与一次控制周期的时序预算
整套方案在结构上分成三层,自下而上是硬件层、变换与调节层、估算层。硬件层负责三相桥的整流逆变、母线电压采集、双电阻相电流采集和过流保护;变换与调节层是 Clarke、Park、两个 PI 和 SVPWM;估算层就是那个 PLL,它不参与功率输出,但决定了上层所有调节量的坐标系准不准。
时序上,我一般把 PWM 设成 20 kHz 中心对齐模式,一个控制周期 50 µs。中心对齐的好处是计数器下溢时刚好落在两个开关沿中间,此刻采样最能避开开关噪声。下溢事件直接触发 ADC 采样,不经过任何软件干预;ADC 转换完成中断里跑完整条 FOC 链路,从读电流到更新占空比必须在一个周期内收工。
| 时间点(µs) | 事件 | 谁来做 |
|---|---|---|
| 0 | 计数器下溢,触发 ADC 双通道同步采样 | PWM 事件线,硬件 |
| 0 到 3 | 两相电流与母线电压转换完成 | ADC + DMA |
| 3 到 8 | Clarke、Park 正变换,PI 运算 | CPU / FPU |
| 8 到 14 | 弱磁模块计算 id 参考、iq 限幅 | CPU |
| 14 到 22 | PLL 估算器更新角度与速度 | CPU |
| 22 到 40 | Park 反变换、SVPWM 占空比计算与装载 | CPU + PWM 影子寄存器 |
| 40 到 50 | 留白给中断抖动和串口上报 | 余量 |
余量必须留。我见过有人把整条链路压到 48 µs,示波器上看着没事,一上负载、中断偶尔延迟两三个微秒,占空比就晚更新一个周期,电流波形开始出现周期性毛刺,查了半天以为是采样噪声,其实是时序超了。
2.2 八个模块的输入输出与数据流
把框图拆成模块表,比在纸上画方框有用得多,因为它逼你说清每个模块吃什么、吐什么。
| 模块 | 输入 | 输出 | 执行周期 |
|---|---|---|---|
| 三相桥与采样 | PWM 占空比、母线电压 | Ia、Ib、Vbus | 每周期 |
| Clarke 正变换 | Ia、Ib | Iα、Iβ | 每周期 |
| Park 正变换 | Iα、Iβ、估算角 | Id、Iq | 每周期 |
| PI 控制器 | Id/Iq 与其参考值 | Vd、Vq | 每周期 |
| 弱磁模块 | 电角速度、Iq、Vbus | Id 参考、Iq 上限 | 每周期 |
| Park 反变换 | Vd、Vq、估算角 | Vα、Vβ | 每周期 |
| SVPWM | Vα、Vβ、Vbus | 三路占空比 | 每周期 |
| PLL 估算器 | Vα、Vβ、Iα、Iβ | 估算角、估算电角速度 | 每周期 |
这张表里最容易被忽略的是弱磁模块对 Id 参考的改写权。恒转矩区 Id 参考固定为零,一旦进入恒功率区,弱磁模块就要接管这个参考值,并且同时压缩 Iq 的上限。两条通路必须由同一个模块算出来,否则会出现“Id 已经注了负电流,Iq 还按满额给”的过流。
另外注意 PLL 估算器吃的是 Vα 和 Vβ,这两个量来自上一个控制周期 SVPWM 的计算结果,不是本周期现算的。原因很简单:本周期电压还没发出去,物理上还不存在。这个“用上一拍电压喂估算器”的细节,是整条链路里最容易被写错的一行。
2.3 采样缩放与 Clarke/Park 的落地
双电阻采样的换算常数是新手最容易算反的地方。假设采样电阻 0.005 Ω,差分放大增益 75 倍,相电流峰值 4.4 A,那么采样电阻上的压降是 0.022 V,放大后是 ±1.65 V;叠加 1.65 V 的偏置,正好落在 0~3.3 V 的 ADC 输入范围内。这一步算错,后面所有电流环参数都白调。
/* 电流与电压的标定常量,按实际硬件替换 */ #define ADC_VREF 3.3f #define ADC_FULL_SCALE 4095.0f #define SHUNT_OHM 0.005f #define AMP_GAIN 75.0f #define VBUS_DIVIDER 0.045f /* 母线分压比 */ /* 每安培对应的 ADC 码值:I * Rshunt * Gain / Vref * 满量程 */ #define ADC_PER_AMP (SHUNT_OHM * AMP_GAIN / ADC_VREF * ADC_FULL_SCALE) /* 读取一相电流,减去中点偏置后换算成安培 */ static inline float read_phase_current(uint16_t raw, uint16_t offset) { return ((float)raw - (float)offset) / ADC_PER_AMP; } /* Clarke 正变换:三相转两相,等幅值变换 */ static inline void clarke(float ia, float ib, float *ialpha, float *ibeta) { *ialpha = ia; /* 以 A 相为 α 轴 */ *ibeta = (ia + 2.0f * ib) * 0.57735027f; /* 1/sqrt(3) */ } /* Park 正变换:静止系转估算转子系 */ static inline void park_fwd(float ialpha, float ibeta, float theta, float *id, float *iq) { float s = sinf(theta), c = cosf(theta); *id = ialpha * c + ibeta * s; *iq = -ialpha * s + ibeta * c; } /* Park 反变换:转子系转回静止系,输出给 SVPWM */ static inline void park_inv(float vd, float vq, float theta, float *valpha, float *vbeta) { float s = sinf(theta), c = cosf(theta); *valpha = vd * c - vq * s; *vbeta = vd * s + vq * c; }三个函数里有几个设计决定值得说明。Clarke 用的是等幅值变换,系数取 1/√3 ≈ 0.5774,这样 Ia、Ib 的幅值在 Iα、Iβ 上保持不变,后面 PI 参数好算;如果你用等功率变换,系数变成 √(2/3),PI 的积分增益要跟着改,两套参数混用会导致电流环增益差 33%。Park 的旋转方向必须和电机实际相序一致,正变换里用的是 +θ,反变换也是 +θ,如果实测转向相反,改相序而不是改符号,否则 SVPWM 的扇区计算会跟着错。
三相电流实际只采两相,第三相由 Ic = -Ia - Ib 重构。这一条的前提是三相电流之和严格为零,一旦采样偏置有漂移,重构出的 Ic 会有直流分量,Id 上就会冒出一个恒定的偏移,表现为电机轻微发热但转速正常——属于典型的问题。
3. PLL 估算器:把 d 轴反电动势锁到零
3.1 反电动势反解与 Park 定向
估算器的物理起点是定子电压方程。在 α-β 静止系下,每相的电压由三部分组成:电阻压降、电感上的电流变化率、以及转子旋转产生的反电动势。
Vα = Rs·Iα + Ls·dIα/dt + Eα Vβ = Rs·Iβ + Ls·dIβ/dt + Eβ把方程反过来解,反电动势就能从已知量里推出来:Vα、Vβ 是上一周期 SVPWM 算出的输出电压,Iα、Iβ 是本周期刚采到的电流,Rs 和 Ls 是电机参数。离散化之后,微分项变成相邻两拍电流的差除以控制周期 Ts。
这一步的误差来源非常集中:Rs 和 Ls 准不准。Rs 随温度每升高 1 ℃ 大约变化 0.4%,跑十分钟温升 40 ℃ 就是 16% 的偏差,直接体现为低速段估算角的缓慢漂移。Ls 的影响则随转速上升而放大,因为 dI/dt 项与频率成正比。这也是为什么标定环节里那两个数字必须实测,不能抄数据手册的典型值。
反电动势算出来之后,用上一周期的估算角 ρ 做一次 Park 变换,就得到转子磁链参考系下的 Ed 和 Eq:
Ed = Eα·cosρ + Eβ·sinρ Eq = -Eα·sinρ + Eβ·cosρ稳态下,如果估算角与真实转子角完全重合,反电动势全部落在 q 轴上,Ed 应该等于零,Eq 等于 ω·ψPM。这就是整个估算器的判据:把 Ed 驱动到零,角度就对准了。
3.2 把 Ed 锁到零:速度与角度积分的闭环结构
闭环结构很轻:把滤波后的 Eq 除以电压常量 Kφ,直接得到估算电角速度;对这个速度积分,得到估算角。Kφ 的物理含义是单位电角速度产生的反电动势幅值,量纲是 V·s/rad,数值上就等于转子磁链 ψPM。
ω_est = Eq_f / Kφ ρ_est = ρ_est + ω_est · Ts但只用 Eq 通道,在轻载、Eq 幅值接近零的时候容易锁错方向。解决办法是把 Ed 的符号用起来:Ed 的符号本身就携带角度误差的方向信息,估算角超前时 Ed 为正,滞后时为负。把这个符号乘到速度通道上,等于给估算器加了一个符号判别器,让它始终朝误差减小的方向走,反转和低速轻载时都不会锁到反方向去。
参数 Kφ 有两种来源。第一种是厂家直接给,但各家给的基准不一样,有的给 Vpeak/kRPM,有的给 V/kRPM 有效值,有的给的是线电压,换算时必须问清楚。第二种是自己测:用另一台电机拖动被测电机,以恒定 1000 RPM 旋转,在端子上测线电压有效值,乘以 √2 得到峰值,再换算成电角速度基准下的值。
L-L 电阻 4.2 Ω → 相电阻 Rs = 2.1 Ω L-L 电感 3.84 mH → 相电感 Ls = 1.92 mH 线反电动势 12.5 Vpeak/kRPM,极对数 P = 4 ω_elec @1000RPM = 4 × 104.72 = 418.9 rad/s ψPM = 12.5 / 418.9 = 0.02984 Wb invKFi = 1 / ψPM = 33.51 (rad/s)/V这几个数字后面还要用两次:一次在弱磁模块算 Id,一次在 1/Kφ 修正里。算完直接存成宏或者配置结构体,别在代码里散着写。
3.3 一阶滤波的带宽取舍
反电动势的 d-q 分量一定要滤波,否则 ADC 噪声和 PWM 开关的残留会顺着速度通道直接打进角度积分,电机听起来会有“沙沙”的高频声。滤波用最省事的一阶形式就够:
y(n) = y(n-1) + Kf · (x(n) - y(n-1))Kf 的物理意义是截止频率与控制频率之比,Kf 越小,带宽越窄,滤得越干净但相位滞后越大。这里有个必须踩过才知道的平衡:滤波太狠,估算角滞后于真实角,等效于把 FOC 的转矩角提前量搞乱,高速时相电流会明显变大、效率掉下来;滤波太松,噪声进 PI,速度环出现周期性抖动,示波器上看电流包络有明显的纹波。
工程上的做法是分两档。BEMF 的 d-q 分量用相对小的 Kf,因为这个量变化本来就慢,除了加速斜坡之外没有突变;速度反馈用相对大的 Kf,因为速度环需要响应。低速段速度变化取决于机械时间常数和负载惯量,通常远慢于控制周期,可以放心滤;高速弱磁区没有转矩突变,更可以滤。真正需要小心的是从开环切闭环、以及转速指令阶跃这两个瞬间,这时候滤波器里的历史值是错的,我一般会在切换那一刻把滤波状态直接赋成当拍的计算值,跳过收敛过程。
3.4 代码骨架与参数说明
typedef struct { float theta; /* 估算电角度,rad,范围 0~2π */ float omega; /* 估算电角速度,rad/s */ float invKfi; /* 1/Kφ,单位 (rad/s)/V */ float kf_bemf; /* 反电动势一阶滤波系数,典型 0.05~0.2 */ float kf_speed; /* 速度一阶滤波系数,典型 0.1~0.3 */ float ed_f, eq_f; /* 滤波后的 d/q 轴反电动势,V */ float ia_prev, ib_prev; /* 上一拍电流,用于离散微分 */ } PLL_EST; void pll_estimator(PLL_EST *e, float valpha, float vbeta, float ialpha, float ibeta, float ts) { float ealpha, ebeta, ed, eq, speed_raw; /* 1) 由定子方程反解反电动势,valpha/vbeta 取上一拍 SVPWM 输出 */ ealpha = valpha - RS * ialpha - LS * (ialpha - e->ia_prev) / ts; ebeta = vbeta - RS * ibeta - LS * (ibeta - e->ib_prev) / ts; /* 2) 用上一拍估算角做 Park,得到 Ed / Eq */ { float s = sinf(e->theta), c = cosf(e->theta); ed = ealpha * c + ebeta * s; eq = -ealpha * s + ebeta * c; } /* 3) 一阶滤波,抑制 ADC 噪声与开关残留 */ e->ed_f += e->kf_bemf * (ed - e->ed_f); e->eq_f += e->kf_bemf * (eq - e->eq_f); /* 4) Eq/Kφ 得速度;用 Ed 的符号做方向判别,防止轻载锁反 */ speed_raw = e->eq_f * e->invKfi; if (e->ed_f < 0.0f) { speed_raw = -speed_raw; } e->omega += e->kf_speed * (speed_raw - e->omega); /* 5) 积分得角度,并做 0~2π 归一化 */ e->theta += e->omega * ts; if (e->theta >= 6.2831853f) e->theta -= 6.2831853f; if (e->theta < 0.0f) e->theta += 6.2831853f; /* 6) 保存本拍电流,供下一拍微分使用 */ e->ia_prev = ialpha; e->ib_prev = ibeta; }几个参数的含义必须一次讲透。invKfi就是 1/ψPM,前面算出来的 33.51,这个值错 10%,估算转速就跟着错 10%,而且不会报错,只会表现为“实际 3000 转,上位机显示 3300”。kf_bemf决定反电动势通道的带宽,取值太小会导致切换瞬间的收敛慢,太大则滤不掉噪声,我一般从 0.1 起调,看电流包络的纹波再动。kf_speed影响速度环的跟随,取 0.2 左右比较稳。
角度归一化那两行不要省。theta 一直累加不归一化,跑上几十分钟浮点精度就开始丢有效位,表现为低速时角度偶尔跳一下,属于那种“跑了半小时才出现一次”的、最难查的问题。
还有一处容易写错:valpha和vbeta必须是上一拍真正发出去的电压,如果你在 SVPWM 里做了死区补偿或者限幅,喂给估算器的应该是补偿限幅之后的值,而不是 PI 刚算出来的原始值。这两者差几伏,在低速段就足以让 Ed 的零点偏掉。
3.5 开环强拖与切闭环的三个判据
估算器在零速和极低速下没有反电动势可用,Eq 接近零,除以 Kφ 得到的也是噪声。所以启动必须走开环:用一个强制角代替估算角,让转子被“拖”着转起来,等转速升到反电动势足够可信,再切闭环。
开环阶段有三个参数要调。锁定时间指转子对齐到指定位置所需的时间,负载初始转矩和转动惯量越大,这个时间越长,一般从 200 ms 起调,加到电流稳定不再反转为止。斜坡最终转速要设得足够高,高到估算出的反电动势精度够用,通常取额定转速的 10% 到 15%。斜坡上升时间取决于开环 q 轴电流和轴上的阻性负载,负载越大,达到最终转速越慢。q 轴电流参考在开环阶段是硬编码的,它就是强制流过电机的转矩电流,初始负载越高给得越大。
/* 开环调试开关:置 1 时禁用闭环切换,方便单独标定 */ #define OPEN_LOOP_FUNCTIONING 1 /* 强制角生成:不考虑转子实际位置,每拍加一个固定增量 */ #if OPEN_LOOP_FUNCTIONING g_est.theta += g_open_loop_omega * TS; if (g_est.theta >= TWO_PI) g_est.theta -= TWO_PI; iq_ref = OPEN_LOOP_IQ_REF; /* 硬编码转矩电流 */ id_ref = 0.0f; /* 开环阶段不弱磁 */ #endif这个宏在调试期的价值很高。把它置 1,整机就退化成最简单的开环强拖,你可以单独验证电流缩放常量和角度误差——强制角和估算角之间的差,是判断 Kφ 标得准不准最直接的手段。很多问题在开环状态下能一眼看出来,一进闭环反而被 PI 掩盖了。
切闭环的判据,我一般同时看三条:估算转速连续 N 个周期高于阈值(N 取 20 到 50,看控制频率)、估算角与强制角的偏差落在窗口内、以及 Iq 反馈与参考的偏差在容差内。三条同时满足才切。只满足第一条就切,很容易在负载突变时切过去又掉回来,来回振荡几次,转子发出“咔咔”声,这是最典型的翻车现场。
4. 弱磁模块:d 轴注负电流与 1/Kφ 修正
4.1 电压极限圆:为什么过了基速必须动 d 轴
电机的反电动势随转速线性上升,为了抵消它并支撑负载,施加的电压也得线性上升。但母线电压是硬的,绕组绝缘和器件的安全工作区也是硬的。SVPWM 调制的最大相电压幅值是 Vbus/√3,超不过去。
于是基速就被定义了:当 q 轴需要施加的电压刚好顶到 Vbus/√3 时,那个转速就是基速。再往上想提速,唯一的办法是把反电动势本身降下来。PMSM 的转子磁链由永磁体产生,物理上恒定,但定子 d 轴电流产生的电枢反应磁通可以抵消一部分,这就是弱磁——往 d 轴注入负电流。
对表贴式电机来说,这件事有一个天然的限制。它的气隙大(永磁体贴在转子表面,磁体、气隙、定子齿依次排开),电感小,电枢反应本来就弱,所以弱磁能力有限。工程经验是:表贴式 PMSM 的弱磁扩速一般不超过基速的两倍,再往上要么电压圆已经压得没有余量,要么 Id 已经大到把电流预算吃光。做方案时把这条写进指标,比答辩时被问住强。
注意:弱磁会实实在在削弱气隙磁通,一旦磁通密度跌破永磁体退磁曲线的拐点,磁体就永久失磁。另外超速会让粘贴或绑扎的磁体承受超出设计的离心力。这两条边界必须写进方案的约束条件,参数只能在电机厂家给的范围内动。
4.2 基于公式的 id 计算与 iq 限幅
稳态下 d-q 轴的电压方程,忽略微分项(id、iq 在稳态是直流量,导数为零),可以写成:
Vd = Rs·id - ω·Ls·iq Vq = Rs·iq + ω·(Ls·id + ψPM)把两个式子平方相加,得到电压幅值的平方。再忽略 Rs 压降(在高速段 ω·Ls 远大于 Rs,这个近似是合理的,工程上再留 8% 到 10% 的裕量把误差吃回来),就解出弱磁电流:
(Vmax/ω)² = (Ls·iq)² + (Ls·id + ψPM)² Ls·id + ψPM = sqrt((Vmax/ω)² - (Ls·iq)²) id = (sqrt((Vmax/ω)² - (Ls·iq)²) - ψPM) / Ls这个式子有个很直观的读法:括号里那一项是“电压圆允许的磁链幅值上限”,把它和永磁体磁链 ψPM 一比,差值除以 Ls 就是需要补的 d 轴电流。电压余量充足时算出来是正数,说明不需要弱磁;一旦算出来是负数,就是弱磁电流的幅值。
/* 基于公式的弱磁:返回 d 轴电流参考,负值表示弱磁 */ float fw_calc_id(float iq, float omega_e, float vbus, float ls, float psi_pm) { float vmax, psi_allow, term; float id; if (omega_e < 1.0f) { return 0.0f; /* 极低速不弱磁,避免除零 */ } vmax = vbus * 0.57735027f * 0.92f; /* Vbus/√3 再留 8% 裕量 */ psi_allow = vmax / omega_e; /* 电压圆允许的磁链幅值 */ term = psi_allow * psi_allow - (ls * iq) * (ls * iq); if (term <= 0.0f) { return -psi_pm / ls; /* 电压圆被 iq 吃满,id 顶到极限 */ } id = (sqrtf(term) - psi_pm) / ls; if (id > 0.0f) { id = 0.0f; /* 只弱磁,不增磁 */ } return id; }裕量 0.92 那个系数别省。母线电压在带载时会跌、死区会吃掉一点占空比、采样有延迟,理论上刚好顶到 Vbus/√3 的算法在实机上一定先饱和再震荡,表现为高速段电流突然尖起来。
iq 的上限必须跟着 id 走,因为总电流幅值受电机额定电流和器件能力双重约束:
iq_max = sqrt(Imax² - id²)这条式子说明白了弱磁的本质代价:id 占掉的每一安培,都是从转矩电流里抢过来的。所以弱磁区的转矩能力必然下降,方案里要如实写上“恒功率区转矩按 1/n 衰减”,别指望高速段还有满载转矩。
4.3 1/Kφ 的在线修正与电流优先级
估算器用 Eq/Kφ 算速度,前提是 Kφ 恒定。恒转矩区确实恒定,可到了弱磁区就不成立了:d 轴负电流抵消了一部分永磁磁链,等效磁链变成 ψPM + Ls·id(id 为负,所以变小),Kφ 也跟着变小。
如果不修正会怎样?估算器仍然按原始 Kφ 去除,Eq 因为弱磁保持恒定,除出来的速度就被低估,实际 4000 转时显示 3500 转,速度环于是继续加参考,Id 越注越深,最后要么过流保护,要么真的把磁体搞退磁。
修正直接在代码里做,用同一个 id 参考:
/* 弱磁区按等效磁链修正 1/Kφ,恒转矩区自动退化为原值 */ float psi_eff = PSI_PM + LS * id_ref; if (psi_eff < 0.3f * PSI_PM) { psi_eff = 0.3f * PSI_PM; /* 兜底,防止修正过深导致估算器发散 */ } g_est.invKfi = 1.0f / psi_eff;用前面的示例参数算一下:ψPM = 0.02984 Wb,Ls = 1.92 mH,id = -5 A 时,ψ_eff = 0.02984 - 0.0096 = 0.0202 Wb,1/Kφ 从 33.51 涨到 49.5,差 48%。不修正的话转速估算直接错掉三分之一,这是弱磁段最容易出、也最容易被误判成“电机参数不准”的问题。
电流优先级要明确规定:d 轴优先。电压圆先被 Id 占住,剩下的才给 Iq。这条在代码里体现为计算顺序——先算 id 参考,再用它算 iq_max,最后对速度环输出的 iq 参考做限幅。如果反过来先算 iq 再算 id,高速段会出现 id 抢不到预算、电压饱和、电流失控。
4.4 参数标定:Rs、Ls、Kφ 怎么量、怎么换算
估算器和弱磁模块都建立在电机模型上,模型和实物差多少,性能就差多少。三个参数必须实测。
定子电阻和电感用精密 LCR 表在电机端子上量,但量出来的是线值,要按接法换算成相值。
| 电机接法 | 相电阻 Rs | 相电感 Ls |
|---|---|---|
| Y 形(星形) | 端子测量值 ÷ 2 | 端子测量值 ÷ 2 |
| Δ 形(三角形) | 端子测量值 × 1.5 | 端子测量值 × 1.5 |
| Δ 接等效成 Y 接 | 再除以 3 | 再除以 3 |
最后一行是最容易漏的。如果电机是三角形接法,而控制算法里用的是星形等效模型,那么必须先把三角形参数折算成等效星形,再套公式,否则 Rs 差三倍,低速段的角度漂移会大到无法接受。
Kφ 可以让厂家给,也可以自己测:用一台外部驱动源以恒定 1000 RPM 拖动被测电机的转子轴,在端子上测线电压有效值,乘以 √2 得到峰值,再换算。
Kφ_mech = Vpeak_per_kRPM / 104.72 /* V·s/rad,机械角速度基准 */ invKFi = P * 104.72 / Vpeak_per_kRPM /* 电角速度基准下的 1/Kφ */104.72 是 1000 RPM 对应的机械角速度(1000 × 2π / 60)。极对数 P 在这里必须乘上去,因为估算器内部用的是电角速度。我见过把 P 忘了的,结果估算转速整体差 4 倍,一开始还以为是滤波器把信号吃掉了。
还有一条必须写进方案的限制:温度。Rs 随温度上升,ψPM 随温度下降(钕铁硼类磁体在 80 ℃ 以上温升明显),两个参数同时漂,估算器就同时错。补偿方案因电机、工况、运行模式而异,差异极大,不适合塞进一份通用方案里。我一般采取的做法是限定测试条件——需要大转矩的工况只持续运行一分钟以内,参数对比都在室温下做,方案里如实写明这一前提,比强行做温度补偿更诚实。
5. 避坑与排查:五类最容易翻车的现场问题
5.1 上电对齐就堵转,电流冲一下然后保护
现象:给使能信号后电机“嗡”一声,相电流瞬间冲到限流值,随后过流保护动作,转子一动不动或者只抖了一下。
原因基本都在开环阶段。锁定时间给短了,转子还没转到对齐位置就被拉着跑,转差太大,电流全变成了铜损;或者开环 q 轴电流参考给小了,克服不了负载的静摩擦,转子卡在原地。还有一种可能是强制角的增量方向与电机相序不一致,越拖越偏。
解决:把锁定时间从 200 ms 起往上加,同时用示波器看 q 轴电流的包络,等到它从峰值回落到稳定值,说明对齐完成。开环电流按额定转矩电流的 1.5 倍给,别怕大,开环阶段唯一的要求就是把转子拽起来。相序问题用一次手动旋转就能确认:断开驱动,短接两相,手动转轴感受阻尼,再换一组短接,阻尼最大的那组就是正确的相序组合。
5.2 切闭环瞬间抖一下,偶尔直接反转
现象:开环拖动一切正常,转速升到阈值切闭环,电机“咯噔”一下,运气好抖两下稳住,运气差直接反转,然后失步停机。
原因通常是角度不连续。开环用的是强制角,闭环用的是估算角,两者在切换那一刻如果差了几十度,Park 变换的坐标系瞬间转了那么多,Id、Iq 会跳变,转矩方向跟着乱。另一个可能是滤波器历史值——切换前速度滤波器里装的是开环速度,切换后要收敛到估算速度,中间那段过渡把角度积分带偏了。
解决:把角误差作为切换判据之一,只有估算角与强制角的偏差落在 ±15° 电角度以内、并且连续保持 20 个控制周期,才允许切换。切换那一拍把滤波器的状态直接赋成当前计算值,跳过收敛过程。如果反复切换失败,先不要怀疑算法,回到 5.1 检查 Kφ 是否标偏——Kφ 差 10%,估算角在 3000 转时会稳定偏 30° 以上,这时候切换怎么做都会抖。
5.3 高速段转速估高,相电流猛涨
现象:恒转矩区一切正常,转速过了基速,电流从 0.5 A 涨到 1.4 A 以上,估算转速显示反而比实际高,效率掉得很明显。
原因按概率排序:一是 1/Kφ 没做弱磁修正,等效磁链变小了但估算器还按原始值除,速度算错;二是电压裕量给得太满,母线电压一跌或者死区一吃,电压圆实际已经饱和,Id 抢不到预算,Iq 还在按原参考给,电流就顶上去了;三是 Ls 标小了,弱磁算出来的 id 不够,反电动势没压住。
解决:先把 Kφ 修正打开,用 4.3 里那段代码,看电流是否回落。如果回落但仍偏高,把电压裕量从 0.92 往下压到 0.88 试试,牺牲一点扩速范围换稳定。最后一招是重新标 Ls——注意要在工作频率下测(比如 1 kHz),低频测出来的电感值在高速段完全不适用。
5.4 带载跑十分钟后效率变差,估算角缓慢漂移
现象:冷机启动一切正常,跑十几分钟以后相电流缓慢上升、电机温度升高、转速显示开始和实测对不上,停机冷却后又能恢复。
这是典型的参数温漂,不是 bug。Rs 随温度上升,估算器里用的还是冷态值,反电动势反解出来的结果就偏小,Ed 的零点跟着漂,角度一点点走偏,走偏之后转矩效率下降、发热更多,形成正反馈。这个现象容易被误判成“算法不稳定”。
解决:短期办法是限定连续大转矩运行的时长,方案里写明测试条件,所有对比数据在相同温度和相同时长下采集。中期办法是在驱动器上贴一个 NTC,做一张 Rs-温度的分段表,按实测温度查表更新 Rs。ψPM 的温度补偿难度大得多,不同磁体、不同工况差异极大,不建议在通用方案里硬做,宁可把边界条件写清楚。这里没有取巧的办法,只能如实标注。
本文还有配套的精品资源,点击获取