☰
单分流无感FOC方案解析:电流重构、BEMF观测器与MCAT调参
2026/11/2 3:12:24 网站建设 项目流程

简介:《AN5327-3-phase Sensorless Single-Shunt Current-Sensing PMSM Moto》是一份面向汽车电机控制开发者的NXP应用笔记,围绕MC9S12ZVM器件讲解三相无传感器、单分流电流检测PMSM矢量控制驱动设计,适合具备嵌入式与电机控制基础、希望降低硬件成本并掌握FOC落地流程的工程师阅读。压缩包仅含1个PDF文件,约2.58MB,篇幅集中,便于按章节查阅。内容从系统概念切入,依次覆盖PMSM场定向控制基本原理、dq同步参考框架模型、输出电压激励与单电阻相电流测量、转子位置与速度估算,并延伸到MC9S12ZVML128的ADC/PWM/定时器等关键模块、设备初始化与软件架构,最后给出FreeMASTER和MCAT的调校与实时监控界面说明。已有212人学习,可作为汽车PMSM控制方案选型、算法梳理与调试工具使用的参考材料。

1. 三电阻换成单分流之后:AN5327 这套无感 FOC 方案值不值得抄

三电阻采样改成单分流电阻,硬件上少了两路运放、两路 ADC 通道和一堆走线,BOM 直接降一截;但软件里立刻多出三件事:PWM 边沿附近的采样窗口管理、三相电流的重构、以及低速大占空比时的“盲区”补偿。AN5327 这份应用笔记讲的正是这条路线——3 相无传感器单分流电流采样 PMSM 电机控制,主控是 MC9S12ZVML128,配套 FreeMASTER 上位机和 MCAT 调参工具。它适合谁?手里有风机、泵、EPS 类小功率电机项目,想砍掉霍尔和编码器,又想把采样电阻从三颗压到一颗的人。不适合谁?要求零速大转矩、或者 PWM 频率低到 8 kHz 以下的场景,单分流会很难受。下面按“理论—重构—观测器—调参”的顺序拆开写。

2. 从三相到 dq:FOC 变换链和电流环 PI 的落地算法

先把控制结构立住,后面所有的采样、观测器、调参都是围绕这个骨架转。AN5327 第 3 章给的 FOC 结构不复杂:测母线电压和电流 → Clarke → Park → d/q 轴 PI → 逆 Park → SVPWM。真正容易翻车的地方在细节,比如变换系数用幅值不变还是功率不变、PI 增益按什么带宽算、100 μs 的采样周期里 ADC 和计算怎么排。

2.1 为什么要把电流搬到旋转坐标轴上

PMSM 在三相静止坐标系下的方程是时变的,电感矩阵随转子角度变化,直接在三相上做 PI 控制,给定是正弦量,PI 对正弦量有稳态幅值和相位误差,转速一变误差跟着变。换到同步旋转的 dq 坐标系后,稳态下 id、iq 都是直流量,PI 的积分项能把误差压到零,这就是 FOC 能做出“零速满转矩”的根本原因。

转矩方程写成向量形式是 Te = (3/2)·pp·(ψd·iq − ψq·id)。表贴式电机 ψd ≈ ψPM、ψq ≈ 0,于是 Te ∝ iq,励磁分量 id 只负责削弱或增强磁场。所以工程上默认给 id* = 0(弱磁区除外),转矩指令直接映射成 iq*,速度环的输出就是 iq 的给定。这一步想清楚了,后面 MCAT 里为什么先调电流环再调速度环也就顺了。

dq 轴电压方程里有交叉耦合项 ωe·Lq·iq 和 ωe·Ld·id,还有 q 轴的反电动势 ωe·ψPM。转速越高,这三项越大,不解耦的话 d 轴电流会被 q 轴“带跑”,电流环带宽上不去。常规做法是前馈补偿:ud* 里减去 ωe·Lq·iq,uq* 里加上 ωe·Ld·id + ωe·ψPM。补偿量用实测转速和实测电流算,不要用给定值,否则动态过程里会有残差。

