首页 / 资讯中心 / 文章详情

PMSM电流采样全链路:偏置、异或与三/单电阻避坑

PMSM电流采样全链路:偏置、异或与三/单电阻避坑 ★ FEATURED ARTICLE
简介这份PDF资料聚焦永磁同步电机控制中容易被忽略却关键的电流采样环节面向已具备SVPWM与伺服控制基础、正在调试DSP平台如2812的电机控制工程师与高年级学生系统辨析三电阻采样与单电阻采样两条技术路线。内容从双极性相电流如何适配单极性ADC切入分别剖析三电阻方案的直接测量优势与成本、损耗代价以及单电阻方案依靠算法重构其余两相电流的简化设计与精度折中并进一步给出运算放大器加直流偏置把电流零点抬到1.5V的硬件调理思路以及借助异或运算将有符号补码与无符号采样值相互映射的软件处理技巧顺带澄清SVPWM与电机转向的关系。包内仅含1个PDF文件约105KB篇幅精炼却覆盖原理推导与工程实现细节。该资料已有1159人学习适合希望对照官方技术文档理清采样链路、并在选型与标定阶段少走弯路的读者参考。1. 一块 2812 板子上的两次翻车让我把 PMSM 电流采样链路重新捋了一遍前年在某实验室的台架上一套 PMSM 控制程序从三电阻方案改到单电阻低速轻载时相电流波形上多出一段一段的台阶示波器上看母线电流却挺干净。折腾了两天才定位到是采样窗口不够PWM 移相参数还按三电阻的节奏在跑。同一块 2812 板子硬件上只是少焊了两个采样电阻、多了一个偏置网络软件上却要把触发时刻、移相、重构全改一遍。也是那次之后我才把 PMSM 电流采样这条链路从头到尾拆开看双极性信号怎么塞进单极性 ADC、那个 XOR 0x8000 到底在做什么、三电阻和单电阻各自在什么工况下会翻车。这篇就把这几件事按顺序讲清楚。手上正在调 PMSM3_1 或者类似双极性电流环的可以拿着板子对着参数一条一条核已经调通但波形偶尔不好看的重点看后面三电阻采样时刻和单电阻盲区那两章。2. 从 ±a 到 0~3V偏置电路和异或运算的两步走相电流是近似正弦的双极性信号一个电周期里必然有正有负。2812 的 ADC 是单极性的输入范围 0~3V12 位结果左对齐放在 16 位寄存器里低 4 位补零。也就是说负电流那半个周期ADC 物理上根本“看不见”。解决这个问题没有捷径只能硬件抬偏置、软件换编码两步缺一不可。2.1 偏置电路把零点抬到 1.5V给正负各留一半最直接的做法是在运放差分放大之后叠加一个 1.5V 的直流偏置。电流为 0 时输出 1.5V电流为 -a 时输出 0V电流为 a 时输出 3V这样整个双极性摆幅就完整落进了 ADC 的输入区间。实现上一般两级第一级差分放大把采样电阻上的毫伏级信号放大到伏级第二级做电平搬移偏置电压由基准源分压后经运放跟随器给出。这里有个容易被忽略的约束运放输出不能顶到轨。轨到轨运放在接近 0V 和 3V 时线性度会明显变差输出摆幅要留 100~200mV 裕量。厂商文档里常见的写法是 b 1.5 a/2其中 a 是缩放后的单边摆幅本质就是给上限留半幅余量防止大电流时运放饱和、波形削顶。我一般按满量程的 80% 设计增益剩下 20% 留给温漂和采样电阻公差。参数取值说明偏置电压1.5V对应 0A必须由基准源给出运放增益10~20 倍由采样电阻压降和 ADC 量程反推输出滤波截止5~10kHz高于电流环带宽低于开关频率采样电阻5~20mΩ兼顾损耗与信噪比输出摆幅0.1~2.9V两端各留 100mV 以上裕量偏置电压的精度直接决定零点精度。用两只 1% 电阻分压最坏情况偏置会偏 30mV折算到电流上就是满量程的 1%空载时电流环会一直以为有个小电流在流。要么用基准芯片要么上电做零点校准二者选其一别指望电阻分压蒙混过关。2.2 XOR 0x8000一行代码背后的补码逻辑硬件把信号抬到 0~3V 之后ADC 拿到的是 0x0000~0xFFF0 的无符号数中点 1.5V 对应 0x8000。要把它变成以 0 为中心的有符号数厂商文档里的做法是对采样值异或 0x8000。这一步看着像玄学其实是补码减法/* 12 位 ADC 结果左对齐到 16 位后转成以 0 为中心的有符号量 */ static inline int16_t adc_to_current(int16_t adc_left) { /* adc_left: 0x0000 ~ 0xFFF0对应 0 ~ 3.0V中点 0x8000 */ /* 异或 0x8000 等价于在 16 位内减去 0x8000结果正好是补码 */ return (int16_t)(adc_left ^ 0x8000); }为什么等价于减法因为 x 与 0x8000 异或只翻转最高位其余 15 位不变。在 16 位模运算里翻转最高位就等于加上或减去 32768而 0x8000 本身是 32768 的补码表示-32768。所以输入 0x80001.5V0A→ 0x0000 → 0输入 0xFFF03.0Va→ 0x7FF0 → 32752输入 0x00000V-a→ 0x8000 → -32768注意最后一行-a 虽然是最大的负电流但它的数值位全是 0因为负数在补码里是“求反加一”得来的不是简单翻符号位。这一点当年我和一位朋友讨论了很久他坚持认为 -a 应该对应 0x8FFF实际上 0x8FFF 对应的是略小于 0A 的一个小负值。把这个映射关系在纸上画一遍比看十遍文档管用。还有一个坑异或的对象必须是左对齐后的值。如果你先把 ADC 结果右移 4 位得到 0x000~0xFFF再异或 0x8000整个数会被翻到负数区波形直接反相。右对齐数据要异或 0x800或者先左移 4 位再走上面的函数。2.3 校准零点、增益和那两个必须记住的常数偏置和异或解决的是“能不能采”校准解决的是“采得准不准”。我一般做两点校准零点校准在 PWM 关断、电机静止时进行连续采 256 次取平均得到实际偏置对应的码值 offset运行时所有采样先减 offset增益校准需要已知电流源或者用相电阻注入直流测出码值-电流斜率 k写进参数表。这两个常数要存在非易失存储器里而且每次换板子、换运放、换采样电阻都要重标。曾经有一次小批量试产同一批板子零点离散度到了 ±40 码值没做单板校准的直接表现就是空载时三相电流不平衡速度环输出一直在抖。从那以后我的规矩是校准参数不写死上电自检时读一次读不到就用默认值并置一个告警位。3. 三电阻采样采样时刻比电阻精度更决定成败三电阻方案是每相下桥臂各串一个采样电阻或者在三相出线上各串一个。它的好处是三相电流同时可得不需要任何重构算法电流环拿到的就是真实值。缺点是三个运放、三个电阻、三路 ADC成本和布板面积都上去了。但真正让三电阻方案翻车的往往不是成本而是采样时刻没对准。3.1 采样电阻放哪、运放怎么接采样电阻放下桥臂发射极到母线负极之间是最常见的做法原因是下桥臂导通时电阻两端电压直接反映该相电流共模电压接近地电位对运放共模抑制要求低。放在相线上的方案共模电压高需要更高共模抑制比的运放一般用在高母线电压场合。运放接成差分放大四个电阻的匹配精度决定共模抑制比。1% 电阻配出来的共模抑制比大概 40dB 出头电机开关瞬间的共模跳变会串进采样通道。要用 0.1% 的匹配电阻或者直接用集成差分放大器。反馈网络里并一个小电容做低通截止频率按电流环带宽的 3~5 倍取我一般设在 8kHz 左右既能滤掉开关噪声又不会给电流环引入太大相位滞后。采样电阻的功率要算够。假设相电流有效值 10A、电阻 10mΩ功耗是 1W得用 2512 封装甚至更大。电阻的温度系数也会带来增益漂移金属膜 50ppm 的比厚膜 200ppm 的稳得多这一点在长时间满载运行时差别很明显。3.2 采样时刻为什么盯着计数器下溢点中心对齐 PWM 下计数器从 0 计到周期值再减回 0下溢那一刻三相下桥臂同时导通母线电流不流过任何采样电阻运放输出回到偏置点。这个时刻采样是最“干净”的因为没有开关动作dv/dt 为零。但下溢点采样有个前提下桥臂导通时间要足够长。占空比接近 100% 时下桥臂只导通很短一段时间ADC 采样保持电容还没充到位读数就已经锁存了。2812 的采样保持窗口可以配但最短也要几百纳秒加上运放建立时间实际需要的窗口在 1~2us 量级。我一般这样配ADC 触发源选周期中断触发点放在计数器下溢后延时 1~2us用定时器或者比较寄存器实现。延时太长会错过下桥臂导通窗口太短会撞上开关沿。调试时拿示波器同时看 PWM 下桥臂驱动、ADC 触发信号和运放输出三者对齐了再往下走。这一步花十分钟能省掉后面两天的波形排查。提示开启 PWM 死区后下桥臂实际导通时刻比理想时刻晚一个死区时间触发延时要把死区算进去否则采样点会落在死区区间内读到的是续流二极管压降。3.3 三路同步与 iaibic0 的校验2812 有双 8 通道 ADC可以级联成同步采样模式三相电流在同一时刻锁存。如果分时采样三相之间会有几十纳秒到几微秒的偏斜在电流变化率大的时候会引入误差。能同步就同步这是三电阻方案相对单电阻最大的优势。三路都采到之后用 iaibic≈0 做在线校验。正常情况下三者之和应该在几个码值以内超过阈值说明某一路出问题了运放饱和、采样电阻虚焊、ADC 通道损坏或者偏置电压跑偏。我把这个校验做成了保护连续 10 个周期和值超限就报故障、封波。曾经有一块板子运放负电源虚焊输出一直贴在上轨就是靠这个校验抓出来的不然表现出来只是电流环偶尔抖一下很难查到根源。重构这一步其实没什么可重构的三路都是直接测量。真正要做的是相位对齐采样时刻对应的是 PWM 周期中点而电流环计算用的是下一个周期的占空比中间有一个周期的延迟在环路里要补一个延时环节否则高带宽下相位裕度不够。这个延时在低速时影响不大高速弱磁区就很明显了。4. 单电阻采样一个电阻省下来的成本全在算法里还回去单电阻方案只在母线负端串一个电阻测的是母线电流。母线电流随开关状态变化不同有效矢量下它对应不同的相电流组合所以要在一个 PWM 周期内采两次甚至三次再重构出三相电流。省掉的是两个运放、两个采样电阻和两路 ADC代价是一套移相和重构算法以及绕不开的盲区问题。4.1 母线电流怎么还原成三相以母线电流正方向为流入逆变器、下桥臂导通时流过采样电阻为例六个有效矢量对应的母线电流如下表。零矢量 000 和 111 下母线电流为零不能用来采样。有效矢量导通的相母线电流100A 相上桥臂ia110A、B 相上桥臂-ic010B 相上桥臂ib011B、C 相上桥臂-ia001C 相上桥臂ic101C、A 相上桥臂-ib一个扇区内只需要采两个相邻有效矢量的母线电流第三相由 iaibic0 推出。比如扇区 I 内矢量 100 和 110 交替作用采到 ia 和 -ic就能算出 ib -(iaic)。整个重构逻辑按扇区号分支六个扇区各写一段代码量不大但分支要写全。采样时刻不能放下溢点了因为下溢点是零矢量母线电流为零。正确做法是在每个有效矢量的作用窗口中间触发 ADC窗口长度要大于 ADC 采样保持时间加运放建立时间这就是所谓的最小采样窗口 Tmin我一般取 1.5~2us。4.2 最小窗口不够时靠移相把窗口“撑”出来问题在于PWM 占空比是电流环算出来的不能随便改。某个扇区里如果两个有效矢量之一的作用时间小于 Tmin窗口就不够。解决办法是移相把一个 PWM 周期内的开关时刻整体左移或右移让两个有效矢量的窗口都超过 Tmin同时保持矢量作用时间的比例不变。具体做法是在七段式 SVPWM 的基础上把中间那个矢量的作用时刻往一侧偏给两侧各留出 Tmin。移相量有上限一般不超过半个开关周期超了就会影响输出电压的谐波含量。2812 的比较寄存器可以直接改写移相就是在算完三路比较值之后根据当前扇区和占空比再叠加一个偏移量。/* 单电阻移相保证两个有效矢量窗口都不小于 TMIN */ void shift_for_sampling(uint16_t *cmp, uint16_t period, uint16_t tmin) { uint16_t t1 cmp[1] - cmp[0]; /* 第一个有效矢量作用时间 */ uint16_t t2 cmp[2] - cmp[1]; /* 第二个有效矢量作用时间 */ if (t1 tmin) { /* 窗口一不够整体右移 */ uint16_t d tmin - t1; cmp[0] d; cmp[1] d; cmp[2] d; } else if (t2 tmin) { /* 窗口二不够整体左移 */ uint16_t d tmin - t2; cmp[0] - d; cmp[1] - d; cmp[2] - d; } /* 移相后要做上下限钳位防止比较值越界 */ }这段代码只是示意实际实现里还要处理移相后零矢量被压缩、上下限钳位、以及移相量对输出电压的补偿。参数 tmin 要根据运放建立时间和 ADC 采样窗口实测确定 datasheet 上给的只是下限实际取值建议留 50% 裕量。4.3 盲区扇区边界和低调制比是重灾区移相能救大部分工况但救不了两类场景。第一类是扇区边界两个有效矢量之一的作用时间趋近于零移相量再大也撑不出窗口第二类是低调制比三个矢量都很短整个周期里找不到两个足够长的窗口。低调制比出现在低速轻载和电机刚启动的时候恰恰是电流环最需要准确反馈的区间。常见的处理有三种一是电流预测用上一周期的采样值加上模型推算当前值撑过盲区二是最小脉宽限制强制把占空比往中间拉牺牲一点电压精度换采样窗口三是改用电流观测器在盲区里完全靠模型输出。我一般用第一种加第二种的组合盲区里用上一拍的值外推同时把最小脉宽卡在 Tmin 上等出了盲区再切回实测。外推的系数不能取太大否则电流环会引入额外相位滞后高速时表现为电流波形顶部发飘。注意单电阻方案的采样时刻和移相逻辑强耦合改移相参数必须重新标定采样触发延时两者任意一个动了另一个都要跟着调。5. 避坑五个我在台架上真踩过的坑5.1 空载电流不为零偏置电压跑偏了现象电机静止、PWM 关断采样值稳定在 -25 到 -35 码值之间不是 0。上电做一次校准能压到 ±3 码值以内但运行半小时后又漂回去。原因1.5V 偏置由两只 1% 电阻分压得到实测 1.47V加上运放输入失调电压 5mV折算到 12 位 ADC 上就是 25 个码值。温升之后电阻值变化漂移量还会变大。解决偏置改用基准芯片加分压或者把分压电阻换成 0.1%。软件上做上电零点校准不够还要加运行中的慢速零点跟踪在零矢量区间采样累计平均值用一阶低通慢慢修正 offset时间常数取几十秒不影响动态响应。5.2 异或后数值乱跳对齐方式搞错了现象明明电流是正的异或之后变成一个大负数波形整个反相。换一块板子又是对的查了半天代码没改动。原因两块板子的 ADC 配置不一样一块左对齐、一块右对齐。右对齐数据直接异或 0x8000相当于把 0x000~0xFFF 整个翻到了负数区。解决在 ADC 初始化之后加一句断言读一次已知输入比如内部基准或者短接到偏置点检查结果是否落在 0 附近。对齐方式在代码里统一定义成宏所有转换函数只走一条路径不允许各处自己移位。5.3 三电阻采样毛刺大触发点撞上了开关沿现象相电流波形上叠加了几十到几百码值的尖峰随机出现电机转速越高越频繁。示波器看运放输出尖峰和 PWM 开关沿对齐。原因ADC 触发延时配得太短采样保持窗口和上下桥臂换流的 dv/dt 重叠采样电容充进去的是开关噪声。解决把触发延时从 0.5us 加到 1.5us尖峰消失。延时上限由下桥臂最小导通时间决定占空比高的时候要单独处理占空比超过 95% 时改用周期中点触发或者直接钳位最大占空比。调试时把触发信号引到一个空闲 GPIO 上和 PWM 一起看一眼就能判断位置对不对。5.4 单电阻在扇区边界电流畸变现象每 60 度电角度出现一次尖峰低速轻载时最明显示波器上相电流波形每隔一段就鼓一个包。原因扇区切换瞬间两个有效矢量之一的作用时间小于 Tmin移相量已经到上限还是撑不出窗口这一拍的采样值不可信重构出来的三相电流全是错的。解决在扇区边界前后各 5 度设置一个盲区标志盲区内改用上一拍的采样值加电流变化率外推同时把最小脉宽限制打开。外推只做一拍不做多拍累积否则误差会滚雪球。实测这样处理之后边界尖峰从满量程的 15% 压到了 3% 以内。5.5 低速轻载电流波形平顶死区没补偿现象轻载低速时电流过零附近出现一段平台波形像被削平了电流环输出一直在平台边缘来回跳。原因死区时间 2us低速时反电势小死区造成的电压误差占给定电压的比例很大过零附近尤其明显。三电阻和单电阻都会有这个问题单电阻因为采样窗口限制表现更突出。解决按电流方向做死区补偿给每相占空比叠加一个和电流符号相关的补偿量补偿量由死区时间和母线电压算出来。电流过零附近符号判断不可靠加一个 ±5% 额定电流的滞环滞环内不补偿。补偿之后平台基本消失低速转矩脉动也小了一截。6. 三电阻还是单电阻一张表把选型说清楚把两种方案放在同一张表里对比判断依据就清楚了。下表是我按几个实际项目整理的口径成本和精度都是相对值具体数值随功率等级变化。维度三电阻采样单电阻采样采样器件3 个采样电阻 3 路运放1 个采样电阻 1 路运放ADC 通道3 路同步1 路每周期采 2~3 次采样时刻下溢点附近窗口宽有效矢量窗口内窗口窄最小窗口无硬性限制1.5~2us硬约束低速轻载正常盲区需外推或限脉宽扇区边界无影响需移相 盲区处理电流精度高三相同步中受重构和窗口影响算法复杂度低高移相 重构 盲区成本高低适用场景高精度伺服、低速大转矩成本敏感、风机泵类、中高速结论不复杂对控制精度要求高、低速性能不能妥协的场合三电阻没有悬念多出来的两个运放和两路 ADC 换来的是省心的电流环。成本压在第一位、运行区间集中在中高速的场合单电阻更合适前提是移相和盲区处理要写扎实否则省下来的成本会以调试工时的形式还回去。最后说一个我现在的习惯不管选哪种方案上电第一件事是拿示波器看偏置点、看 ADC 触发信号和 PWM 的相位关系把这两个波形对上了再跑电流环。这个动作五分钟能挡掉后面大半的玄学问题。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站