ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FOC电流环延迟优化:SSSU、DSDU、SSDU、DSSU四种PWM采样更新策略对比与选型

FOC电流环延迟优化:SSSU、DSDU、SSDU、DSSU四种PWM采样更新策略对比与选型 1. 电流环延迟的根源从PWM更新时刻说起搞FOC的兄弟大概率都遇到过这种情况明明电流环PI参数按理论带宽算得好好的阶跃响应也还行但一到高速段电流波形就开始发毛d-q轴电流耦合怎么调都压不下去。折腾半天最后发现问题不在PI也不在解耦而是采样和PWM更新之间的时序关系没搞对。这就是SSSU、DSDU、SSDU、DSSU这四种策略要解决的核心问题。它们描述的是电流采样时刻与PWM占空比更新时刻之间的相对关系直接决定了电流环里到底存在多少拍延迟。这个延迟听起来好像只是慢了一点点但在高带宽电流环里它足以吃掉你一半以上的相位裕度。先把四个缩写拆开看每个字母代表一个动作发生的时刻第一个字母SSingle或DDouble表示采样在PWM周期的哪个位置——S是单次采样通常在计数器峰值或谷值D是双次采样峰值和谷值各采一次。第二个字母S或D表示更新占空比寄存器写入发生在哪个位置。第三个字母S或D表示采样到更新之间的对齐方式。第四个字母UUpdate统一表示更新动作。说实话这套命名法第一次看确实绕。但只要你抓住一个核心采样时刻和更新时刻之间隔了几个PWM周期的一半就能把四种策略的延迟算得明明白白。为什么这个延迟这么要命因为电流环是FOC里带宽最高的环路典型设计目标在1~3kHz。假设你的PWM频率是10kHz一个PWM周期就是100μs。如果采样到更新之间隔了1.5个周期那就是150μs的纯延迟。150μs在1kHz带宽下对应的相位滞后是φ 2π × f × T_delay 2π × 1000 × 150e-6 ≈ 54°54°的相位滞后是什么概念你的PI调节器本来有60°左右的相位裕度直接被吃掉大半。这还没算采样滤波、ADC转换时间、计算耗时带来的额外延迟。所以很多人调电流环调到头秃根子就在这儿。下面这张表先把四种策略的延迟量摆出来后面再逐个拆解策略采样时刻更新时刻采样到更新延迟等效延迟含零阶保持SSSU峰值单次峰值00.5 TsDSDU峰值谷值峰值0.5 Ts1.0 TsSSDU峰值单次谷值0.5 Ts1.0 TsDSSU峰值谷值谷值0.5 Ts1.0 Ts注意表里等效延迟那一列它包含了零阶保持器ZOH本身带来的0.5 Ts延迟。这是采样系统的固有属性躲不掉。真正能优化的是采样到更新延迟这一项。2. 四种策略的时序拆解谁快谁慢差在哪半拍2.1 SSSU单采单更延迟最小的理想方案SSSU是最直观的策略在PWM计数器到达峰值或谷值时触发ADC采样采样完成后立刻计算然后在同一个峰值点把新的占空比写进寄存器。时序上大概是这样的计数器峰值 ──→ ADC触发 ──→ ADC转换 ──→ 电流环计算 ──→ 更新占空比 ↑ │ └──────────────── 下一个周期 ──────────────────────────┘理想情况下采样到更新的延迟接近0。但现实很骨感ADC转换需要时间通常1~2μs电流环计算需要时间Clarke/Park、PI、反Park、SVPWM在100MHz的MCU上大概2~5μs。如果PWM频率是10kHz半周期是50μs这些时间完全塞得进去。但如果PWM频率拉到20kHz以上半周期只有25μs计算时间就开始紧张了。SSSU的等效延迟是0.5 Ts这是四种策略里最小的。代价是对MCU算力和ADC速度要求最高而且采样点必须精确对齐峰值否则采样值会受开关噪声干扰。实操心得SSSU适合PWM频率不超过15kHz、MCU主频100MHz以上的场景。如果你的开关频率必须拉到20kHz以上比如为了降低电流纹波或避开音频噪声SSSU的计算窗口会非常紧这时候要考虑DSDU或SSDU。2.2 DSDU双采单更抗噪优先DSDU在峰值和谷值各采一次电流但只在峰值时刻更新占空比。为什么要采两次因为单次采样容易受到开关瞬间的di/dt噪声干扰双次采样可以做平均或者选择噪声较小的那个点。但代价是延迟翻倍。谷值采到的数据要等到下一个峰值才能更新中间隔了半个周期。峰值采到的数据虽然可以在峰值更新但如果你做了双采平均实际上用的还是上一个周期的数据。DSDU的等效延迟是1.0 Ts。在10kHz PWM下就是100μs对应1kHz带宽的36°相位滞后。比SSSU多了一倍。那为什么还有人用因为电流采样信噪比在某些硬件上确实是瓶颈。特别是低侧分流电阻方案开关管导通瞬间的振铃会持续好几个微秒单次采样根本躲不开。双次采样至少给你一个选择余地。2.3 SSDU单采谷值更新折中方案SSDU只在峰值采样一次但更新放在谷值。这意味着采样到更新之间隔了半个周期0.5 Ts等效延迟1.0 Ts。看起来和DSDU延迟一样但SSDU的优势在于计算时间更充裕。峰值采样后你有整整半个周期的时间做ADC转换和电流环计算到谷值再更新。对于MCU算力一般或者PWM频率较高的场景这个时间窗口很关键。缺点是采样点固定在峰值如果峰值附近有开关噪声没有备选采样点。而且更新在谷值意味着占空比的变化要等到下一个周期才生效动态响应会慢半拍。2.4 DSSU双采谷值更新延迟最大但最稳DSSU是四种策略里延迟最大的峰值和谷值都采样但更新只在谷值进行。等效延迟1.0 Ts而且因为双采平均实际用的数据可能来自上一个周期的谷值延迟感更强。但它的优点是采样最稳、计算时间最充裕。双采平均把开关噪声压得很低谷值更新又给了你一个完整的半周期做计算。在一些对电流纹波要求极高、但对动态响应要求不苛刻的场景比如压缩机、风机DSSU反而是最稳妥的选择。2.5 四种策略的延迟对比与选型逻辑把四种策略放在一起看核心差异就两个维度采样次数和更新时刻。维度SSSUDSDUSSDUDSSU采样次数1212更新时刻峰值峰值谷值谷值采样到更新延迟00.5 Ts0.5 Ts0.5 Ts等效延迟0.5 Ts1.0 Ts1.0 Ts1.0 Ts计算时间窗口极短短半周期半周期抗噪能力弱强弱强动态响应最快中等中等最慢MCU算力要求高中低低选型的逻辑其实不复杂追求极致动态响应SSSU但前提是你的MCU撑得住。噪声环境恶劣但算力充足DSDU双采平均压噪声。算力一般、PWM频率较高SSDU用半周期换计算时间。噪声大且算力紧张DSSU最稳但最慢。注意这里的快和慢是相对电流环带宽而言的。如果你的电流环带宽只设计到500Hz那1.0 Ts的延迟在10kHz PWM下也就18°相位滞后完全在可接受范围内。不要为了追求SSSU而强行上高算力MCU先算清楚你的带宽需求。3. 延迟如何吃掉你的相位裕度定量计算与实测验证3.1 从传递函数看延迟的影响电流环的被控对象可以近似为一阶惯性环节G_plant(s) 1 / (R sL)加上延迟环节 e^(-sT_d)开环传递函数变成G_open(s) K_p × (1 1/(T_i s)) × [1 / (R sL)] × e^(-sT_d)延迟环节在频域上表现为相位滞后滞后量随频率线性增加φ_delay -ω × T_d -2πf × T_d在穿越频率也就是电流环带宽处这个相位滞后直接削减相位裕度。举个例子PWM频率10kHzTs100μs。SSSUT_d 0.5 Ts 50μs在1kHz处相位滞后 2π × 1000 × 50e-6 18°DSDU/SSDU/DSSUT_d 1.0 Ts 100μs在1kHz处相位滞后 36°18°的差距听起来不大但如果你原本设计相位裕度是45°SSSU下还剩27°DSDU下只剩9°。9°的相位裕度意味着系统已经在振荡边缘了稍微一点参数漂移就会发散。3.2 实测波形的对比方法光算不够得实测。验证延迟最直接的方法是给电流环一个阶跃指令看实际电流的响应延迟。具体操作让电机处于堵转状态或者用制动器固定转子d轴给阶跃指令q轴给0。用示波器同时抓d轴电流指令和实际d轴电流。测量从指令跳变到实际电流开始变化的时间差。这个时间差里包含了PWM更新延迟 ADC采样延迟 计算延迟 电流环响应时间。其中PWM更新延迟就是我们要看的。更精确的方法是注入一个小幅高频方波到d轴电流指令然后看实际电流的相位滞后。扫频法能直接测出电流环的幅频和相频特性延迟在相频曲线上表现为高频段额外的斜率。我实测过一台10kHz PWM、SSSU策略的驱动器d轴电流指令注入1kHz方波实测相位滞后约22°和理论计算的18°加上ADC和计算延迟的4°基本吻合。换成SSDU策略后同样条件下相位滞后跳到40°左右电流环带宽被迫从1.2kHz降到800Hz才能保持稳定。3.3 延迟补偿的几种手段延迟没法消除但可以补偿。常见的手段有相位超前补偿在电流环PI调节器里加一个超前环节抵消部分延迟带来的相位滞后。但超前补偿会放大高频噪声要配合低通滤波使用。预测电流控制用电机模型预测下一个周期的电流提前计算占空比。这相当于把延迟预支掉但依赖模型精度。提高PWM频率Ts减小延迟绝对值减小。但开关损耗增加效率下降。优化采样时机在开关噪声最小的时刻采样减少滤波带来的额外延迟。实操心得相位超前补偿在SSSU下效果最好因为基础延迟小补偿后相位裕度充足。在DSSU下基础延迟已经很大超前补偿需要加得很猛高频噪声放大严重往往得不偿失。所以优先选延迟小的策略再考虑补偿而不是反过来。4. 工程落地从寄存器配置到代码实现的完整链路4.1 定时器与ADC的联动配置四种策略的实现核心在于定时器事件触发ADC和定时器事件触发寄存器更新的配置。以常见的STM32 HRTIM或高级定时器为例SSSU定时器峰值事件触发ADCADC转换完成中断里做电流环计算计算结果在下一个峰值事件前写入比较寄存器。关键是峰值事件到峰值事件之间要留够计算时间。DSDU峰值和谷值都触发ADC但只在峰值事件更新比较寄存器。谷值采到的数据存起来峰值时和峰值数据一起用。SSDU峰值触发ADC谷值事件更新比较寄存器。计算在峰值到谷值之间完成。DSSU峰值和谷值都触发ADC谷值事件更新比较寄存器。配置时最容易踩的坑是ADC触发源和更新触发源搞混。比如你想配SSDU结果ADC触发源配成了谷值更新触发源配成了峰值那就变成了DSDU的时序延迟直接翻倍。4.2 采样窗口与开关噪声的躲闪低侧分流电阻方案里开关管导通瞬间的振铃会持续1~3μs。如果你的采样点正好落在振铃区采到的电流值会严重偏离真实值。解决办法调整采样点偏移在峰值事件后延迟几个微秒再触发ADC躲开振铃。但延迟太多会侵入下一个开关状态所以窗口很窄。双次采样取有效值DSDU和DSSU的双采就是为了这个。峰值采一次、谷值采一次比较两次的差异选噪声小的那个或者做平均。硬件滤波在分流电阻两端加RC滤波截止频率设在开关频率的1/10左右。但RC滤波会引入额外相位滞后要算进总延迟里。注意采样点偏移和RC滤波都会增加等效延迟。如果你已经选了SSSU追求最小延迟结果又加了3μs的采样偏移和2μs的RC滤波那实际延迟可能比SSDU还大。延迟优化是一个系统工程不能只看策略本身。4.3 代码实现的关键片段以SSDU为例伪代码大概长这样// 峰值事件中断触发ADC采样 void PWM_Peak_ISR(void) { ADC_StartConversion(); // 触发电流采样 } // ADC转换完成中断做电流环计算 void ADC_Complete_ISR(void) { ia ADC_GetValue(IA_CH); ib ADC_GetValue(IB_CH); ic -(ia ib); // Clarke变换 i_alpha ia; i_beta (ia 2*ib) * ONE_BY_SQRT3; // Park变换 i_d i_alpha * cos_theta i_beta * sin_theta; i_q -i_alpha * sin_theta i_beta * cos_theta; // PI调节 v_d PI_Regulate(pi_d, i_d_ref - i_d); v_q PI_Regulate(pi_q, i_q_ref - i_q); // 反Park变换 v_alpha v_d * cos_theta - v_q * sin_theta; v_beta v_d * sin_theta v_q * cos_theta; // SVPWM计算 SVPWM_Calculate(v_alpha, v_beta, duty_a, duty_b, duty_c); // 存起来等谷值事件更新 duty_a_pending duty_a; duty_b_pending duty_b; duty_c_pending duty_c; } // 谷值事件中断更新占空比 void PWM_Valley_ISR(void) { TIM_SetCompare(TIM_CH_A, duty_a_pending); TIM_SetCompare(TIM_CH_B, duty_b_pending); TIM_SetCompare(TIM_CH_C, duty_c_pending); }这段代码里从ADC完成到谷值更新之间有半个PWM周期的时间余量。如果PWM频率是10kHz半周期50μs足够跑完整个电流环。如果是SSSU更新要放在峰值事件里那ADC完成到峰值更新之间的时间窗口就非常短。你得把电流环计算压缩到几个微秒内或者用更高主频的MCU。4.4 不同MCU平台的适配差异不同厂商的MCU在PWM和ADC联动上的设计差异很大STM32系列高级定时器支持多种触发源ADC注入通道可以精确对齐PWM事件。HRTIM更适合高频场景。TI C2000系列ePWM模块和ADC的联动非常灵活支持多种采样和更新组合是FOC的经典平台。国产MCU如峰岹、灵动等很多针对电机控制做了专用外设PWM和ADC的联动配置更简化但灵活性可能不如通用MCU。实操心得换MCU平台时先确认PWM和ADC的联动方式再决定用哪种采样-更新策略。有些MCU的ADC触发源是固定的你只能选它支持的那几种策略。别等到代码写完了才发现硬件不支持SSSU。5. 选型决策树与常见误区5.1 一张决策树搞定策略选择面对一个具体的项目怎么选按下面的顺序问自己电流环带宽要求是多少如果低于500Hz四种策略随便选延迟影响都不大。如果高于1kHz优先SSSU。PWM频率是多少10kHz以下SSSU的计算窗口充裕。15kHz以上SSSU可能塞不下考虑SSDU。MCU主频和算力如何100MHz以下SSSU可能跑不动选SSDU或DSSU。电流采样噪声大不大低侧分流长走线噪声大选DSDU或DSSU。相电流传感器方案噪声小SSSU或SSDU。动态响应要求高不高伺服应用要求高选SSSU。风机水泵要求低DSSU足够。把这五个问题串起来基本就能锁定策略。5.2 常见误区延迟不是唯一指标很多人一看到SSSU延迟最小就无脑选SSSU结果发现电流波形反而更差了。原因可能是采样噪声SSSU单次采样如果采样点没躲开噪声采到的值本身就是错的延迟再小也没用。计算时间不足SSSU要求在一个PWM周期内完成采样、计算、更新如果MCU跑不动计算被截断或者更新错过窗口实际延迟反而更大。死区补偿干扰SSSU下更新频繁死区补偿的误差会被放大低速时电流畸变可能更严重。所以选型时要综合看延迟、噪声、算力、动态响应四个维度而不是只盯延迟。5.3 从SSDU迁移到SSSU的实操记录我最近把一个风机项目从SSDU迁移到SSSU记录一下过程原方案10kHz PWMSSDU电流环带宽800HzMCU主频72MHz。迁移目标把带宽提到1.2kHz改善低速转矩响应。步骤确认MCU算力72MHz下电流环计算耗时约4μsSSSU的半周期50μs足够。修改ADC触发源从峰值触发改为峰值触发不变但更新从谷值改为峰值。调整采样点偏移原来在峰值后2μs采样现在改到峰值后1μs减少延迟。重新整定PI参数带宽从800Hz提到1.2kHzKp增大50%Ki相应调整。实测验证d轴阶跃响应上升时间从1.2ms降到0.7ms相位裕度从35°提到48°。踩的坑迁移后低速时电流纹波变大原因是SSSU更新频繁死区补偿的步进误差被放大。后来把死区补偿的更新率降低到和SSDU一样问题解决。这个案例说明策略迁移不是改个配置就完事相关的补偿算法也要跟着调。6. 高速场景下的特殊考量6.1 高速时采样窗口被压缩的问题电机转速升高后电频率升高一个电周期内的PWM周期数减少。比如10kHz PWM4对极电机3000rpm时电频率200Hz一个电周期50个PWM周期。到6000rpm时一个电周期只有25个PWM周期。这意味着电流环的计算时间窗口没变但电流指令的变化速度变快了。SSSU下如果计算耗时占半周期的比例过大高速时可能来不及更新导致电流跟踪误差增大。解决办法降低PWM频率高速时适当降低开关频率给计算留更多时间。但会增加电流纹波。简化算法高速时跳过一些非必要的补偿如死区补偿的精细调整把计算时间压下来。用SSDU牺牲一点延迟换半周期的计算时间。6.2 弱磁区的延迟敏感性弱磁区里d轴电流为负电机端电压接近极限。这时候电流环的延迟会直接影响弱磁控制的稳定性。延迟大了d轴电流响应慢弱磁点可能漂移导致电压饱和或者电流失控。在弱磁区SSSU的优势最明显。因为弱磁控制本身就是一个快速响应的过程延迟每增加一点弱磁的稳定边界就收窄一点。我实测过同样一台电机SSSU下弱磁区能跑到额定转速的1.5倍SSDU下只能跑到1.3倍再往上就振荡了。6.3 无感FOC中延迟对观测器的影响无感FOC的滑模观测器或者龙伯格观测器依赖电流和电压的实时值来估算反电动势。如果电流环延迟大观测器拿到的电流值是过时的估算出的转子位置就会有滞后。这个滞后在低速时影响不大因为电频率低一个周期的延迟对应角度小。但高速时比如电频率500Hz1.0 Ts的延迟在10kHz PWM下对应18°的电角度误差。18°的位置误差足以让转矩输出下降cos(18°)≈0.95也就是5%的转矩损失。如果延迟更大转矩损失更严重。所以无感FOC高速场景优先选SSSU把观测器的输入延迟压到最小。7. 实测数据与个人经验总结7.1 四种策略在同一台电机上的实测对比测试条件10kHz PWM24V供电7对极PMSMMCU主频100MHz电流环带宽设计1kHz。策略阶跃响应上升时间1kHz相位滞后电流纹波额定负载低速转矩脉动SSSU0.65ms20°3.2%2.1%DSDU0.95ms38°2.8%2.5%SSDU0.92ms37°3.5%2.3%DSSU1.10ms40°2.6%2.8%数据解读SSSU动态响应最快但电流纹波和转矩脉动略大因为单次采样噪声没被平均掉。DSDU和DSSU纹波小因为双采平均压了噪声但动态响应慢。SSDU在动态和纹波之间取了个中间值但纹波反而最大因为单次采样谷值更新采样噪声没压住更新又慢。这个结果说明SSDU在噪声抑制上没有优势它的价值在于给计算留时间。如果你的噪声环境好SSDU不如SSSU如果噪声环境差SSDU不如DSDU。7.2 我踩过的三个坑坑一ADC触发源配错延迟翻倍还不自知。有一次调一台新板子怎么调电流环都振荡。查了半天PI参数最后发现ADC触发源配成了谷值更新在峰值实际是DSDU的时序但我以为是SSDU。延迟从0.5 Ts变成1.0 Ts相位裕度直接不够了。教训配置完先抓波形确认时序别信自己的记忆。坑二SSSU下计算超时更新错过窗口。有一次用SSSU跑20kHz PWMMCU主频只有80MHz电流环计算耗时6μs半周期只有25μs本来够。但加上中断嵌套和ADC转换实际耗时到了28μs更新错过了峰值窗口延迟反而比SSDU还大。教训SSSU下一定要留足余量计算耗时不要超过半周期的60%。坑三双采平均引入额外延迟。DSDU下做双采平均峰值和谷值的数据各取一半。但谷值数据要等到下一个峰值才用实际上平均后的数据等效延迟是1.5 Ts不是1.0 Ts。教训双采平均的延迟要单独算不能简单按策略表里的数字。7.3 给不同阶段工程师的建议刚接触FOC先用SSDU或DSSU计算时间充裕容易调通。别一上来就SSSU算力不够会调到你怀疑人生。有一定经验根据项目需求选策略别盲目追求低延迟。先算清楚带宽需求和相位裕度再决定。做高速或高性能应用SSSU是首选但要确保MCU算力和ADC速度跟得上。同时做好延迟补偿。做低成本方案DSSU最省算力配合适当的PI参数也能跑出不错的性能。最后说一个我个人的判断四种策略没有绝对的好坏只有适不适合。SSSU延迟最小但对硬件要求最高DSSU延迟最大但最稳最省算力。选型的关键是搞清楚你的瓶颈在哪——是算力、是噪声、还是动态响应。瓶颈找到了策略自然就定了。
返回列表