2.2 Clarke、Park 和逆变换的具体系数

这里有个坑:不同资料里 Clarke 变换的系数不一样,有的是 2/3,有的带 √(2/3)。AN5327 用的是非功率不变形式,转矩公式前带 3/2 系数。代码里必须和 PI 增益、观测器增益保持同一套约定,混用会导致转矩输出差 1.5 倍,现象是“电流环调好了但带载能力不对”。

import math SQRT3 = math.sqrt(3.0) def clarke(i_a, i_b, i_c): """幅值不变形式:i_alpha 与 i_a 同幅值,i_beta 超前 90 度。 要求 i_a + i_b + i_c == 0,第三相由前两相算出,避免引入采样误差。""" i_alpha = i_a i_beta = (i_a + 2.0 * i_b) / SQRT3 return i_alpha, i_beta def park(i_alpha, i_beta, theta_e): """theta_e 为电角度(弧度),由观测器给出。""" c, s = math.cos(theta_e), math.sin(theta_e) i_d = i_alpha * c + i_beta * s i_q = -i_alpha * s + i_beta * c return i_d, i_q def inv_park(u_d, u_q, theta_e): c, s = math.cos(theta_e), math.sin(theta_e) u_alpha = u_d * c - u_q * s u_beta = u_d * s + u_q * c return u_alpha, u_beta def inv_clarke(u_alpha, u_beta): """输出三相电压,供 SVPWM 计算占空比。""" u_a = u_alpha u_b = (-u_alpha + SQRT3 * u_beta) / 2.0 u_c = (-u_alpha - SQRT3 * u_beta) / 2.0 return u_a, u_b, u_c

这段是纯数学,没什么可优化的,但要注意两点。第一,clarke 里第三相不用传进来,让它在入口就满足基尔霍夫电流定律,单分流重构出来的三相天然有误差,再让三相各自独立参与变换等于把误差放大。第二,theta_e 必须是电角度,不是机械角度,换算关系是 θe = pp·θm,pp 是极对数,写代码时统一用全局的 pp 常量,别在两处各写一遍。

2.3 电流环 PI 增益怎么算出来

AN5327 第 3.2 节给了极点配置的推导:把 d 轴和 q 轴看成两个结构相同的被控对象,传递函数是 1/(Ls + R),用 PI 控制器对消掉电机的电气极点,闭环就退化成一阶或二阶系统。设定期望的自然频率 ω0 和阻尼比 ξ,增益可以写成:

Kp = 2ξ·ω0·L − R Ki = ω0²·L

R 项在大多数小功率电机上远小于 2ξ·ω0·L,所以实际调的时候常见近似是 Kp ≈ 2ξ·ω0·L、Ki ≈ ω0²·L。ω0 一般取电流环期望带宽的 2π 倍,工程上把带宽定在采样频率的 1/10 到 1/20 之间。采样周期 100 μs 对应 10 kHz,电流环带宽取 500 Hz 到 1 kHz 比较稳妥。

def current_pi_gains(R, L, fc_hz, xi=1.0): """按极点配置算 d/q 轴电流环 PI。 R: 相电阻(ohm) L: 相电感(H) fc_hz: 期望闭环带宽(Hz) xi: 阻尼比""" w0 = 2.0 * math.pi * fc_hz kp = 2.0 * xi * w0 * L - R ki = w0 * w0 * L return kp, ki # 举例:某小功率表贴式 PMSM,相电阻 0.35 ohm,相电感 0.8 mH kp_d, ki_d = current_pi_gains(0.35, 0.8e-3, 800.0) print(f"Kp={kp_d:.4f} Ki={ki_d:.2f}")

