资讯详情

资讯详情

PMSM电流采样选型与偏置编码实战:三电阻与单电阻

简介《PMSM的三电阻和单电阻采样》是一份面向电机控制工程师、电力电子与嵌入式方向学习者的专题PDF聚焦永磁同步电机相电流检测中的方案选型与工程实现。内容围绕三电阻采样与单电阻采样展开对比两者在成本、电路复杂度、控制精度上的差异并针对2812的12位单极性ADC讲解如何用运放与直流偏置将双极性相电流转换为03V信号再结合与8000异或的软件处理得到有符号数据。文中还涉及SVPWM与电机方向控制、PMSM3_1双极性计算等要点可帮助读者理解采样链路从硬件调理到数字表示的完整逻辑并依据应用需求选择合适方案。压缩包共1个PDF文件约105KB已有1161人学习下载适合作为电流采样调试与方案比对的参考材料。1. PMSM 电流采样这件事三电阻还是单电阻结论先摊开PMSM 电流采样这块我在三套板子上反复比过一套三相各串一个采样电阻配三路运放一套母线单电阻靠算法还原三相。结论先摆出来——转速下限要求低于额定 5%、要跑满调制比、还想顺手做相间短路保护的选三电阻成本、板面、隔离通道数被卡死的选单电阻。真正难的不是选谁是选定之后那套把双极性电流塞进单极性 ADC 的活偏置抬到 1.5V、量程压到 0~3V、采样值异或 0x8000 转补码。这三步哪一步含糊后面的电流环就是玄学。下面把比对时用到的判据、偏置怎么算、转换代码怎么写还有真机上踩过的坑都摆出来新手能照着调熟手可以直接跳到判据和避坑那两章。2. 五条判据三电阻和单电阻到底差在哪选型这件事最怕开口就问“哪个好”。好与不好取决于你的转速范围、调制比上限、板子面积和 BOM 敏感度。我把两套方案摆在同一张台面上用五条判据逐项过了一遍每一条都给出“怎么看”和“看到什么程度算不合格”你拿着对着自己的项目打分就行不用重新想一遍。2.1 判据一采样窗口什么时候打开开多久这是两种方案最本质的差别也是后面所有精度问题的根。三电阻方案在每一相下桥臂各挂一个采样电阻。中心对齐 PWM 运行到计数器下溢那一刻三相下管同时导通零矢量作用采样电阻上的电流就是各相的真实相电流方向和大小都对。这个窗口的存在只取决于零矢量有没有被压掉——只要最小脉宽留够无论调制比跑到 0.95 还是 0.1窗口都在宽度也够。所以三电阻方案的采样时刻是“固定节拍”配置一次 ePWM 的 SOC 触发点后面几乎不用再管。单电阻方案把唯一一个采样电阻放在直流母线上。母线电流在零矢量期间是 0下管全通电流不流经母线采样电阻在有效矢量期间才等于某一相的电流而且不同扇区、不同矢量对应不同的相。这意味着采样窗口等于有效矢量的持续时间而有效矢量时长正比于调制比。转速低、调制比小的时候两个有效矢量都很窄窄到 ADC 采样保持还没建立完窗口就关了这就是所谓盲区。我一般这么判断把你在最低速、最轻载工况下的有效矢量时长算出来减去死区时间、驱动传输延时、ADC 采样保持时间剩下的净窗口如果低于 1.5 微秒单电阻方案要么加 PWM 移相要么在低速段直接放弃采样、切到模型估算。这一步算不清楚就选单电阻后面一定返工。2.2 判据二BOM、板面与隔离通道数把两套方案的硬件开销逐项摆出来账就很清楚项目三电阻单电阻采样电阻数量3 只1 只运放通道3 路或双运放两片1 路ADC 通道3 路需同步采样1 路可分时复用偏置网络3 套1 套布局面积大三路需对称小集中在一处布线对称性要求高三路增益/延迟要匹配低只有一路隔离/驱动电源通道与三相绑定通道多通道少隔离器件省单电阻方案在成本敏感的量产板上优势明显尤其是功率段不大、驱动与主控之间要加隔离的场合通道数直接砍掉三分之二。三电阻方案的劣势也很直白三只采样电阻本身的功耗、三路运放的失调与温漂要分别标定、三路走线不对称会直接变成相电流的不平衡误差。但板面这笔账要算全。单电阻方案省下的硬件会被软件吃掉一部分扇区判断、窗口管理、PWM 移相、重构算法这些都要占 CPU 和 Flash。我见过为了省三路运放最后在 60MHz 的主频上多花了近三成的控制周期去算重构反而把电流环带宽压下来了。选之前先问一句主控还剩多少算力。2.3 判据三精度、低速表现与保护能力精度上三电阻是“直读”每一路独立放大、独立采样噪声互不干扰信噪比好零漂可以逐路标定。单电阻是“推算”两次采样合成三相任何一次采样的误差都会通过“三相电流之和为零”这个约束扩散到第三相误差被放大。低速表现差距更明显。三电阻在 1Hz 电频率下依然能采到干净波形只要零漂标定准确。单电阻在低速轻载时有效矢量极窄要么丢窗口要么靠移相硬撑移相又会带来额外的电流纹波和可听噪声。做低速大扭矩、做伺服定位的场合这条基本就定了。保护能力上三电阻天然具备相间短路、单相开路、对地短路的识别能力因为三路电流独立可见和不等于零就是异常。单电阻只有一路母线电流某一相开路时母线电流波形会有特征但定位到具体相要靠算法推断响应慢半拍。对那些要求硬件过流在几个微秒内动作的场合这个差别不小。2.4 判据四、五软件复杂度与失效模式软件复杂度上三电阻几乎是“配置即用”SOC 触发点固定三路同时转换读出来做一次偏置扣除和标定系数乘法就完事。单电阻要维护一张扇区到相电流的映射表要在每个 PWM 周期里判断两个有效矢量是否都够宽要给不够宽的那个做移相补偿要处理重构失败时的降级策略。代码量大概是三电阻的三到五倍调试周期也更长。失效模式这条很多人不做评估。三电阻方案里某一路运放坏掉另外两路还能工作通过三相电流和为零可以检测出异常通道并降级运行。单电阻方案只有一个采样通道它一坏全部电流信息丢失只能靠过流硬件保护兜底。对可靠性要求高的场合这是实打实的减分项。把五条判据压成一句话低速与精度优先选三电阻成本与板面优先选单电阻中间地带看你的主控余量和最低速指标。我自己的经验是只要指标表里写着“额定转速 1% 以下需要平稳运行”就别在单电阻上纠结了。3. 双极性到单极性偏置电路怎么算、怎么布相电流是近似正弦的双极性信号一个电周期内必然有正有负。而 2812 这类主控的 ADC 是单极性的输入范围 0~3V负电压进不去。硬件上必须先把双极性信号整体平移让它落在 0~3V 之内。这一节把偏置点的由来、增益的算法、以及布局上几个不写进文档但要命的细节说清楚。3.1 偏置点为什么落在 1.5V设相电流范围是 -a 到 a采样电阻上的压降也是 ±a 乘以阻值。要把它塞进 0~3V最直接的办法是加一个直流偏置 b使输出为 b G·V_shunt其中 G 是放大倍数。要让整个范围刚好铺满 ADC 的输入窗口两端必须对齐电流为 a 时输出顶到 3Vb G·a 3电流为 -a 时输出落到 0Vb - G·a 0两式一联立b 1.5VG·a 1.5V。也就是说偏置点必须钉在量程中点 1.5V增益由最大电流反推。这时候“电流为零对应 1.5V”不是习惯而是被量程逼出来的唯一解。原稿里写的 b 1.5 a/2本质是同一个结论换个说法。12 位 ADC 在这套配置下的分辨率可以算出来1 LSB 3.0V / 4096 ≈ 0.732mV。若 G 7.5折算到采样电阻输入端是 0.0976mV采样电阻取 10mΩ那么 1 LSB 对应约 9.8mA。这个数决定了你的电流环最小能分辨多少电流选采样电阻和增益的时候要倒着算先定最小可分辨电流再定增益最后定采样电阻。3.2 从量程倒推电阻网络具体落地时我按这个顺序算定最大相电流 a。按电机的峰值电流留 1.2 倍余量。定采样电阻 Rsh。功耗 I²R 要能接受同时压降不能大到影响效率。算最大压降 V_shunt a × Rsh。算增益 G 1.5V / V_shunt。按 G Rf / Rin 选电阻取值时优先用 1% 精度、低温漂的薄膜电阻Rin 不要小于 1k避免给前级增加负载。举个实际算过的例子峰值电流 20ARsh 取 10mΩ最大压降 0.2VG 7.5Rin 取 2k、Rf 取 15k。输出摆幅正好 0~3V运放选轨到轨输出、带宽至少是开关频率的十倍以上否则电流纹波会被压成三角波的失真。偏置电压的来源单独说一句。1.5V 最好从 ADC 的同一路基准分压得到而不是另起一路 LDO。原因很实在基准漂了满量程跟着漂偏置也一起漂两者同步变化时零点和满度还能对上如果偏置用独立源基准漂 1% 就是满度和零点各漂各的标定系数直接失效。这是我在一块板子上吃过亏之后才改过来的做法。3.3 运放选型与布局几个不写进文档的细节采样电阻的接法要用开尔文四线电压取样点必须在电阻焊盘内侧不能从走线上随便引两根线出去。走线一旦和大电流路径共用一段铜皮那一段的压降就被算进采样电压里增益再准也没用。差分放大的两个输入端要严格等长、等阻抗四颗电阻要用同一批次最好用集成好的差分放大器省掉匹配问题。共模抑制比不够的时候下管开关瞬间的 dv/dt 会直接窜进采样通道表现为电流波形上叠加周期性的尖刺。RC 滤波要加但截止频率的位置很讲究要高于电流环带宽的三到五倍又要明显低于开关频率。放太低会把真实的电流纹波滤掉让电流环以为自己很干净实际相位裕度已经不够了。注意三路采样的地必须单点汇接到 ADC 的模拟地不要各自就近下地。三路分开下地的时候下管电流会在地平面上形成电位差表现出来就是三相电流在零附近对不上。4. 软件那一步异或 0x8000 到底做了什么硬件把信号抬到 0~3V 之后ADC 读回来的是一个无符号数零电流对应 1.5V读数是 2048正电流往上走到 4095负电流往下走到 0。这个编码方式叫偏移二进制它和补码之间只差一次最高位翻转。异或 0x8000 就是这次翻转一行代码解决问题但理解不到位就会在符号和量程上反复出错。4.1 从偏移二进制到补码异或 0x8000 的推演12 位 ADC 的结果通常左对齐存进 16 位变量也就是 raw adc 4范围 0x0000~0xFFF0零电流落在 0x8000。对这个数异或 0x8000等价于把最高位取反物理量电压raw左对齐raw ^ 0x8000有符号解释最大负电流 -a0V0x00000x8000-32768零电流1.5V0x80000x00000最大正电流 a3V0xFFF00x7FF032752为什么这样一翻就对了因为偏移二进制和补码的唯一差别就在最高位偏移二进制把零点放在量程中点补码把零点放在全零。把最高位取反等于把“中点为零”搬成“零点为零”其余的位原封不动。而补码的负数本来就是靠“求反加一”得到的翻转最高位之后负半边的编码自然落进补码的负数区间。这里有个容易出错的地方-a 是最大的负电流但它的数字位全是 0看起来像“最小值”。这不是 bug是补码表示法的必然结果——负数的绝对值越大编码越小。原稿里把这个现象专门拎出来讲就是因为第一次看到的人都会愣一下。注意原稿中把 0~1.5V 对应的结果写成 0x8000~0x8FFF按异或规则推下来实际是 0x8000~0xFFF0。动手时以公式为准别照抄这一段否则量程会算错一个数量级。4.2 零漂标定与定点缩放异或只是把编码格式转对真正的零点和增益还要靠标定。我的做法是每次上电、PWM 封锁、母线不上电的情况下采一批样本求平均得到每个通道的实际零点再和理论值 0x8000 求差作为偏移量存起来。电机运行中如果温升明显零点还会漂可以在一段时间内没有输出电流的间隙做在线修正。定点缩放的代码大致是这样/* 三电阻12 位左对齐的偏移二进制 - 有符号 Q15 电流值 */ static inline int16_t adc_to_current(uint16_t raw) { /* raw 范围 0x0000~0xFFF0零电流理论值 0x8000 */ int16_t v (int16_t)(raw ^ 0x8000U); /* 翻转最高位偏移二进制转补码 */ v (int16_t)(v - offset_q15); /* 扣掉上电标定得到的实际零点 */ /* gain_q12 为标定系数Q12 定点1.0 记作 4096 */ return (int16_t)(((int32_t)v * gain_q12) 12); }三个参数的含义分别是raw 是 ADC 结果寄存器左移四位后的值offset_q15 是标定得到的零点偏移gain_q12 是把“每安培对应多少个 Q15 计数”写成 Q12 定点。用 int32 中间量是为了防止乘法溢出右移 12 位前不要先截断成 int16。标定系数怎么来给一个已知的恒定电流读回值除以实际电流多测几个点做线性拟合比拍脑袋给一个数靠谱得多。4.3 单电阻的相电流还原与盲区处理单电阻方案的软件核心是一张映射表加一个重构函数。母线电流只在有效矢量期间携带信息而每个扇区的两个有效矢量分别对应两相电流有正有负第三相由三相之和为零推出来扇区首矢量对应的相电流次矢量对应的相电流推出1ia-icib -(ia ic)2-icibia -(ib ic)3ib-iaic -(ia ib)4-iaicib -(ia ic)5ic-ibia -(ib ic)6-ibiaic -(ia ib)落到代码上先按扇区把两次采样值赋给对应的两相剩下那一相由和为零补齐/* 单电阻idc1/idc2 分别是扇区首、次矢量中点采到的母线电流已转有符号 */ void single_shunt_reconstruct(uint8_t sector, int16_t idc1, int16_t idc2, int16_t *ia, int16_t *ib, int16_t *ic) { int16_t a 0, b 0, c 0; uint8_t missing; switch (sector) { case 1: a idc1; c -idc2; missing 1; break; /* V1:ia, V2:-ic */ case 2: c -idc1; b idc2; missing 0; break; /* V2:-ic, V3:ib */ case 3: b idc1; a -idc2; missing 2; break; /* V3:ib, V4:-ia */ case 4: a -idc1; c idc2; missing 1; break; /* V4:-ia, V5:ic */ case 5: c idc1; b -idc2; missing 0; break; /* V5:ic, V6:-ib */ case 6: b -idc1; a idc2; missing 2; break; /* V6:-ib, V1:ia */ default: return; /* 扇区非法保持上次值 */ } if (missing 0) a (int16_t)-(b c); else if (missing 1) b (int16_t)-(a c); else c (int16_t)-(a b); *ia a; *ib b; *ic c; }参数里 sector 由 SVPWM 模块给出idc1 和 idc2 必须是从两个有效矢量的中点采到的值采样点偏一点结果就全错。missing 变量记录哪一相没被直接测到最后用它补齐。这个函数本身只有几十条指令真正的开销在调用它之前的窗口判断上。盲区处理是单电阻方案的胜负手。我用的策略有三层第一层在 SVPWM 计算占空比时强制最小有效矢量宽度不够就把另一个矢量压短代价是波形轻微畸变第二层两个矢量都撑不开的时候做 PWM 移相把一个矢量的作用时间人为拉长代价是电流纹波和可听噪声第三层转速低于阈值时直接切到电流观测器估算等转速上来再切回采样。三层策略的切换点要做滞环否则会在边界上反复跳。5. 避坑清单调试现场真机上翻车的五条记录下面这五条都在实际板子上出现过每一条按“看到什么现象、为什么会这样、怎么改”写清楚。新板子第一次上电照着过一遍能省掉不少时间。5.1 零电流时读数不是 0x8000现象电机不转、PWM 封锁三路 ADC 读数分别是 0x7F30、0x80C8、0x7FA0没一路落在 0x8000 附近而且三路偏的方向还不一样。原因偏置电压靠电阻分压得到分压电阻本身有 1% 误差运放有输入失调电压几毫伏乘上增益就是十几个 LSB三路运放不是同一批次失调方向和大小都不同。理论零点只是设计值不是实测值。解决每路单独标定。上电时封锁 PWM、确保没有电流流过采样电阻连续采 256 次求平均作为该路实际零点存进参数区。标定值要掉电保存别每次上电重算——重算的时候如果母线上有残余电流标出来的零点是错的。改完之后三路零点差异能压到几个 LSB 以内。5.2 电流波形每隔一段时间跳一下现象稳态运行时电流波形整体是正弦的但每隔固定角度就有一个尖刺示波器上看是采样值突然偏大或偏小位置随转速变化。原因ADC 触发点落在了开关沿附近采样保持窗口跨过了下管的开通或关断瞬间。下管关断时采样电阻上的电流会反向流过体二极管电压突然被抬高这一拍采到的值没有物理意义。死区时间越长这个区间越宽。解决把 SOC 触发点挪到计数器下溢之后留出大于死区加驱动传输延时再加 ADC 采样保持时间的余量。我一般按 300ns 到 500ns 留具体看驱动光耦或隔离器的传播延迟。挪完之后还要检查最小脉宽别把采样点挪到零矢量结束之后去了。5.3 异或之后正负反了或者满量程对不上现象给电机通一个已知方向的小电流读回来的符号是反的或者满量程时读数只有理论值的一半。原因两个常见来源。一是变量类型没处理好把 uint16 直接赋给 int16 又做异或中间发生过隐式转换二是照抄了文档里 0x8000~0x8FFF 这个范围误以为负半边的编码是连续的几段标定系数按错误的量程算出来。解决用 int32 做中间运算异或之后立刻强转 int16再扣零点和乘系数。量程按本文 4.1 节的表推一遍用 -a、0、a 三个点实测验证分别通最大负电流、零电流、最大正电流看读数是不是落在 0x8000、0x0000、0x7FF0 附近三个点都对上了再进闭环。5.4 单电阻在低速轻载时电流抖动明显现象电机在额定转速 3% 以下运行时相电流波形毛刺很大电流环输出忽大忽小能听到明显的低频啸叫。原因调制比小两个有效矢量都很窄其中至少一个的持续时间不足以完成 ADC 采样。重构函数拿到的两次采样里有一次是无效的第三相由和为零推出误差被放大到三相。解决先按 2.1 节的方法算出净窗口确认是否真的不够。不够的话按 4.3 节的三层策略处理重点是第三层的切换阈值要加滞环比如 4% 切入估算、6% 切回采样中间留 2% 的死区避免在边界反复跳变。加完滞环之后啸叫会明显减弱。5.5 三电阻两路读数互相污染现象只给 A 相通电流B、C 两相的读数也跟着动幅度能到 5% 左右三相同时通电时零序分量对不上。原因地线布局问题。三路运放的模拟地各自就近下到功率地下管开关时大电流在地平面上产生电位差这个电位差串进了另外两路的参考点。另外差分走线不对称时共模抑制比下降同样会串扰。解决三路模拟地单点汇接到 ADC 的 AGND 引脚附近再通过一个点连到功率地差分对严格等长、等阻抗、贴近走采样电阻用开尔文四线接法。改完之后再做一次单相注入测试串扰应该能压到 1% 以内。6. 落到自己的板子上从偏置标定到闭环的三步验证前面几章把判据、偏置、编码、避坑都摆完了最后一章说怎么在你自己的板子上一步步验证而不是一上电就闭环。第一步静态验证偏置与编码。母线不上电、PWM 封锁、功率管全关读三路 ADC 原始值。这一步只验证硬件偏置和运放是否正常工作读数应该都在 0x8000 附近几百个 LSB 之内三路之间差异不应超过 1%。如果某一路偏离很远先查分压电阻和运放供电别急着改软件。确认之后把三路零点存下来作为 offset_q15。这一步做完异或转换的正确性可以用一个简单的办法验证手动给一个已知的小电流用外部电源串限流电阻灌进去看读数的符号和大小对不对符号反了就是异或之后的类型处理有问题。第二步动态验证采样时刻。让电机在低速空载下转起来用 DAC 把重构后的相电流打出来看波形。重点看三件事波形是不是干净的正弦、过零点附近有没有台阶、峰值处有没有削顶。过零点有台阶通常是零漂没扣干净台阶宽度对应固定的 LSB 数峰值削顶是增益给大了量程没铺满波形上有周期性尖刺就回去看 5.2 节。这一步我用一个笨办法确认过采样点把 SOC 触发点故意往前挪一格如果尖刺变大说明原来的点已经偏晚往回调到尖刺最小的位置再往前留一点余量。第三步闭环验证与降级策略。电流环闭上之后重点看两个指标阶跃响应的超调量和稳态时的电流纹波。三电阻方案在这个阶段应该很顺如果超调明显问题多半在标定系数而不是采样单电阻方案要额外验证降级路径——人为把转速拉到盲区以下看是否平滑切到估算、切回来的时候电流有没有跳变。降级路径不平滑量产时会变成偶发的异响投诉。下面这张表是我每次新板子bring-up都会过一遍的检查项可以直接抄阶段检查项合格判据静态三路零点一致性相互差异 1% 满量程静态已知电流的符号与幅值误差 3%动态相电流波形 THD空载低速下无明显台阶与尖刺动态采样点余量距开关沿 300ns闭环阶跃超调按你的环路设计指标一般 10%闭环单电阻降级切换切换前后电流无跳变回过头看我最早做这套东西的时候最容易犯的错是“先跑起来再说”——偏置没标定就把环闭上看到电流波形不对就去调 PID调了几天发现根子在零点上。从那以后我每次 bring-up 都强制走一遍上面这三步静态没通过绝不进动态动态没通过绝不进闭环。这套流程看着慢实际比反复返工快得多。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →