简介:AN5327 是恩智浦(NXP)发布的应用笔记,面向汽车电子与电机控制领域的嵌入式工程师及进阶学习者,讲解3相永磁同步电机(PMSM)在无位置传感器、单分流电阻电流采样条件下的矢量控制驱动设计。资料围绕 MC9S12ZVM 系列器件展开,先交代系统概念,再逐层剖析场定向控制的 dq 轴模型、输出电压激励与相电流测量、转子位置与速度估算,随后说明 MC9S12ZVML128 的 ADC、PWM、定时器等关键模块初始化与软件架构分层,并给出 FreeMASTER 调试界面与 MCAT 工具的参数整定、实时监控流程。压缩包内仅 1 个 PDF,约 2.58MB,目录与图表完整,便于按章节查阅。已有 212 人学习下载。读者可从中理清单分流采样下的相电流重构思路、无感算法选型依据以及速度环与电流环的调参路径,对搭建低成本车用电机驱动原型有直接参考意义。
1. 单分流电阻测三相电流:无传感器 FOC 的「不可能三角」是怎么被拆开的
在多数伺服驱动方案里,想做三相 PMSM 的磁场定向控制(FOC),往往要付两份硬件账单:至少两颗相电流采样电阻,再加一个编码器或旋变。AN5327 给出的方案把这两项都砍了——一颗 DC 母线分流电阻,加一套无传感器估计算法,就在车规环境里跑通了闭环 FOC。听上去像堆砌名词,可真正让工程落地的不是某个神秘算法,而是「单分流重构」和「扩展反电动势观测」这两件事在编程层面的严格配合:采样窗口留多长、重构在哪一拍触发、观测器带宽压到多少,任何一项没对齐,波形就开始抖。这篇把这两个机制拆开讲,看看它凭什么能省掉两颗传感器还不掉链子。
2. 单分流重构:为什么两个采样点就够还原三相电流
先抛开 FOC 的控制逻辑,回到最朴素的电路问题。一套三相电压源型逆变器,六个功率管组成三个半桥,电机三相星形连接。如果只允许在直流母线的负端放一颗分流电阻,那么流过这颗电阻的电流等于什么?答案不是「某一相电流」,而是「当前开关组合所决定的一条回路电流」。这就是单分流方案能成立、也最容易翻车的地方。
2.1 电压矢量与 DC 母线电流的对应关系
三相逆变器有 8 种合法开关状态:000、001、010、011、100、101、110、111,其中 000 和 111 是两个零矢量,另外六个是有效矢量。每一个有效矢量对应着六个功率管里「两个上桥臂 + 一个下桥臂」或「一个上桥臂 + 两个下桥臂」的导通组合。关键在于,不同的组合会把不同的相绕组串进 DC 母线回路里,于是分流电阻上读到的电流就对应着某一相电流或其反向。
把六种有效矢量的对应关系列出来,机制就一目了然:
| 矢量 | 导通上桥臂 | 导通下桥臂 | 分流电阻电流 |
|---|---|---|---|
| 100 | A | B、C | i_a |
| 110 | A、B | C | i_c |
| 010 | B | A、C | i_b |
| 011 | B、C | A | i_a |
| 001 | C | A、B | i_c |
| 101 | A、C | B | i_b |
规律很清晰:当两个下桥臂同时导通时,分流电阻读到的就是被上桥臂单独驱动的那一相电流;当一个下桥臂单独导通时,分流电阻读到的就是这个下桥臂所接的那一相电流。换句话讲,每一种有效矢量只暴露一相电流,而且过零点附近的极性会翻转。单分流重构的全部数学,就是在这个硬约束下想办法在一个 PWM 周期里凑出两个相电流。
SVPWM 在一个 PWM 周期里通常只合成两个相邻的有效矢量,外加零矢量来填补剩余时间。假设参考电压落在扇区 1,那么本周期的有效矢量就是 100 和 110:在 100 作用期间采到 i_a,在 110 作用期间采到 i_c,然后靠基尔霍夫电流定律算出 i_b = -(i_a + i_c)。这就是「两个采样点还原三相电流」的物理本质,并不涉及任何近似或插值,纯粹是拓扑决定的。
注意:这里的「两个采样点」必须落在两个不同的有效矢量窗口内,且每个窗口都要留够运放建立时间和 ADC 采样保持时间;否则读到的不是电流,是噪声。
2.2 采样窗口塌缩:扇区边界处电流「消失」的物理原因
单分流方案最反直觉的现象发生在这里。同一个 SVPWM 调制策略下,参考电压越靠近扇区边界,两个有效矢量中有一个的作用时间就越短。当参考电压几乎贴着扇区中心线时,一个有效矢量占了大半周期,另一个只剩下一丝;当参考电压跨过边界进入下一个扇区,原本的「大矢量」会突然退化成「小矢量」,采样窗口在那一拍几乎消失。
从时域波形看,就是某相电流的采样值在扇区切换附近突然跳变,甚至完全采不到。工程上把这叫「采样盲区」(blind zone),本质是 PWM 边沿靠得太近,分流电阻上的电流脉冲宽度小于采样电路能够分辨的最小时间。运放从零到稳定需要建立时间,ADC 的采样保持电容也需要充电时间,两者加起来构成一个硬门限——短于这个门限的脉冲,采样结果没有物理意义。
这个盲区不是单分流方案独有的,但它在单分流方案里最致命,因为整个重构依赖「两个窗口都有有效采样」。如果只采到一个相电流,第三个电流就算不出来,Clarke 变换出来的 i_alpha、i_beta 就是错的,FOC 电流环会跟着发疯。AN5327 里提到的「100 μs 采样周期」在数字上很宽裕,真正限制性能的是这个亚微秒级的窗口问题,而不是采样周期本身。
常见的规避思路有三类。第一类是移相法:把 PWM 边沿整体平移,让有效矢量窗口向中心靠拢,人为撑到够采样为止;代价是引入额外的电流纹波。第二类是插入测量矢量:在原本不需要的时段里临时插入一个短矢量,专门用于采样;代价是调制比上限下降。第三类是两相调制:让某一相桥臂在一个 PWM 周期内不翻转,从而保证至少两个窗口有足够时间;代价是开关损耗分布不均。AN5327 没有在文本里展开具体采用哪一种,但从「100 μs 采样周期 + 单分流」的配置看,移相或两相调制是更现实的选择。
2.3 重构算法与代码落点
把上面的机制写成代码,核心就是三段:扇区判定、窗口判定、三相互补。下面这段 C 代码是典型的单分流重构骨架,参数含义在代码后说明。
#define T_MIN_TICKS 40 /* 最短采样窗口,按运放建立+ADC 采样保持实测标定 */ typedef struct { int16_t ia; int16_t ib; int16_t ic; uint8_t sector; /* 1..6,由 SVPWM 模块给出 */ uint8_t valid; /* 本周期重构是否可信 */ } PhaseCurrent_t; static void reconstruct_current(PhaseCurrent_t *pc, uint16_t t1, uint16_t t2, int16_t adc_a, int16_t adc_b) { /* 1. 两个有效矢量窗口都要够长,否则本周期重构不可信 */ if (t1 < T_MIN_TICKS || t2 < T_MIN_TICKS) { pc->valid = 0; return; /* 交给外层做移相补偿或保持上一拍 */ } /* 2. 按扇区把两次 ADC 采样映射到对应相 */ switch (pc->sector) { case 1: pc->ia = adc_a; pc->ic = adc_b; break; /* 100 -> ia, 110 -> ic */ case 2: pc->ib = adc_a; pc->ia = adc_b; break; /* 110 -> ic, 010 -> ib */ case 3: pc->ib = adc_a; pc->ic = adc_b; break; case 4: pc->ic = adc_a; pc->ia = adc_b; break; case 5: pc->ic = adc_a; pc->ib = adc_b; break; case 6: pc->ia = adc_a; pc->ib = adc_b; break; default: pc->valid = 0; return; } /* 3. 基尔霍夫电流定律补齐第三相 */ if (pc->sector == 1 || pc->sector == 3 || pc->sector == 5) pc->ib = -(pc->ia + pc->ic); else pc->ia = -(pc->ib + pc->ic); pc->valid = 1; }t1、t2是 SVPWM 模块输出的两个有效矢量作用时间,单位是定时器 tick;T_MIN_TICKS是硬件相关门限,必须用示波器在实际板子上标定,不能拍脑袋填。adc_a、adc_b是两次触发采样得到的原始码值,它们的物理含义随扇区变化,所以第 2 步的映射不能省。第 3 步的基尔霍夫补相看起来只是减一下,但它把「两个采样窗口」扩展成了完整的三相信息,是整个单分流方案的收口动作。
pc->valid = 0的路径才是工程上真正花时间的地方。AN5327 里没有把补偿策略写死,实际实现要么在下个 PWM 周期把边沿往中心挪一点(移相),要么暂时沿用上一周期的电流值做开环过渡。前一种会牺牲一点电流纹波,后一种会牺牲一点动态响应,选哪条取决于电机工况更怕哪一种。
3. 无传感器位置估计:扩展 BEMF 观测器如何撑起低速段
重构出三相电流之后,FOC 还缺一个关键输入:转子角度 θ。没有编码器,角度只能从电机端电压和电流里「反推」出来。这一章把 PMSM 在 dq 坐标系下的模型摊开,再看扩展反电动势观测器是怎么从模型里把角度抠出来的。
3.1 dq 模型里被补偿掉的交叉耦合项
PMSM 在三相静止坐标系下的方程写起来一大坨,自感和互感随角度变化,根本没法直接设计控制器。Clarke 变换把它压到两相静止坐标系(α、β),Park 变换再把它旋到随转子同步的 dq 坐标系,方程就干净了:
u_d = R_s·i_d + L_d·di_d/dt - ω_e·L_q·i_q u_q = R_s·i_q + L_q·di_q/dt + ω_e·L_d·i_d + ω_e·ψ_PMR_s是定子电阻,L_d、L_q是 d 轴和 q 轴电感,ω_e是电角速度,ψ_PM是永磁体磁链。两条方程里有三样东西值得盯住:-ω_e·L_q·i_q和+ω_e·L_d·i_d是交叉耦合项,ω_e·ψ_PM是 q 轴上的反电动势项。交叉耦合项的意思是「d 轴电压会受 q 轴电流影响,反过来也一样」,如果不补偿,d 轴和 q 轴就没法独立控制,电流环的动态会被互相拖拽。
所以电流环 PI 的输出不是直接当电压用,而是先扣掉耦合项和反电动势,再送给 SVPWM:
u_d* = PI_d(i_d_ref - i_d) - ω_e·L_q·i_q u_q* = PI_q(i_q_ref - i_q) + ω_e·L_d·i_d + ω_e·ψ_PM这一步在代码里通常放在电流环 ISR 的最后,紧挨着逆 Park 变换。补偿项里的ω_e来自观测器输出,i_d、i_q来自上一拍的反馈,所以严格说这是一个带一拍延迟的前馈,低速时影响不大,高速时要在观测器带宽上留余量。PI 增益按极点配置给:Kp = ω_0·L,Ki = ω_0·R,ω_0是期望的电流环闭环带宽,一般取采样角频率的十分之一到五分之一。
3.2 扩展 BEMF 观测器的状态空间结构
反电动势项ω_e·ψ_PM只在 q 轴出现,但它随角度旋转,在 αβ 坐标系里表现为一对正交分量:
e_alpha = -ω_e·ψ_PM·sin(θ_e) e_beta = ω_e·ψ_PM·cos(θ_e)只要能把e_alpha、e_beta估出来,角度就是θ_e = atan2(-e_alpha, e_beta)。问题是反电动势不是直接可测量,它藏在电流的导数里,而电流导数对噪声极其敏感。观测器的做法是把反电动势当成一个「扩张状态」,和电流一起估:
d(i_hat_alpha)/dt = (1/L)·(u_alpha - R·i_hat_alpha - e_hat_alpha) + g1·(i_alpha - i_hat_alpha) d(e_hat_alpha)/dt = g2·(i_alpha - i_hat_alpha)β 轴同理。g1、g2是观测器增益,决定收敛速度;i_alpha - i_hat_alpha是电流估计误差,它同时驱动电流状态和反电动势状态往真实值靠。这种结构在控制里叫龙伯格观测器,工程上常把它离散化后塞进和电流环同一个 ISR 里跑,保证u_alpha、u_beta和i_alpha、i_beta是同一拍的数据。
观测器能工作的前提是反电动势幅值足够大。电机静止或极低速时ω_e·ψ_PM接近零,e_alpha、e_beta淹没在噪声里,atan2算出来的角度基本是随机的。这就是无传感器方案必须配一个「启动对齐」阶段的原因,不是算法缺陷,是物理约束。
3.3 启动对齐与观测器接管边界
启动对齐的做法很直接:给 d 轴注入一个固定电流矢量,q 轴给零,电角度固定为 0,让转子被定子磁场硬拉到已知位置。对齐电流一般取额定电流的 30% 到 50%,太小拉不动,太大会触发过流保护;对齐时间要足够让转子稳定,通常几百毫秒量级。
对齐完成后进入开环加速段:角度由内部斜坡发生器给定,电流环闭环、速度环开环,电机被拖着升速。等到反电动势幅值超过一个阈值(比如额定反电动势的 10% 到 15%),再切到观测器闭环。切换瞬间最容易出问题——如果观测器估的角度和开环角度差太多,切换会导致转矩突变,严重时直接失步。
AN5327 里把整个过程描述为「start up with alignment」,但没有展开切换判据。工程上常见的做法是加一个角度误差门限:观测器角度和开环角度之差小于某个值,并且持续若干个 PWM 周期,才允许切换。这相当于给切换加了一道「后悔药」,避免观测器刚收敛时的抖动被直接灌进电流环。
4. 单分流重构与无感启动的常见问题排查
前面把机制讲完了,这一章换成排查视角。下面四条是单分流 + 无感方案在台架上最容易撞见的现象,每条按「现象 → 原因 → 解决」展开,都是踩过的坑。
4.1 轻载低速时相电流波形带毛刺
现象:电机空载或轻载、转速在额定 10% 以下时,用示波器看重构后的相电流,基波上叠着一层不规则的尖刺,电流环输出跟着抖。
原因:轻载时调制比很低,两个有效矢量都很短,t1、t2频繁掉到T_MIN_TICKS以下,重构走了valid = 0的兜底路径,但兜底逻辑本身不连续——上一拍还在用旧值,下一拍又切回新采样,电流反馈在两种来源之间反复横跳。另一种可能是 ADC 触发时刻和 PWM 边沿没对齐,采到的正好是电流换向的瞬态。
解决:先把兜底策略统一成一种,要么全程移相补偿,要么全程保持上一拍,不要在两种之间切换;然后用示波器同时抓 PWM 边沿和 ADC 触发信号,确认采样点落在有效矢量窗口的平稳段中间,而不是贴着边沿。轻载工况下还可以适当降低 PWM 频率,把有效矢量时间整体拉长。
4.2 启动瞬间过流保护误触发
现象:给启动命令后电机还没转起来,过流保护就报了,复位后重试有时能过、有时过不去。
原因:对齐电流给得太大,或者对齐时间不够,转子还没稳定就进入开环加速,电流环为了追速度指令把 q 轴电流顶到限幅。还有一种隐蔽情况是观测器在零速附近输出乱跳的角度,虽然还没切闭环,但补偿项里的ω_e被算成了一个非零值,前馈电压把电流顶偏了。
解决:把对齐电流降到额定值的 30% 左右,对齐时间延长到转子明显静止为止;在开环加速段把观测器输出强制清零,不要让它参与任何补偿;切换判据里加上「反电动势幅值持续超过阈值 N 个周期」的条件,避免单拍误判。
4.3 中速段观测器发散、速度环来回摆
现象:转速升到额定 30% 到 60% 之间时,速度反馈开始周期性摆动,幅度越来越大,最后触发过载保护。
原因:观测器增益g1、g2是按某个固定带宽整定的,中速段反电动势变化率变快,固定增益跟不上;或者模型参数R_s、L_d、L_q和实际电机偏差太大,观测器内部模型和真实电机对不上,误差被积分放大。
解决:先测实际电机的相电阻和电感,把模型参数校准;然后把观测器增益和电角速度挂钩,低速时用低带宽抑制噪声,高速时提高带宽跟动态;最后检查观测器离散化用的采样周期是否和电流环一致,不一致会引入额外的相位滞后。
4.4 MCAT 里调好的参数烧录后行为不一致
现象:在 MCAT 图形界面里调好的电流环、速度环、观测器参数,在线运行很顺,烧录到量产固件后同样的电机却表现不一样。
原因:MCAT 在线调试时用的是调试器的采样节奏和中断优先级,量产固件里这些配置可能被改过;另一种情况是参数存到 Flash 后没有校验,某几个参数在写入时被截断或错位,读回来是个离谱的值。
解决:把 MCAT 导出的参数和量产固件的编译配置对齐,尤其是 PWM 频率、ISR 优先级、ADC 触发源这三项;在参数加载函数里加校验和与范围检查,任何一项越界就回退到默认值并置一个故障标志,别让错参数悄悄跑起来。
5. 成本、精度与可观测性的三角取舍
单分流 + 无传感器这套组合,本质上是在三个维度上做了一次明确的交换:省掉两颗采样电阻和一个位置传感器,换来的是采样窗口受限、低速段依赖观测器、零速附近必须靠对齐。这三个代价不是实现缺陷,是拓扑和物理决定的,换任何算法都绕不开。
从取舍的角度看,这套方案最适合的场景是中高速、对成本敏感的驱动——风机、泵类、辅助泵、执行器之类,转速基本不停在零附近,调制比也不会长期贴着扇区边界。反过来,如果应用需要长时间零速大转矩(比如某些爬行工况),或者需要极高的电流环带宽,单分流方案的盲区问题会被放大,这时候多分流电阻或加位置传感器反而是更诚实的选择。
验证这套方案是否真的 work,我一般会盯三个指标:一是重构后的三相电流在示波器上和实际探头的偏差,尤其看扇区切换点附近;二是观测器估计角度和开环角度在切换瞬间的差值,差值越小切换越平顺;三是轻载低速下的电流纹波,纹波突然变大往往意味着采样窗口已经塌了。这三个指标不需要昂贵设备,一台示波器加 MCAT 的 recorder 就能覆盖。
从那以后,我每次给单分流方案上电,都会先把 PWM 边沿和 ADC 触发点抓出来对一遍,再让电机在最低速空载跑五分钟看电流波形,确认没有窗口塌缩的毛刺,才敢往高速推。这套习惯救过我好几次,也让我对「省下来的硬件成本到底换走了什么」有了更具体的体感。希望帮到你。
本文还有配套的精品资源,点击获取