d 轴和 q 轴的电感往往不一样,凸极率高的电机必须分开算两组增益。代码里的 Ki 是连续域积分增益,写进 MCU 时要乘采样周期 Ts 转成增量式或位置式离散形式:位置式 PI 输出 u(k) = Kp·e(k) + Ki·Ts·Σe,增量式 u(k) = u(k−1) + Kp·(e(k)−e(k−1)) + Ki·Ts·e(k)。两种形式在定点 MCU 上表现不同,增量式不容易积分饱和,但需要额外存一个 u(k−1)。

参数表可以照着填:

参数含义典型取值影响
Ts电流环采样周期100 μs决定带宽上限
fc电流环闭环带宽500–1000 Hz越高响应越快,越容易振荡
ξ阻尼比0.8–1.0小了超调大
Kp比例增益按公式算影响动态响应
Ki积分增益按公式算影响稳态误差消除速度

2.4 100 μs 里怎么排时序

100 μs 的采样周期,扣掉 PWM 中断开销、ADC 转换、FOC 计算,剩下的余量并不多。常规排法是:PWM 采用中心对齐模式,在计数器过零点触发 ADC 采样,转换完成后进中断做 FOC 计算,计算结果在下一个 PWM 周期更新比较值。中心对齐的好处是采样点落在开关周期的中点,避开了开关瞬间的振铃和死区干扰,对单分流来说尤其重要,因为重构用的两个采样点必须落在有效矢量稳定区里。

计算量要控制。Clarke、Park、两个 PI、逆 Park 加起来十几次乘加,12 位定点在 25 MHz 主频下几微秒就够。真正吃时间的是观测器里的三角函数和反三角函数,AN5327 的做法是用 PLL 跟踪角度而不是直接 atan2,省掉一个反三角,代价是要多调两个 PLL 参数。这个取舍在后面的观测器章节展开。

3. 单分流电流重构:PWM 窗口、最小采样时间和扇区边界

这一节是整套方案里最“硬”的部分。AN5327 第 3.3 节的核心结论是:母线电流只有在特定开关组合下才等于某一相电流,一个 PWM 周期里至少要采到两个非零矢量对应的电流,才能用基尔霍夫定律算出第三相。听起来简单,实际上采样窗口的时间预算、扇区边界处的“不可测区”、死区和运放建立时间,每一项都能让波形变难看。

3.1 八个开关状态到底能测到哪一相

三相逆变器每个桥臂上下管互补,三个上管的导通组合一共 8 种:000 和 111 是零矢量,母线电流为零,测不到有效信息;剩下 6 个非零矢量,每个对应一相电流流进或流出母线。对应关系如下表,记住这张表,后面所有重构代码都是查它。

矢量上管状态 (A,B,C)母线电流 i_shunt可测相电流
V1100iAiA
V2110iA + iB = −iC−iC
V3010iBiB
V4011iB + iC = −iA−iA
V5001iCiC
V6101iA + iC = −iB−iB
V00000不可测
V71110不可测

SVPWM 一个周期内通常由两个相邻非零矢量加零矢量合成,比如参考矢量落在扇区 I 时用 V1 和 V2。那么在 V1 作用期间采一次得到 iA,在 V2 作用期间采一次得到 −iC,第三相 iB = −iA − iC 直接算出来。AN5327 的图 7、图 8 画的就是这个过程。

3.2 最小采样窗口怎么定

“采得到”不等于“采得准”。一段有效矢量从开关动作到电流稳定,中间要经过好几个环节:

  • 死区时间,通常 1–2 μs,期间母线电流不反映真实相电流;
  • 功率管开通和续流二极管反向恢复,几百纳秒的振铃;
  • 采样电阻后的运放建立时间,受带宽和压摆率限制,1–2 μs;
  • ADC 自身的采样保持时间,12 位精度下通常 1 μs 上下。

这几项加起来,T_min 一般在 3–5 μs。如果 PWM 频率 16 kHz,周期 62.5 μs,T_min 占到 5%–8%。当参考矢量靠近扇区边界时,两个有效矢量其中一个的作用时间会趋近于零,对应的那相电流就采不到了,波形上表现为周期性塌陷。这就是单分流的“不可测区”,AN5327 第 3.3.2 节明确提到了这个现象。

提示:T_min 不要拍脑袋按经验百分比取,一定要在示波器上看实际母线电流的建立过程。不同功率管、不同栅极电阻、不同运放,这个值差一倍都正常。

3.3 重构代码怎么写

下面这段是基于占空比判断扇区并选采样窗口的骨架,思路来自单分流重构的常规做法,和 AN5327 描述的流程一致。实际工程里 ADC 由 PWM 比较事件触发,代码只负责在中断里读结果并换算。

/* 单分流三相电流重构:输入两路 ADC 结果和当前扇区,输出 ia/ib/ic */ typedef struct { float i_shunt_a; /* 第一个窗口采到的母线电流 */ float i_shunt_b; /* 第二个窗口采到的母线电流 */ unsigned char sector; /* 1..6,由 SVPWM 计算得到 */ } CurrentRecon_t; void reconstruct_phase_current(CurrentRecon_t *r, float *ia, float *ib, float *ic) { switch (r->sector) { case 1: /* V1(100) + V2(110):采到 iA 和 -iC */ *ia = r->i_shunt_a; *ic = -r->i_shunt_b; *ib = -*ia - *ic; break; case 2: /* V2(110) + V3(010):采到 -iC 和 iB */ *ic = -r->i_shunt_a; *ib = r->i_shunt_b; *ia = -*ib - *ic; break; case 3: /* V3(010) + V4(011):采到 iB 和 -iA */ *ib = r->i_shunt_a; *ia = -r->i_shunt_b; *ic = -*ia - *ib; break; case 4: /* V4(011) + V5(001):采到 -iA 和 iC */ *ia = -r->i_shunt_a; *ic = r->i_shunt_b; *ib = -*ia - *ic; break; case 5: /* V5(001) + V6(101):采到 iC 和 -iB */ *ic = r->i_shunt_a; *ib = -r->i_shunt_b; *ia = -*ib - *ic; break; case 6: /* V6(101) + V1(100):采到 -iB 和 iA */ *ib = -r->i_shunt_a; *ia = r->i_shunt_b; *ic = -*ia - *ib; break; default: /* 零矢量区域,保持上一周期值,并置故障标志 */ break; } }

逻辑说明:sector 由 SVPWM 模块根据参考电压角算出,两个 ADC 结果分别在两个非零矢量的中点触发采样。每个 case 里的第一行和第二行对应两次采样,第三行永远是基尔霍夫定律算出来的,不额外采样。default 分支必须处理,因为零矢量区域采不到任何有效信息,直接沿用上一周期值并置位标志,比输出零更安全。

参数说明:i_shunt_a、i_shunt_b 是已经换算成安培的母线电流,换算系数是 ADC 码值 × Vref / (4096 × R_shunt × 运放增益)。R_shunt 常见取 5–20 mΩ,运放增益 5–10 倍,具体看电机额定电流。三个输出量必须满足 ia + ib + ic ≈ 0,实际重构出来会有几个毫安的残差,这是采样误差和死区导致的,属于正常范围。

3.4 不可测区怎么补

工程上常见的补法有三种。第一种是移相,在两个有效矢量的边界处人为错开 PWM 边沿,把短的那个矢量时间拉长到 T_min 以上,代价是谐波略增。第二种是最小脉宽钳位,直接限制占空比不让它落进不可测区,简单但会损失一点电压利用率。第三种是用观测器或者电机模型估算被丢掉的那一相,AN5327 走的是前两种加电流观测器的组合,低速段还会降 PWM 频率来换取更宽的采样窗口。

我一般会先在代码里加一个统计:每 1 ms 统计一次当前落在不可测区的次数,让 FreeMASTER 读出来。这个计数长期为零,说明调制策略没问题;如果随转速升高持续增长,就得回去查 T_min 和死区设置。

