简介:面向汽车电机控制方向的嵌入式开发者与学习矢量控制的学生,这份PDF应用笔记围绕三相无传感器、单分流电阻电流采样的永磁同步电机驱动设计展开,重点解决低成本硬件条件下实现速度闭环与转子位置/速度估算的问题。内容以MC9S12ZVM器件为平台,讲解PMSM磁场定向控制原理、dq坐标系电机模型、输出电压作用与相电流测量,以及基于扩展反电动势观测器的无位置传感器算法,并延伸到MC9S12ZVML128上的软件架构、初始化流程和关键外设协同。FreeMASTER与MCAT章节可用于参数整定、实时监控与性能调优,适合把控制理论落到车规级电机控制代码中的读者。资源包为1个PDF文件,约2.58MB,按系统概念、控制策略、软件实现和调试界面组织,便于按主题查阅;目前已有212人学习,可作为单分流PMSM方案入门与工程对照的参考资料。
1. 单电阻无传感器:把三个传感器和一个编码器一起删掉,代价落在哪
三个电流传感器加一个旋变,是很多人心里三相 PMSM 矢量控制的标准配置。AN5327 走的路线相反:板上只留一个采样电阻串在直流母线,转子位置和转速全由算法从电压电流里反推。硬件成本压到很低,直觉上精度和动态响应也该一起塌掉,但它没有。要搞懂 3 相无传感器单分流电流感应 PMSM 电机控制,关键不在“省了什么”,而在省掉的东西被什么机制接住了:母线电流靠 PWM 时序在时间轴上切片,重构出三相电流;转子位置靠观测器在数学模型里虚拟出来。两件事都要求时序精确到微秒、运算精确到定点数量级,对不上就是电流畸变、低速抖动、启动失败,而多数人第一反应是去调 PID,方向从一开始就错了。下面按数学基础、单电阻重构、观测器、实现与踩坑的顺序,把这套机制的骨架拆开。
2. FOC 的坐标系变换:为什么把交流量搬进 dq 之后,PI 控制器就够用了
2.1 从三相静止到两相旋转:Clarke 与 Park 各自消除了什么
三相 PMSM 的定子绕组在空间上互差 120°,通入三相正弦电流后,合成的是一个旋转的定子磁动势矢量。工程师真正想控制的其实是这个矢量的幅值和方向,而不是三根线上的瞬时电流值——后者是随转子位置不停正弦变化的三条曲线,任何控制器想直接跟踪它们,都会被“一直在变”这件事拖住。Clarke 变换做的是第一刀:把三个耦合的量压成两相正交分量 α、β,绕组之间的互感耦合在这里被消除,从三个约束变成一个平面上的矢量。这一步没有引入任何旋转,αβ 仍然是静止坐标系,量还是正弦的。
Park 变换是第二刀,也是整个 FOC 成立的关键。它把 αβ 平面上的矢量投影到一个跟着转子同步旋转的坐标系上,d 轴对准转子磁链方向,q 轴超前 90°。投影之后,稳态下的 dq 分量是直流量——转子转多快,坐标系就转多快,矢量与坐标系相对静止。这就是为什么 PI 控制器够用:PI 对直流量有无穷大直流增益,稳态误差可以压到零;换成 αβ 下的正弦量,PI 的有限增益只会带来幅值衰减和相位滞后,转速一高就跟不上。
这里有个容易被忽略的细节:变换系数有两种约定。等幅值变换带 2/3 系数,变换前后矢量幅值相等,代价是功率不守恒;等功率变换带 √(2/3),功率守恒但幅值被缩放。这份应用笔记的转矩公式里明确出现 3/2 这个常数,说明它用的是非功率不变(等幅值)形式。这件事不影响控制,但影响定标:如果代码里按等功率形式准备了 Q 格式的系数,又拿理论转矩去核对实测转矩,两者会差一个常数因子,现象是“电机转得对,扭矩读数差一截”,查半天查不出原因。
2.2 dq 轴电压方程里的耦合项:不补偿会怎样
把三相电压方程投影到同步旋转坐标系后,PMSM 的 dq 轴电压方程长这样:
ud = Rs·id + Ld·did/dt − ωe·Lq·iq uq = Rs·iq + Lq·diq/dt + ωe·Ld·id + ωe·ψPM
第一项是电阻压降,第二项是电感上的暂态压降,剩下的带 ωe 的项是耦合项和反电动势。看结构就知道,d 轴电压里混进了 iq,q 轴电压里混进了 id,还有一项完全由转速决定的反电动势 ωe·ψPM。控制器输出 ud、uq 是想控制 id、iq 的,但这两个被控对象之间是互相串的:突加 q 轴电流,d 轴电流会跟着动;转速一变,q 轴电压需求整体平移一个 ωe·ψPM。
转速低的时候这些项数值小,不补偿也能转;转速上去之后它们占主导,后果是动态过程里 id 大幅波动(凸极机里 id 波动又反过来影响转矩),电流环带宽被压死,加速时电机发出明显的啸叫甚至失步。所以 FOC 的标准做法是在 PI 输出上加前馈补偿,把耦合项和反电动势显式抵掉,剩下两个结构完全一致的一阶惯性环节——Rs + L·s。补偿项里的 ωe 用观测器估计的转速,Ld、Lq、ψPM 用 MCAT 里标定出来的参数,参数不准的时候补偿不干净,残余部分就变成动态过程中的电流毛刺,这是后面调参要反复对的地方。
2.3 电流环 PI 增益:ω0 和 ξ 是怎么定出来的
补偿之后 d 轴和 q 轴各是一个 Rs + L·s 的一阶对象,用标准 PI 控制器去闭环,可以按二阶系统的极点配置反推增益。设期望闭环自然频率 ω0、阻尼比 ξ,则
Kp = 2ξω0·L − Rs Ki = ω0²·L
两个式子的物理含义很直接:积分增益决定把稳态误差压掉的速度,正比于电感;比例增益除了带宽,还要减掉被控对象自带的电阻极点。实际工程里 ω0 不是随便填的,它受采样频率约束——控制周期 100 μs 意味着采样频率 10 kHz,电流环带宽通常取采样频率的 1/10 到 1/20,也就是 ω0 在几百 Hz 的量级,再往上离散化和采样延迟会让相位裕度迅速被消耗。
ξ 一般取 0.707(二阶 Butterworth 响应,无超调的临界点)或 1.0(更保守,响应慢一点但不振荡)。这两个参数在 MCAT 里是开放给用户调的,工具会把 ω0、ξ 换算成实际的 Kp、Ki 写进代码里的参数结构体。很多人调电流环时直接改 Kp、Ki 数值试,其实等价于在盲调 ω0 和 ξ,不如反过来:先在 MCAT 里设定期望带宽,让工具算,再看阶跃响应是不是对得上。这里还有一个隐含前提——Ld、Lq 是从电机参数表或 MCAT 的电机参数辨识环节来的,如果电感值标错一倍,换算出来的 Kp 也就错一倍,调参调不出来是必然的。
2.4 变换链在定点 MCU 上的落地:位宽和角度索引
器件是面向汽车应用的 16 位内核,没有浮点单元,整条 FOC 链路都跑定点。这一步的问题往往不在公式,在定标和位宽上。
/* 等幅值 Clarke:三相 -> 两相静止 */ static inline void clarke(const int16_t ia, const int16_t ib, const int16_t ic, int16_t *alpha, int16_t *beta) { /* α 轴与 a 轴重合,省掉一次乘加 */ *alpha = ia; /* 1/sqrt(3) ≈ 0.57735,Q15 表示 18919 */ *beta = (int16_t)(((int32_t)(ib - ic) * 18919) >> 15); } /* Park:静止 -> 旋转,sin/cos 由电角度索引查表 */ static inline void park(const int16_t alpha, const int16_t beta, const int16_t sin_t, const int16_t cos_t, int16_t *d, int16_t *q) { int32_t d_tmp = (int32_t)alpha * cos_t + (int32_t)beta * sin_t; int32_t q_tmp = (int32_t)beta * cos_t - (int32_t)alpha * sin_t; *d = (int16_t)(d_tmp >> 15); /* Q15 归一化 */ *q = (int16_t)(q_tmp >> 15); }clarke里 alpha 直接取 ia,是因为等幅值变换下 α 轴与 a 轴重合,省掉一次乘加;β 需要 (ib − ic)/√3,18919 就是 0.57735 的 Q15 表示。乘积用 int32 承接再右移,是因为两个 int16 相乘最大能到 2^30,直接塞回 int16 会溢出——这类问题小电流时跑起来完全正常,满载时才翻车,属于最难查的一类。park的 sin/cos 来自角度查表,索引是观测器输出的电角度累加值,表长一般取 2 的整数次幂,用位与代替取模,这样在中断编程里不会引入除法开销。
反 Park 变换同理,方向相反,复用同一份查表值。整条链路每 100 μs 跑一次,运算量集中在两次 Park、两次反 Park 和两次 PI 上,定点实现下 16 位内核能留出足够裕量给 ADC 采样和故障检测。位宽规划要一次性做对:中间结果统一用 int32,只在写回状态变量时截断,截断点越少越好。
3. 单电阻电流重构:一个采样电阻怎么还原三相电流
3.1 八个基本电压矢量与母线电流的对应关系
三相逆变桥有 6 个开关管,每相上下管互补(考虑死区),有 8 种开关组合,对应 8 个基本电压矢量:6 个非零矢量幅值相同、方向相差 60°,外加 2 个零矢量(000 和 111,电机端被短接,输出电压为零)。
关键点在于:采样电阻串在直流母线负极和桥臂之间,它测的是从母线流入逆变桥的电流,不是某一相电流。而母线上流过的电流取决于当前哪几个上管导通。以矢量 100 为例(A 相上管、B/C 相下管导通),电流从母线经 A 相流入电机,从 B、C 相流回负极,此时 i_dc 就是 ia。矢量 101(A、C 上管导通)时,电流经 A 相流入、从 B 相流出,i_dc = −ib。零矢量时三个上管全通或全断,电机端短接,母线电流为零,采不到任何相电流信息。
| 矢量(A B C) | 导通的上管 | 母线电流 i_dc | 对应相 |
|---|---|---|---|
| 100 | A | ia | A |
| 110 | A、B | −ic | C |
| 010 | B | ib | B |
| 011 | B、C | −ia | A |
| 001 | C | ic | C |
| 101 | A、C | −ib | B |
| 000 / 111 | 无 / 全 | 0 | 无 |
六个非零矢量刚好覆盖了三相电流的正负两种观测方式,每个 PWM 周期只要采到其中两个,第三相就能由基尔霍夫电流定律 ia + ib + ic = 0 算出来。这就是单电阻能成立的全部依据——它并非靠测一相推出三相,其原理是利用“不同开关状态下母线电流对应不同相”这个时间复用关系。理解这一点,后面所有限制条件都能自然推出来:能采到哪两相、什么时刻采,完全由当前矢量在扇区里的位置决定。
3.2 双矢量采样窗口:为什么一个 PWM 周期里必须采两次
SVPWM 用相邻两个非零矢量加零矢量合成参考电压矢量。以七段式调制为例,一个周期内的作用顺序是:零矢量 → 矢量 1 → 矢量 2 → 零矢量 → 矢量 2 → 矢量 1 → 零矢量。两个非零矢量的作用时间 T1、T2 由参考矢量在扇区里的位置决定,两者之和不超过 PWM 周期。
采样必须落在非零矢量作用期间,而且要在开关动作完成后留出稳定时间:死区时间、开关管开通延时、运放和 RC 滤波的建立时间、ADC 采样保持时间,加起来通常需要 1~2 μs 的最小窗口。这份应用笔记选的是 100 μs 的控制周期,非零矢量持续时间在大多数工况下够用,但边界情况不够。
采到两个电流后,第三相由 KCL 得到。这里有个实现细节值得注意:两个采样点对应的矢量是相邻的,它们给出的两相电流符号可能不同(一个正、一个负),重构时要统一到同一极性约定,否则 dq 变换出来的矢量方向会偏 60° 的整数倍,现象是电机能转但转矩明显偏小、电流明显偏大,而电流环自己觉得一切正常。
3.3 采样窗口塌缩:低调制比和扇区边界处的不可观测区
这是单电阻方案最本质的限制。窗口宽度直接由占空比决定,会出现在两类位置:
低调制比时,参考矢量幅值很小,T1 和 T2 都被压缩,两个窗口可能同时掉到最小窗口以下;扇区边界处,参考矢量接近某一个基本矢量,另一个矢量的作用时间趋近于零,只有一路能采到。窗口不够时,ADC 采到的是开关振铃和没建立完的运放输出,重构出的电流完全错误。表现很有规律:电流波形在每个电周期里出现 6 次畸变(对应 6 个扇区边界),或者轻载时电流彻底乱掉、满载反而正常——因为这个“轻重载反常”的现象,很多人会误判成电流环增益问题。
常见的解决思路有三类,实际产品里往往组合使用。一是移相法:窗口不足时把某一相的 PWM 边沿整体平移一个固定量,人为撑开有效矢量的作用时间,代价是输出谐波变大。二是多次采样:在一个周期内增加采样点,甚至利用零矢量期间注入测量脉冲,从别的矢量组合里拿到缺失的那一相。三是观测器补偿:在不可观测区用上一周期的电流值或电流观测器输出做预测,牺牲一小段动态精度换取连续性。这份应用笔记的实现里,最小窗口是通过软件判断的,窗口不足时对重构结果做保持处理——这是最省事、也最容易被忽略的做法。如果不做保持,直接把振铃采回来,电流环就会拿着错误反馈去调节,把整个系统带偏。
3.4 ADC 触发时序与运放调理:几微秒决定成败
重构能不能成,一半取决于软件判断,另一半取决于模拟前端的时序配合。该器件内部集成了两个运放,配合外部电阻网络把采样电阻上的小电压抬到 ADC 输入范围的中点附近,再送进 ADC。增益和偏置的选择要同时满足两个约束:最大电流时不能饱和到电源轨,最小可分辨电流时要高于 ADC 的量化噪声。双极性电流(正负都可能有)必须做虚拟地偏置,否则负半周直接削掉。
触发时刻一般不用软件定时器去“卡”,而是用 PWM 模块的比较匹配事件硬触发 ADC。中心对齐模式下,计数器从 0 涨到峰值再落回 0,两个非零矢量的中点分别在上升沿和下降沿各出现一次,触发点就设在这些位置上。硬件触发的好处是抖动只有时钟周期量级,软件里轮询标志位再启动转换,抖动会随中断响应时间飘,一旦飘到开关沿上,采样值就是垃圾。
4. 无位置传感器:扩展反电动势观测器怎么把转子位置算出来
4.1 为什么表贴式 PMSM 也能用“扩展反电动势”
传统认知里,表贴式 PMSM(Ld ≈ Lq)没有凸极性,好像只能靠反电动势过零检测;只有凸极机才能用高频注入。但把 dq 轴电压方程改写成 αβ 静止坐标系下、以电流为状态量的形式,会出现一个包含 (Ld − Lq)·(ωe·id − diq/dt) 的项,它和 ωe·ψPM 项一起被打包成一个待观测量,通常叫扩展反电动势。对表贴式电机,Ld − Lq 项近似为零,扩展反电动势退化成普通的旋转反电动势,观测器照样成立。
“扩展”二字的含义就在这里:把凸极项和永磁项合成一个量,模型对两类电机统一,代码不用为电机类型分支。状态方程写成
d/dt [iα; iβ] = (1/Ld)·([uα; uβ] − Rs·[iα; iβ] − [eα; eβ])
其中 eα = −ωe·ψPM·sin θe、eβ = ωe·ψPM·cos θe(符号依坐标约定而定)。观测器的构造方式和 Luenberger 观测器一样:用同一个模型并行算一份估计电流,拿实际电流与估计电流的差乘增益去校正,误差收敛后校正项里就含着反电动势。
4.2 误差信号与位置跟踪:从电流误差到角度
校正项里包含 sin/cos 的角度信息,但不能直接算 atan2——定点开销大,而且反电动势估计本身带噪声,直接取角度会让转速估计抖得没法用。标准做法是用一个跟踪观测器(PLL 型):构造误差信号 ε = −êα·cos θ̂ − êβ·sin θ̂,把它送进一个 PI,PI 输出就是估计转速,积分得到估计角度。稳态时 ε 正比于 sin(θe − θ̂),小角度下近似线性,整个环路就是一个二阶锁相环。
这样做的另一个好处是转速和角度一起估出来,不需要对角度做差分——差分会把量化噪声放大几十倍。PLL 的带宽要低于电流环带宽,同时高于速度环带宽,夹在中间:太高会跟着电流噪声抖,太低则加速时角度跟不上,表现为动态过程中转矩不足。这也是 MCAT 里观测器参数和速度环参数要分开调的原因,两者的时间尺度本来就不一样。
4.3 启动:对齐、开环强拖与切换
反电动势幅值正比于转速。零速和极低速时反电动势的信噪比接近零,观测器在数学上就不可观,这不是调参能解决的。所以必须有一段开环:先给 d 轴通一个直流电流(iq 置零),把转子强行拉到 d 轴对齐位置,保持一段时间让转子稳定;然后按设定的加速度给一个虚拟角度斜坡,电流环跟着这个角度走,电机被强拖加速;等转速升到观测器能稳定收敛的阈值以上,再把
本文还有配套的精品资源,点击获取