多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

FOC电流采样方案详解:中心对齐PWM下单/双/三电阻采样点设计

FOC电流采样方案详解:中心对齐PWM下单/双/三电阻采样点设计 FOC这东西入门靠教程深入靠踩坑。很多朋友把SVPWM、Clark变换、PI调解器调得飞起一上电就是电流啸叫、母线过流、MOS管冒烟查来查去最后发现死在最基础的电流采样上。尤其是中心对齐PWM下单电阻、双电阻、三电阻三种采样方案怎么选、怎么搭、采样点怎么定这里面的门道比你想的要多得多。这篇文章我不打算讲那些教科书上有的东西我把实际调过的板子、炸过的管子、改过的电路结合中心对齐PWM的工作机制把三种采样方案的搭建思路、采样时刻计算、硬件参数选择和排坑经验一次性说透。不管你是刚接触FOC的新手还是正在被电流采样噪声折磨的老手这篇文章都能给你一些可以直接抄作业的参考。1. 中心对齐PWM为什么是FOC电流采样的默认选择1.1 从“续流状态”理解采样窗口先不说单双电阻先把中心对齐PWM这件事想明白。FOC里面绝大多数方案用的是上升下降计数模式也就是定时器先向上计数到ARR再向下计数回零输出的PWM波形以计数的中点对称。为什么不用简单的边沿对齐因为中心对齐PWM在计数的顶点和底点三相PWM的输出状态正好处于一个非常稳定的区间此时电流纹波最小续流二极管的状态也相对固定采样获得的电流值更接近相电流的平均值而不是某个瞬间的纹波尖峰。这里要理解一个关键概念采样窗口的本质是“PWM状态不变的时间段”。电流采样不是随便找个时刻点ADC触发一下就行你得保证在这一刻电流流过的路径是确定且稳定的。中心对齐模式下在计数周期的顶点或底点附近SVPWM会进入零矢量状态要么三个上桥全开要么三个下桥全开这时候三个下桥臂的续流状态是一致的采样电阻上的电压能真实反映相电流这就是整个采样方案设计的基准点。1.2 三种采样方案怎么选一张表说清优劣势单电阻、双电阻、三电阻名字听起来只是电阻数量不同实际设计复杂度、成本、性能完全是三个档次。我直接把结论放在前面后面再展开细讲。方案采样电阻位置成本采样重构难度适用场景三电阻三个下桥臂各一个高低直接读三相电流高性能伺服、大功率电机驱动双电阻两个下桥臂各一个中中第三相靠基尔霍夫推算大部分中低压电机驱动单电阻直流母线负端一个低高一个周期采两次重构小功率、低成本风扇/泵类应用不需要盲目迷信单电阻也不要觉得三电阻就是浪费。我的经验是如果不是做那种成本敏感到几毛钱都要抠的产品老老实实用双电阻或三电阻单电阻方案调好了确实有成就感但开发周期和调试成本往往远超省下的那两颗电阻和运放。2. 三电阻采样方案拆解2.1 三电阻采样的核心逻辑三电阻采样是在逆变器的三个下桥臂MOS管的源极分别串联一个毫欧级采样电阻。电机三相电流分别流过这三个电阻通过运放放大后送给ADC。这个方案的逻辑最简单三相电流直接测量不需要任何重构算法只要采样时刻对读回来的就是实打实的相电流。但这里有个问题需要说明三个下桥臂都导通的时候也就是零矢量000状态三个采样电阻上的电压才是对应的相电流如果某一相下桥臂关断了电流从该相上桥臂续流那对应采样电阻上的电压就变成0或者不确定状态这一相就读不到电流。所以在中心对齐PWM下三电阻采样最可靠的采样点就是零矢量区间也就是定时器计数到顶点ARR值或者底点0值附近的时刻。此时三相下桥臂要么全开、要么全关采样通道能拿到完整的相电流信息。2.2 采样窗口不够用怎么办三电阻采样听起来简单工程实现上第一个坑就是采样窗口不够。SVPWM调制时零矢量的持续时间跟调制比直接相关。调制比越高非零矢量越长零矢量越短如果零矢量时间短到小于“采样保持时间ADC转换时间运放建立时间”那就采不到了。这里要会算账。以一个常规配置举例PWM频率20kHz周期50微秒中心对齐模式下半个周期25微秒。假设某时刻占空比输出为80%非零矢量持续时间20微秒零矢量5微秒。如果你的电流采样电路运放建立时间为1微秒ADC采样保持时间为0.5微秒转换时间为1微秒加上触发响应延迟大概需要3到4微秒的窗口长度。5微秒的窗口看似够用但如果调制比继续走到90%以上零矢量时间只有2.5微秒这时候采样窗口就非常紧张了。解决思路有两个方向一是采用“两个采样点”策略在顶点和底点分别触发ADC哪个点窗口够用就用哪个点二是想办法扩展采样窗口。扩展窗口的常见操作是调整PWM占空比在扇区边界附近对占空比做一些微小的钳位或偏移保证最小的零矢量时间不被吃掉。这个方法我在后面双电阻部分会再详细讲因为双电阻对这种窗口限制更敏感。2.3 电路搭建与运放选型的“隐形坑”三电阻方案的运放电路很多人直接照着数据手册画结果实际跑起来波形一团糟。原因往往出在共模电压和地弹上。下桥臂采样电阻的一端是接功率地的另一端接MOS源极这一点的电压在PWM开关过程中会剧烈跳变运放必须扛得住这种共模跳变。我的建议是采样电阻的放置位置放在MOS管源极和功率地之间运放采用差分输入或者至少是共模抑制比高的单端放大器而不是随便用一个普通运放做同相放大。功率地的噪声会直接通过参考地耦合进运放输出这个在PCB布局上要用开尔文连接解决采样电阻的电流流经功率地而运放的参考地要单独拉线回到控制地两路地只在一点汇合。具体到运放选型参数我一般关注三个指标增益带宽积、压摆率、输入偏置电流。对于FOC电流采样这种应用PWM频率20kHz、采样窗口几微秒运放需要在极短时间内建立到0.1%精度增益带宽积至少要在5MHz以上压摆率不低于5V/微秒输入偏置电流越小越好尤其在采样电阻只有几毫欧、满量程信号只有几十毫伏的情况下偏置电流太大产生的误差会很离谱。3. 双电阻采样省一路运放但要学会“推算”3.1 双电阻采样的重构逻辑双电阻采样理论上是在两个下桥臂一般是U相和V相各放一个采样电阻W相的电流不直接测量而是通过基尔霍夫电流定律算出来Iw -(Iu Iv)这个思路本身没有问题电机三相电流的矢量和在任何时刻都等于零。但在中心对齐PWM下实现时有几个细节要注意。首先是采样点的问题要同时得到Iu和Iv必须在某个时间窗口内两条通道的采样都有效。最理想的采样点还是在零矢量区间此时三相下桥臂全部导通000状态或全部关断111状态由续流二极管导通两个采样电阻上都有确定的电流流过可以一次触发ADC同时采集两路。这里有个容易被忽略的问题零矢量111状态时三个上桥臂导通下桥臂全部关断此时下桥臂采样电阻上没有电流流过读数无效。所以中心对齐PWM下双电阻采样要采样在计数底点000状态而不是顶点111状态。这是和单电阻方案一个很大的区别后面会详细说。3.2 扇区边界的坑双电阻最典型双电阻方案最臭名昭著的问题出现在扇区边界当某一相的占空比接近0%或100%时该相下桥臂的导通时间极短采样窗口被压缩到几乎为零。比如在扇区I的边界W相占空比接近0W相下桥臂的导通时间只有几百纳秒这时两个采样电阻中V相的电流尚未建立而U相可能已经开始切换你采到的Iu和Iv根本对应不上同一时刻的电流状态重构出来的Iw自然就是错的。这个问题不解决电机运行时会在每个电角度周期的特定位置出现电流尖刺表现就是相电流波形有规律的毛刺、转矩波动、甚至触发过流保护。解决方案业界常用“移相法”或“占空比修正法”。核心思想是当检测到某一相占空比过窄小于最小采样窗口对应的时间时把该相的PWM边沿向前或向后移动人为扩大采样窗口同时用软件补偿移相带来的电压误差。这种方案对算法要求高但是效果立竿见影。另一个更简单的办法是通过非正交SVPWM的调制策略来规避。比如使用不连续PWMDPWM在一个扇区内让某一相钳位到母线或地钳位相不需要采样另外两相的占空比窗口自动扩大。这个思路我在一些商用驱动器里见过效果不错但实现起来需要对SVPWM调制策略有较深的理解。3.3 双电阻采样的采样时刻到底怎么定双电阻采样窗口计算的思路跟三电阻是类似的。以STM32的高级定时器为例这是最常用的FOC主控之一中心对齐模式的计数器从0计数到ARR再从ARR递减到0。PWM的输出在计数器值等于CCR时翻转因此在一个完整的PWM周期内每个PWM输出会有两个翻转点一个在上计数段一个在下计数段。双电阻采样的ADC触发点我一般选择在计数器等于0的时刻也就是下溢事件。此时PWM处于000状态三相下桥臂全部导通两个采样电阻上的电压都有效。在STM32上这个触发器可以是定时器的更新事件但需要注意在中心对齐模式下更新事件可能在上溢和下溢都触发你需要根据寄存器配置选择只在周期性更新时触发否则ADC采样频率会翻倍数据还没处理完下一次中断就到了。具体到ADC采样保持时间的配置我习惯把采样时间设置得稍长一些比如STM32F103上配置为13.5周期或28.5周期这样能保证内部采样电容充分充电。尤其是在运放输出阻抗偏高、没有加缓冲器的情况下采样时间太短会导致采集到的电压偏低造成电流偏小的假象——这个问题很隐蔽很多人以为是运放增益不对其实是ADC采样时间不够。4. 单电阻采样最省钱也最考验功力的方案4.1 为什么单电阻需要采样两次单电阻采样是在直流母线的负端串联一个采样电阻通过不同PWM状态下母线上流过的电流路径不同间接重构三相电流。这里要理解的核心是母线电流在任何时刻只反映一相或两相的电流组合而不是完整的相电流。在一个PWM周期内当处于非零矢量状态时直流母线上的电流等于某一相的相电流或两相的差值当处于零矢量状态时母线电流为零。所以为了重构三相电流必须在同一个PWM周期内采样两次一次在某个非零矢量期间拿到一相电流另一次在另一个非零矢量期间拿到另一相电流第三相靠基尔霍夫推算。单电阻采样真正难的地方在于一个PWM周期内必须找到两个不同的有效矢量并且在每个矢量持续时间内完成一次ADC采样。这意味着最低的有效矢量时间必须大于ADC采样窗口否则就重构失败。这个条件在低调制比和高调制比下都可能不满足——低调制比下有效矢量太短高调制比下零矢量太短每次采样可能都落在状态切换的瞬间。4.2 低调制区和高调制区的窗口困境单电阻方案的窗口困境本质上跟SVPWM的矢量分布有关。低调制比时参考电压矢量很小SVPWM输出的有效矢量时间很短两个有效矢量的持续时间可能都小于最小采样窗口这时候你就采不到足够的电流信息。高调制比时有效矢量时间很长但零矢量时间被压缩虽然采样点能落在有效矢量区间但要采到完整的两次采样仍然困难。解决低调制区的办法是“移相采样”或“脉冲注入”。移相采样是把PWM脉冲的位置做微小调整让两个有效矢量的持续时间都超过最小采样窗口同时在算法中补偿移相带来的电压误差。脉冲注入则是在低调制时强制插入一段额外的有效矢量脉冲通过测量这段脉冲期间的电流来重构相电流。这两种方法都会增加开关损耗和电流纹波但在低速大扭矩工况下是必须的。高调制比下的处理思路则相反需要保证零矢量时间至少够一次采样用。如果调制比过高导致零矢量不够就需要限制最大调制比或者切换到过调制模式时合并采样策略——在过调制区参考电压矢量已经不能保持SVPWM的标准六扇区结构此时单电阻重构基本失效很多实现会降级为开环强制换向或依赖观测器估算电流。4.3 单电阻采样的实际配置建议如果要硬着头皮上单电阻方案我的配置建议是采样电阻阻值不能太小否则信噪比太差。直流母线电流相对相电流要小一些因此需要根据最大母线电流和运放增益倒推电阻值通常1到10毫欧比较常见。运放带宽要足够高因为单电阻需要捕捉极窄的脉冲信号脉宽可能只有1到2微秒运放的建立时间必须在这个量级以内。ADC触发源的灵活性很重要。单电阻方案需要在一个PWM周期内触发多次ADC而且两次采样的时刻不同。如果用硬件比较器产生触发信号比如STM32的TRGO2事件通过CCR值来触发会比软件中断更可靠。还有一个技巧单电阻采样时采样点不要选在有效矢量的正中间而应该略微偏后。因为有效矢量开始时电流会有一个突变的振铃过程中间位置可能是振铃的峰值偏后一点反而更接近稳态值。这个偏移量要根据实际电路调试我一般从矢量中点往后偏10%到20%开始试看电流波形的噪声情况微调。5. 采样电路硬件设计与参数计算5.1 运放选型别只看增益很多入门教程教人搭电流采样电路都是“同相放大器放大倍数1Rf/Rg”然后选个运放写上就行。实际做产品的时候运放选型才是决定采样质量的关键。电流采样电路的完整链路是采样电阻上的mV级差分信号经过信号调理电路变成ADC输入范围内的单端信号。这个链路中运放承担的是“高速、高精度、强抗干扰”的角色。我建议的选型流程是先计算满量程电流对应的采样电阻压降然后确定运放增益使满量程输出电压在ADC参考电压的80%左右留裕量防止过冲最后再看运放的带宽和压摆率是否够用。举个例子最大相电流50A采样电阻2毫欧满量程压降100mV。ADC参考电压3.3V希望满量程输出2.64V那么运放增益就是26.4倍。采样窗口3微秒要求运放在这段时间内建立到0.1%精度运放的压摆率至少要保证输出从0到2.64V的过程不超过1微秒也就是压摆率至少2.64V/1微秒2.64V/微秒实际还要留3到5倍裕量选5到10V/微秒的比较保险。我常用的运放包括TI的INA240集成PWM抑制ADI的AD8418以及国产的圣邦微SGM8557等具体看项目成本要求。INA240自带的PWM共模抑制功能对电机驱动环境特别友好可以大幅简化前端滤波设计强烈推荐用在三电阻和双电阻方案上。5.2 RC滤波参数不是随便加个电容就完事电流采样电路的输入端通常会有一阶RC低通滤波器用来滤除开关噪声和振铃。但这个RC的截止频率是有讲究的太低了会把有用的电流信息滤掉太高了滤不掉噪声必须卡在中间。以20kHz的PWM为例电流信号的基频是电角频率对极对数较多的电机可能只有几Hz到几百Hz。但我们真正需要保留的不是基频而是PWM周期内的电流变化趋势尤其是在采样点附近要保持电流真实。因此RC截止频率不能低于PWM频率太多我一般设计在PWM频率的5到10倍也就是100kHz到200kHz。有一个反面经验要分享很多人为了“更干净”的信号把RC截止频率压到几千赫兹结果电流环带宽根本跑不上去高速时电流波形严重滞后PI调节器怎么调都调不稳定。这种情况我遇到过不止一次排查了一整天最后发现是一个不起眼的滤波电容选大了。具体参数计算假设R100欧姆想要截止频率150kHz那么C1/(2πRf)1/(23.14100*150000)≈10.6nF取10nF即可。需要注意C必须选用C0G或NP0材质的电容X7R在直流偏压下容量会下降50%以上严重影响实际滤波效果。5.3 PCB布局开尔文连接和地弹电流采样的PCB布局是整个系统最容易出“玄学”问题的地方。同一个电路原理图一模一样换一个布局电流噪声就天差地别这在电机驱动里太常见了。第一原则是采样电阻必须用“四线开尔文连接”。采样电阻的两个功率端子流过大电流如果运放的采样线直接从功率端子上引出来大电流在铜箔上的压降会被运算放大器当作信号采集进去。正确的做法是从采样电阻的两个端子内部各引出一根细线开尔文检测线直接连接到运放的差分输入端。检测线上没有大电流因此压降为零运放采到的才是真正的电阻压降。第二原则是功率地和控制地单点连接。采样电阻的功率地端会流过非常大的开关电流这个电流在PCB铜箔上会产生地弹电压。如果运放的参考地直接连接到功率地的某个点地弹噪声会直接叠加到输出信号上。我通常的做法是功率地走粗短路径连接母线电容控制地独立一块区域两个地通过一个0欧电阻或磁珠在单点连接。第三原则是采样电阻尽量靠近MOS管源极和下桥臂连接点。采样电阻离MOS管太远中间铜箔的寄生电感会在开关瞬间产生尖峰电压轻则导致采样数据毛刺重则超过运放共模输入范围损坏运放。PCB走线越短、回路面积越小寄生电感越低。6. 采样时刻配置定时器、ADC与死区的三方博弈6.1 STM32中心对齐PWM的触发链路在STM32平台上FOC电流采样最主流的做法是用高级定时器输出6路带死区的互补PWM同时利用定时器的触发输出TRGO来启动ADC注入组转换。整个链路的关键在于PWM的翻转时刻和ADC的采样时刻必须严格同步任何软件延迟都会导致采样点偏移采到错误的电流值。具体配置上我看大多数人是这么做的定时器配置为中心对齐模式1或模式2向上向下计数。用TRGO事件作为ADC的触发源事件类型选择“更新事件”或“比较事件”。ADC配置为注入组模式同时采样U、V两相双电阻方案或三相三电阻方案。注入组转换完成后触发DMA传输或中断在中断里读取ADC结果并执行FOC计算。这里有个细节中心对齐模式下上溢和下溢都会产生更新事件。如果不加区分地都用TRGO触发ADC那么每个PWM周期会触发两次采样。这对有些应用是好事可以做两次FOC计算提高控制频率但对大部分应用来说是浪费算力而且第二次采样的数据可能和第一次重复。我一般配置定时器的REP寄存器重复计数寄存器为1这样每两个更新事件才产生一次上溢中断或TRGO事件把采样频率锁定为PWM频率。6.2 采样保持时间与窗口计算采样窗口的计算公式我总结了一个经验公式可以直接套用T_window ≥ T_r_settle T_adc_sample T_adc_conv T_margin其中T_r_settle运放建立时间通常取运放数据手册上0.1%建立时间的2到3倍。T_adc_sampleADC采样保持时间由ADC寄存器配置的采样周期数乘以ADC时钟周期。T_adc_convADC逐次逼近转换时间STM32F103上是12.5个ADC时钟周期加上采样周期。T_margin裕量一般至少1微秒防止温度漂移和器件离散性导致时间不够。以STM32F103为例ADC时钟配置为12MHz采样周期配置为13.5个周期转换时间12.5个周期总时间约为26个时钟周期也就是2.17微秒。再加上运放建立时间1微秒和裕量1微秒最小采样窗口约4.2微秒。这意味着PWM的零矢量时间或有效矢量时间至少要大于4.2微秒否则就采不到有效数据。这个计算要特别注意在双电阻方案中两个通道是同时采样的需要保证两个通道的运放都建立了并且ADC能一次注入组完成采样。如果两路运放的建立时间不同比如一路带宽高的运放、一路带宽低的以慢的那路为准。6.3 一个能直接抄的初始化配置流程我分享一个自己在STM32F405上用的双电阻采样配置流程硬件上U、V两相各一个采样电阻INA240运放输出直接进ADC注入组通道。第一步初始化定时器TIM1为PWM中心对齐模式PWM频率20kHz预分频和自动重载值按系统时钟计算输出六路带死区的PWM。第二步配置定时器TRGO为更新事件触发在TIM1_CR2寄存器中设置MMS字段。注意这里要选“Update Event - Counter overflow”或者使用重复计数器后的更新事件不要选“Update Event - Both overflow and underflow”否则采样频率翻倍。第三步配置ADC1为注入组模式注入通道序列为U相和V相触发源选择EXTI_11TIM1_TRGO。采样周期配置为28.5周期ADC时钟12MHz时约2.4微秒两个通道按顺序转换。第四步配置ADC注入组转换结束中断在中断中读取ADC数据马上执行电流重构和FOC算法同时清除标志位。第五步在FOC主循环中使能PWM输出之前先做零点校准停止PWM读取两次采样的ADC值存入偏移变量。运行时每次读取ADC后用当前值减去偏移量得到真正的电流值。这套流程跑起来之后如果电流波形还有噪声优先检查的是采样点是否落在死区时间附近。死区时间内上下桥都关断采样电阻上的电压是不确定的如果ADC恰好在这段时间触发采到的值就是乱的。死区时间一般1到2微秒而采样点要避开死区要么提前、要么延后这个在配置触发相位时要留出足够余量。7. 炸机隐患排查实录7.1 常见故障表现速查表这一节我把实际调试中最常遇到的故障现象、可能原因和处理方法整理成一张速查表方便大家遇到问题时快速定位。故障现象可能原因排查思路上电即炸MOS管PWM死区时间不足上下桥直通用示波器测量桥臂中点电压检查死区配置是否生效电流波形有规律毛刺采样点落在扇区边界或死区附近检查采样时刻与PWM边沿的关系调整触发点位置电流波形高频噪声大采样电路RC截止频率过高或运放带宽不足用差分探头直接测量采样电阻两端波形确认噪声来源电流环发散、电机啸叫电流采样极性反了或增益不对先断开电流环只跑开环逐项检查采样增益极性和编码器方向低速时电机转矩抖动单电阻/双电阻重构在低调制区失效检查最低有效采样窗口确认是否满足采样时间需求ADC读到的电流一直偏小采样保持时间太短ADC采样电容未充满增加ADC采样周期数或者降低ADC时钟频率某一相电流明显不对称采样电阻温漂或不一致用万用表实测两颗采样电阻阻值必要时用低温漂合金电阻7.2 时序问题导致采到“毛刺电流”我调过的一个项目三相电流波形在每一个PWM周期都有一个尖刺尖刺的位置不固定但总是在死区切换后出现。用示波器测量采样电阻两端的波形发现死区结束瞬间采样电阻上的电压有一个幅度很大的振铃振铃持续约1到2微秒恰好覆盖了ADC采样点。这个问题的根源是MOS管的输出电容和采样电阻的寄生电感构成了一个LC谐振回路在开关切换时产生高频振铃。解决办法有两个方向一是在硬件上减小采样回路的寄生电感优化PCB走线二是在软件上调整采样点把ADC触发时刻往后延迟到振铃衰减之后。我最后选择的是软件调整把采样点从PWM边沿后0.5微秒改到1.5微秒同时把ADC采样周期从13.5提高到28.5振铃问题基本消失。这里要注意如果采样点延迟太多电流可能已经进入下一个开关状态采样到的值反映的不是当前周期的平均电流所以延迟不是越大越好要在示波器上反复看波形找准最优位置。7.3 电流采样发散的调试思路电流采样如果出了正反馈最直接的表现是电流环增益稍微调大一点点就振荡甚至飞车。遇到这种情况不要急着调PI参数先把采样链路检查一遍。我的调试顺序是开环状态直接给定开环电压矢量下读回ADC值确认电流波形是正弦的幅值符合预期。用直流母线电压源给电机一个固定力矩灌入直流电流确认采样值和实际值一致增益准确。校准零漂确保电机静止时ADC读数为零。闭合电流环从很小的比例增益开始逐步增加观察电流波形是否收敛。如果某个增益下发散先降低增益再用示波器对比电流指令和实际反馈的相位延迟确认是否存在采样时刻过晚导致的相位滞后。实际上大部分电流环发散不是PI参数的问题而是采样链路的增益错误或极性搞反了。尤其是采样极性反了电流环表现为“负反馈变正反馈”稍微给一点指令就飞。这个最简单的排查办法是给一个很小的正电流指令看实际电流是正的还是负的如果是反的把ADC两路通道交换一下或者把采样增益改成负数。我做过的项目里大概有三成的调试时间都花在电流采样上而且踩坑的方向翻来覆去就是这几个。把这些经验写出来就是希望正在调FOC的朋友能少走点弯路。电流采样是整个FOC控制的地基地基不稳上层算法再花哨都白搭。调好采样后面的电流环、速度环、位置环才能有可靠的支撑系统才能真正稳定地跑起来。
返回列表