4. BEMF 观测器与启动流程:无感算法在 MC9S12ZVM 上怎么跑

位置和速度都靠估算,这是无感方案的另一半。AN5327 第 3.4 节和系统概念部分提到用的是扩展反电动势观测器,配合启动时的对齐(alignment)流程。观测器的输入是重构出来的 iα、iβ 和 SVPWM 输出的 uα、uβ,输出是电角度和电角速度。低速时反电动势幅值很小,观测器信噪比差,所以必须有一段开环强拖,等转速上来再切闭环。

4.1 扩展 BEMF 观测器的结构

在 αβ 静止坐标系下,PMSM 的状态方程可以写成:di/dt = (−R·i − e + u)/L,其中 e 是扩展反电动势,包含永磁体磁链和凸极效应两部分。观测器的做法是复制一份电流模型,用实测电流和估算电流的误差去修正估算的反电动势:

dî/dt = (−R·î − ê + u)/L + G·(i − î) dê/dt = −ω̂·J·ê + K·(i − î)

G 和 K 是观测器增益,J 是旋转矩阵。这套结构本质是 Luenberger 观测器,增益选得当,电流误差会收敛到零,反电动势估计随之收敛。转速和角度通过一个 PLL 从 ê 里解出来:

err = −êα·cosθ̂ − êβ·sinθ̂ ω̂ = ω̂ + Ki_pll·err·Ts θ̂ = θ̂ + (ω̂ + Kp_pll·err)·Ts

用 PLL 而不是直接 atan2 的好处是省掉反三角函数,而且在低速和噪声下角度曲线更平滑;坏处是多两个参数要调,PLL 带宽太高会引入噪声,太低会在大加减速时滞后。

4.2 启动三段式:对齐、强拖、切换

无感方案零速时反电动势为零,观测器给不出可信角度,所以启动必须分三段:

  1. 对齐阶段。给一个固定的电角度(通常 θe = 0),id 设成额定电流的 30%–50%,iq 设 0,持续 200–500 ms。目的是把转子强行拉到已知位置。电流不要给太小,否则静摩擦力矩会让转子停在中间某个角度,后面强拖直接失步。
  2. 开环强拖。按设定的加速度斜坡提升频率,电流幅值保持恒定,d/q 给定由开环角度合成。这一段观测器照常跑但不参与控制,只观察它的估算角度和开环角度的偏差。偏差收敛到阈值以内,才允许切换。
  3. 闭环切换。把角度源从开环切到观测器,iq 给定交给速度环。切换转速一般取额定转速的 5%–15%,太低观测器不稳,太高强拖阶段电流太大。

切换瞬间最容易翻车。我见过的现象是切换后电流抖动几下然后过流保护,原因多半是开环角度和观测器角度在切换时刻有几十度偏差,切过去相当于给了一个阶跃。稳妥做法是切换前做斜坡加权:θ = (1−k)·θ_open + k·θ_obs,k 在 100–200 ms 内从 0 爬到 1。

4.3 MC9S12ZVM 的外设怎么配

MC9S12ZVML128 这颗芯片是专门为电机控制做的,几个模块必须用对:

模块用途关键配置
PMF三相互补 PWM,中心对齐16 kHz 载波,死区 1–2 μs,比较事件触发 ADC
ADC12B12母线电流、母线电压采样12 位,由 PMF 触发,双通道交替
GDU栅极驱动电荷泵电压、死区插入、故障输入
内置运放采样电阻信号放大增益 5–10,带宽匹配
TIM16B8系统时基、FreeMASTER 记录器100 μs 中断

初始化顺序有讲究:先开时钟和 GDU 的电荷泵,等电荷泵电压稳定再使能 PMF 输出,否则前几个 PWM 周期的驱动电压不够,功率管工作在线性区,容易发热。ADC 校准要在上电时做一次,把零漂存进变量,后面每次采样都减掉。下面是初始化骨架,寄存器名按模块抽象写,具体位定义对照芯片参考手册填。

void motor_control_init(void) { /* 1. 时钟:锁相环倍频到 50 MHz,外设总线 25 MHz */ clock_init_50mhz(); /* 2. GDU:使能电荷泵,设置死区 1.5 us,等稳定 */ gdu_charge_pump_enable(); gdu_set_deadtime_us(1.5f); delay_ms(2); /* 3. ADC:上电校准,记录两路采样通道的零点 */ adc_calibrate(); g_adc_offset_ia = adc_read_avg(ADC_CH_IA, 64); g_adc_offset_ib = adc_read_avg(ADC_CH_IB, 64); /* 4. PMF:中心对齐,16 kHz,比较事件触发 ADC */ pmf_config_center_aligned(16000); pmf_set_adc_trigger(PMF_TRIG_ON_COUNTER_ZERO); pmf_enable_outputs(false); /* 先不输出,等对齐阶段再开 */ /* 5. 100 us 控制中断 */ timer_config_periodic_us(100); timer_start(); }

逻辑说明:这个顺序不能颠倒。电荷泵没稳就开 PWM,功率管栅极电压不足,轻则电流波形畸变,重则炸管;ADC 没校准就开始重构,两路电流会有固定偏置,Park 变换后变成 dq 轴上的直流误差,速度环积分项会一直往上顶。参数说明:死区 1.5 μs 是常见值,具体按功率管和栅极驱动选型定;ADC 零点取 64 次平均,能压掉大部分随机噪声;PMF 输出使能单独留一个开关,方便调试时先看波形再上电。

4.4 观测器代码落地

/* 扩展 BEMF 观测器 + PLL,100 us 调用一次 */ typedef struct { float R, L, Ts; float g; /* 电流误差修正增益 */ float i_alpha_hat, i_beta_hat; float e_alpha, e_beta; float theta_hat, omega_hat; float kp_pll, ki_pll; } Obs_t; void obs_update(Obs_t *o, float i_a, float i_b, float u_alpha, float u_beta, float theta_comp) { /* 1. 电流观测:用上一拍的反电动势估计推进模型 */ float err_a = i_a - o->i_alpha_hat; float err_b = i_b - o->i_beta_hat; o->i_alpha_hat += ((-o->R * o->i_alpha_hat - o->e_alpha + u_alpha) / o->L + o->g * err_a) * o->Ts; o->i_beta_hat += ((-o->R * o->i_beta_hat - o->e_beta + u_beta) / o->L + o->g * err_b) * o->Ts; /* 2. 反电动势自适应:用电流误差驱动,低速时靠给定值兜底 */ o->e_alpha += -o->omega_hat * o->e_beta * o->Ts + 2000.0f * err_a * o->Ts; o->e_beta += o->omega_hat * o->e_alpha * o->Ts + 2000.0f * err_b * o->Ts; /* 3. PLL 提取角度和速度 */ float s = sinf(o->theta_hat), c = cosf(o->theta_hat); float perr = -o->e_alpha * c - o->e_beta * s; o->omega_hat += o->ki_pll * perr * o->Ts; o->theta_hat += (o->omega_hat + o->kp_pll * perr) * o->Ts; /* 4. 角度归一化到 [0, 2pi) */ if (o->theta_hat > 6.2831853f) o->theta_hat -= 6.2831853f; if (o->theta_hat < 0.0f) o->theta_hat += 6.2831853f; } /* 串联超前补偿:抵消观测器和 PWM 的相位滞后 */ float theta_to_control(Obs_t *o) { return o->theta_hat + atanf(o->omega_hat * 1.5e-4f); }

逻辑说明:第一步是电流观测,g 越大收敛越快,但太大会把采样噪声放大;第二步的反电动势自适应里,2000.0f 是等效的观测器增益,量纲上等于 L 的倒数乘一个系数,调试时从 500 开始往上加,加到角度波形不再抖为止;第三步 PLL 的 kp_pll、ki_pll 按带宽 30–60 Hz 反算。第四步的角度归一化别省,float 累加久了会丢精度。

参数说明:theta_comp 那个超前补偿是血泪经验,PWM 更新延迟加上观测器相位滞后,转速高了以后控制角度会比真实角度落后十几度,表现为高速段电流偏大、效率下降。补偿量按 ωe·(1.5·Ts) 估算,1.5 是 PWM 和采样的等效延迟系数,不同实现略有差异,要用示波器看相电流和反电动势的相位关系来校准。

5. 常见问题排查:单分流方案最容易踩的五个坑

这一节按现象、原因、解决的顺序写,都是这套方案跑起来以后大概率会遇到的。有些问题在 AN5327 正文里点到过,有些是我自己调的时候补的。

5.1 电流重构类:低速波形周期性塌陷

现象:电机低速轻载运行,相电流波形每隔一段时间出现一次塌陷,周期和电角度周期一致。用 FreeMASTER 的高速记录器抓重构出来的 ia、ib、ic,能看到某一相在特定角度区间幅值突然变小,甚至掉到零附近。

原因:参考矢量扫过扇区边界,两个有效矢量里短的那个作用时间低于 T_min,对应的采样窗口落到死区或运放建立时间内,ADC 采到的是无效值。转速越低、占空比越小,这个区间占比越大。

解决:分三步走。先把 T_min 算准,用示波器看母线电流从开关沿到稳定的实际时间,不要用理论值;然后在 SVPWM 里加最小脉宽钳位,短矢量作用时间小于 T_min 时强制拉长到 T_min,差值从零矢量里扣;最后在重构代码里加有效性判断,采样窗口不足时用上一周期的电流加电机模型外推一拍,外推公式是 i(k) = i(k−1)·(1−Ts·R/L) + Ts·u/L,精度够撑过几拍。

5.2 电流重构类:三相电流之和不为零

现象:重构出来的 ia + ib + ic 不是零,偏差随温度和时间漂移,冷机时几十毫安,热机后上百毫安。dq 轴电流出现缓慢漂移,速度环积分项一直有输出。

原因:两路采样通道的运放零点、ADC 偏置、采样电阻温漂不一致。单分流方案里两路电流来自同一个采样电阻的不同时刻,运放只有一个,但 ADC 有两个采样保持通道,通道间偏置差异是主要来源。

解决:上电时做一次双通道零点校准,把两个通道各采 64 次平均存成偏移量,之后每次采样都减掉。运行中再加一个慢速校准:电机不转时(PWM 关闭、母线电压正常)重新采一次零点,更新偏移量。温度补偿可以用芯片内部温度传感器做线性修正,系数在温箱里标定两三个点就够。

5.3 观测器类:启动反转或抖动

现象:给启动指令后电机先反向转一下再正转,或者原地抖动几秒才起来。电流波形杂乱,有时候触发启动失败保护。

原因:三个可能。对齐电流太小,转子没被拉到指定位置;对齐时间太短,转子还在摆动就进入强拖;强拖加速度设得太快,转子跟不上旋转磁场,失步后观测器给出错误角度。

解决:对齐电流提到额定电流的 40% 左右,时间加到 500 ms,对齐期间观察 iq 是否稳定在零附近;强拖加速度按电机转动惯量算,从小往大试,找到不失步的最大值再降 30% 留余量;再加一个启动失败检测,强拖阶段如果观测器角度和开环角度的偏差连续 20 ms 超过阈值,直接停机重试,别硬撑。

5.4 观测器类:高速段角度滞后

现象:转速超过额定 70% 以后,相电流幅值明显变大,母线电流上升,效率下降,但转速还能稳得住。示波器上看相电流和相反电动势的相位,电流落后反电动势超过 90 度。

原因:观测器带宽不足加上 PWM 更新延迟,估算角度比真实角度滞后。滞后角度正比于转速,低速时几度看不出来,高速时能到二三十度,等效于 id 不为零,电流白白发热。

解决:在观测器输出上加串联超前补偿,补偿量按 ωe·Td 算,Td 是等效总延迟,通常取 1.5 倍采样周期。补偿角度要做限幅,超过 45 度就说明观测器本身有问题,得回去查增益。另一个办法是提高 PWM 频率,把延迟绝对量压下来,但单分流方案提高频率会压缩采样窗口,两边要权衡。

5.5 工具链类:FreeMASTER 记录器丢点

现象:高速记录器抓波形,采样点数和设定值对不上,波形上有断点或者台阶。降低采样率就好了,但降了又看不清细节。

原因:记录器的数据量超过了通信带宽。100 μs 采样、每点 4 字节、8 个变量,就是 320 kB/s,串口或者 CAN 都扛不住。

解决:分两级。第一级在 MCU 内部用 RAM 缓冲,先存后传,缓冲深度按芯片 RAM 定,MC9S12ZVML128 有 12 kB,存 1000 点 8 通道够用;第二级在 FreeMASTER 里配触发条件,只在故障前后各抓 200 ms,平时不传。另外变量能用 16 位就别用 32 位,能用整数就别用浮点,带宽能省一半。

6. MCAT 调参顺序与 FreeMASTER 验证:把波形调到能交付

工具链是这套方案里省时间最多的部分。MCAT 嵌在 FreeMASTER 里,分四页:电机参数、电流环、无感参数、速度环。调参顺序不能乱,一定是先电机参数、再电流环、再观测器、最后速度环,跳过任何一步都会在后面反复返工。

调参页关键项判断依据
电机参数极对数、相电阻、相电感、反电动势常数与铭牌或实测一致
电流环Kp、Ki、带宽阶跃给定下超调小于 10%,无持续振荡
无感参数观测器增益、PLL 带宽、切换转速全速域角度误差小于 5 度
速度环Kp、Ki、限幅阶跃响应 100 ms 内稳定,无静差

电机参数页最容易填错的是相电感。万用表测的是线电感,填进去要除以 2 才是相电感;如果电机是凸极的,d 轴和 q 轴要分开填。反电动势常数可以反推:用外部设备拖到额定转速,测线电压峰值,除以转速和 √3。

电流环调的时候,把速度环断开,直接给 iq 阶跃。用 FreeMASTER 的示波器看 iq 的实际响应,超调大就降 Kp,稳态有误差就加 Ki,振荡频率高说明带宽超了,往回退。这一步调到阶跃响应干净,后面的观测器才有意义。

无感参数页有个“观测器开环测试”模式,电机不转,手动给一个角度让观测器跟踪,看估算角度能不能跟上。跟不上的话先查电流采样是否正常,再调观测器增益。切换转速用自动搜索,MCAT 会从低到高扫一遍,找出观测器误差最小的点。

速度环最后调,Kp 从小到大加,加到有轻微振荡再退回 30%,Ki 从 Kp 的 1/10 开始加,加到阶跃响应无静差。限幅按电机额定转矩和母线电流能力设,别设太大,否则堵转时直接过流。

验证清单我一般这么过:空载全速域扫一遍,看角度误差和电流 THD;半载加减速,看母线电压波动和是否触发欠压;突加突卸负载,看恢复时间;堵转测试,看保护动作时间;最后高温老化两小时,看零点漂移和温升。这五项过了,才敢说这套参数能交付。

说个我自己的教训。早期调这类方案,我总想一步到位把速度环参数也一起调了,结果电流环还带着超调就去调速度环,两个环互相打架,调一整天都在原地转。从那以后我每次调参都强制走一遍顺序:电机参数核对、电流环阶跃、观测器开环跟踪、闭环切换、速度环阶跃,中间任何一步不达标就停下来,绝不往下走。这套流程看着慢,实际比来回返工快得多。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询