
1. 电流环延迟的根源为什么采样时刻和更新时刻不能随便选搞电机控制的人尤其是做FOC的迟早会撞上一个绕不开的问题电流环带宽上不去PI参数怎么调都感觉“差一口气”。你可能会怀疑是PI参数不对、是观测器拖了后腿、是PWM频率太低但很多时候真正的元凶藏在一个非常底层的地方——采样时刻和PWM更新时刻的配合方式。这就是SSSU、DSDU、SSDU、DSSU这四个缩写要解决的问题。它们描述的是FOC电流环中两个关键动作的时序关系电流采样Sample和占空比更新Update。S代表Single单次D代表Double双次四个字母两两一组前两个字母说采样后两个字母说更新。听起来简单但这四种组合带来的电流环延迟差异可能直接决定你的电流环能不能跑到2kHz以上。这篇文章适合谁看如果你正在调FOC电流环发现理论带宽和实际响应对不上如果你在用STM32、峰岹、TI C2000这类平台做PMSM无感FOC想搞清楚定时器到底该怎么配如果你只是听说过这四个词但一直没弄明白区别——那这篇内容应该能帮你把这块知识补上。我会从延迟的来源讲起把四种策略的时序掰开揉碎再给出实际配置时的计算方法和踩坑经验。2. 先搞清楚延迟从哪来采样、计算、更新三段链路2.1 电流环的一个周期里到底发生了什么要理解四种策略的差异得先把电流环一个控制周期内的动作拆开。假设PWM频率是20kHz那一个PWM周期是50微秒。在这50微秒里FOC要做的事包括电流采样通过ADC采集三相电流或两相通常在PWM的特定时刻触发坐标变换和PI计算Clarke、Park变换PI调节器运算反Park变换占空比更新把算好的新占空比写入定时器比较寄存器问题在于这三件事不是瞬间完成的。ADC采样需要时间CPU计算需要时间而占空比写入定时器后也不是立刻生效——它要等到下一个PWM周期的特定时刻才会真正影响输出。所以从“电流实际值”到“新占空比生效”之间存在一段纯延迟。这段延迟在控制理论里就是一个滞后环节它会吃掉相位裕度限制带宽。2.2 延迟的两个组成部分采样延迟和更新延迟把延迟拆开看主要分两块第一块是采样到计算的延迟。你在某个时刻采样了电流但这个电流值反映的是采样时刻的电流。等你算完PI、准备更新占空比的时候时间已经过去了。如果采样点选得不好比如选在PWM周期中间但计算要到周期结束才完成那这个电流值其实已经“过时”了。第二块是计算到更新的延迟。你算出了新的占空比但定时器什么时候真正采用这个新值如果定时器配置成“下一个周期才生效”那就又多了一个周期的延迟。这两块延迟加起来就是电流环的总延迟。而SSSU、DSDU、SSDU、DSSU这四种策略本质上就是在回答两个问题一个PWM周期里采样几次一个PWM周期里更新几次不同的组合延迟完全不同。2.3 为什么延迟对电流环带宽影响这么大用控制理论的话说纯延迟环节的传递函数是e^(-Ts)它在频域上会引入与频率成正比的相位滞后。延迟越大同样频率下的相位滞后越多系统的相位裕度就越少能用的带宽就越低。举个直观的例子假设总延迟是1.5个PWM周期PWM频率20kHz那延迟时间就是75微秒。在1kHz频率下这个延迟引入的相位滞后是相位滞后 360° × f × T_delay 360° × 1000 × 75e-6 ≈ 27°如果延迟降到0.5个PWM周期也就是25微秒同样1kHz下的相位滞后只有9°。这18°的差异在PI调参时就是“能调上去”和“怎么调都振荡”的区别。所以理解四种策略的核心就是理解它们各自的总延迟是多少个PWM周期。3. 四种策略逐一拆解时序图在脑子里画出来3.1 SSSU单采样单更新最基础但也最保守SSSU的全称是Single Sample Single Update一个PWM周期内采样一次、更新一次。这是最容易理解、也最常用的配置很多入门教程和基础例程用的就是这种。具体时序是这样的假设PWM采用中心对齐模式计数器从0往上数到峰值再往下数回0。在计数器到达峰值或者谷底的时候触发ADC采样采样完成后CPU开始计算计算完成后在下一个周期的开始或者特定时刻更新占空比。这种配置下从采样到新占空比生效中间隔了大约一个完整的PWM周期。也就是说总延迟约为1个PWM周期。如果PWM是20kHz延迟就是50微秒。SSSU的优点是实现简单、时序清晰、不容易出错。缺点是延迟大电流环带宽受限。一般来说SSSU配置下电流环带宽能跑到PWM频率的1/10到1/15左右20kHz PWM对应大约1.3kHz到2kHz的带宽。注意SSSU的延迟计算有个容易搞错的地方——如果你在计数器峰值采样在下一个周期峰值更新那延迟其实是1.5个周期而不是1个。具体取决于定时器的更新时机配置后面会详细说。3.2 DSDU双采样双更新延迟最小的激进方案DSDU是Double Sample Double Update一个PWM周期内采样两次、更新两次。这是四种策略里延迟最小的但实现也最复杂。时序逻辑是在计数器峰值采样一次计算后在本周期谷底更新在计数器谷底再采样一次计算后在本周期峰值更新。这样每个PWM周期内有两次“采样-计算-更新”的完整链路每次链路的延迟只有半个PWM周期。还是以20kHz PWM为例DSDU的总延迟约25微秒比SSSU少了一半。这意味着在同样相位裕度要求下电流环带宽可以做到SSSU的接近两倍。但DSDU的代价也很明显CPU负载翻倍一个PWM周期内要做两次完整的FOC计算包括Clarke、Park、PI、反Park、SVPWM。如果CPU算力不够根本跑不过来。采样时刻要求严格两次采样必须精确对准峰值和谷底ADC触发配置要非常小心。中断处理复杂通常需要用两个中断或者一个中断里处理两次代码逻辑比SSSU复杂不少。我实测下来DSDU在STM32G4或者TI C2000这类带硬件加速的平台上比较现实普通M3核跑20kHz DSDU会比较吃力。3.3 SSDU单采样双更新折中方案的代表SSDU是Single Sample Double Update一个PWM周期采样一次但更新两次。这个策略有点“取巧”的意思。它的思路是只在峰值采样一次但计算完成后在谷底和下一个峰值各更新一次。或者说采样还是每个周期一次但占空比的更新频率提高到了两倍。这样做的好处是采样延迟没变但更新延迟减小了。因为新占空比不用等一整个周期才生效而是在半个周期内就能起作用。总延迟大约在0.5到1个PWM周期之间具体取决于更新时刻的配置。SSDU的CPU负载比DSDU低因为只做一次FOC计算。但它的控制效果比SSSU好因为更新更及时。适合那些CPU算力中等、但又想改善电流环响应的场景。不过SSDU有个需要注意的地方因为采样还是单次如果采样时刻和更新时刻配合不好可能会出现“用旧电流算新占空比”的情况反而引入额外延迟。配置时一定要看清楚定时器的影子寄存器机制。3.4 DSSU双采样单更新听起来奇怪但有场景DSSU是Double Sample Single Update一个PWM周期采样两次但只更新一次。这个组合乍看有点反直觉——采样两次有什么用反正只更新一次它的价值在于平均电流采样或者过采样降噪。有些应用里电流采样噪声比较大单次采样可能不准。在一个PWM周期内采两次取平均值作为电流反馈可以有效抑制噪声。但更新还是每个周期一次保持控制输出的稳定性。DSSU的总延迟和SSSU接近大约1个PWM周期。它的优势不在延迟而在采样质量。适合那些对电流采样精度要求高、但CPU算力不足以跑DSDU的场景。不过说实话DSSU在实际项目中用得相对少因为如果采样噪声大到需要双采样平均通常更根本的解决办法是优化硬件布局和ADC配置。但在某些特定场合比如低电感电机或者高噪声环境DSSU确实能派上用场。3.5 四种策略的延迟对比把四种策略的延迟和特点整理成表看起来更直观策略采样次数/周期更新次数/周期总延迟PWM周期CPU负载适用场景SSSU11约1.0低入门、低带宽需求DSDU22约0.5高高带宽、算力充足SSDU12约0.5-1.0中折中、改善响应DSSU21约1.0中采样降噪、特殊场景这个表里的延迟是典型值实际延迟还取决于定时器的具体配置比如影子寄存器是立即生效还是下周期生效、ADC触发点选在哪里。下面会详细说这些细节。4. 定时器配置实战影子寄存器、触发点和中断时机4.1 影子寄存器决定更新何时生效的关键不管你用哪种策略占空比的更新最终都要写到定时器的比较寄存器比如STM32的CCR寄存器。但很多定时器都有一个“影子寄存器”机制你写入的值不会立即生效而是等到下一个更新事件UEV时才从影子寄存器搬到实际寄存器。这个机制的好处是防止PWM波形出现毛刺但代价是引入额外延迟。如果你在周期中间写入CCR但更新事件在周期结束时才发生那新占空比就要等到下一个周期才生效。所以配置时一定要确认你写入CCR后新值是在本周期生效还是下周期生效这直接决定了更新延迟是0.5个周期还是1.5个周期。以STM32的高级定时器为例CCR寄存器有预装载功能通过TIMx_CR1的ARPE位控制。如果ARPE1CCR的写入会在更新事件时生效如果ARPE0写入立即生效。但立即生效可能导致当前周期波形异常所以通常还是用预装载。4.2 ADC触发点峰值采样还是谷底采样ADC的触发时刻通常由定时器的比较事件或者更新事件触发。在中心对齐模式下计数器到达峰值和谷底时各有一个更新事件或者比较事件可以配置ADC在这两个时刻之一或两者都触发。选择峰值还是谷底采样要考虑几个因素开关噪声PWM开关瞬间会产生噪声采样点要避开开关时刻。通常峰值或谷底是相对安静的时刻因为此时没有开关动作。电流纹波在峰值和谷底电流纹波处于极值点采样值更稳定。计算时间采样后需要足够的时间完成FOC计算所以采样点要留出足够的计算窗口。对于SSSU通常选峰值采样然后在下一个周期的峰值更新这样计算时间最充裕。对于DSDU峰值和谷底都要采样计算窗口只有半个周期对CPU要求高。4.3 中断时机什么时候开始算ADC采样完成后会触发中断CPU在中断里做FOC计算。中断的响应时间和计算时间加起来必须小于从采样到更新的时间窗口。以20kHz PWM、SSSU为例一个周期50微秒。如果峰值采样下一个峰值更新那计算窗口大约是一个周期减去中断响应和ADC采样时间可能只有40微秒左右。FOC计算包括Clarke、Park、两个PI、反Park、SVPWM在M3核上大概需要5到10微秒M4核带FPU会快很多。所以时间上是够的但如果你还要在中断里做观测器、速度环、保护逻辑就要仔细算了。DSDU的话计算窗口只有半个周期25微秒。如果FOC计算加观测器要15微秒那余量就不多了。这时候要么提高CPU主频要么用硬件加速要么把观测器放到后台任务里。实操心得我一般会在中断里只做最关键的电流环计算和PWM更新观测器和速度环放到慢速任务里。这样即使DSDU也能跑得比较从容。4.4 一个具体的配置示例以STM32G4为例配置20kHz中心对齐PWM、SSSU策略的大致步骤// 定时器基础配置 TIM1-ARR 4250; // 假设主频170MHz中心对齐模式下20kHz对应ARR4250 TIM1-CR1 | TIM_CR1_CMS_0; // 中心对齐模式1 TIM1-CR1 | TIM_CR1_ARPE; // ARR预装载使能 // CCR预装载使能 TIM1-CCMR1 | TIM_CCMR1_OC1PE; TIM1-CCMR2 | TIM_CCMR2_OC3PE; // ADC触发配置峰值触发 TIM1-CCR4 4250; // 峰值处触发ADC TIM1-CCMR2 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2; // 比较输出模式这段代码的关键点是CCR4配置在峰值处触发ADC同时CCR预装载使能确保占空比更新在更新事件时生效。实际项目中还要配置ADC的采样时间和通道顺序以及中断优先级。5. 延迟计算与带宽估算把数字算清楚5.1 总延迟的精确计算方法总延迟 采样延迟 计算延迟 更新延迟采样延迟从电流实际值到ADC采样完成的时间通常很小可以忽略计算延迟从ADC中断触发到FOC计算完成的时间取决于CPU和代码效率更新延迟从计算完成到新占空比真正影响PWM输出的时间取决于定时器配置对于SSSU如果峰值采样、下周期峰值更新更新延迟约为1个PWM周期。加上计算延迟假设5微秒总延迟约55微秒20kHz PWM。对于DSDU峰值采样、谷底更新更新延迟约0.5个周期。总延迟约30微秒。5.2 从延迟反推可用带宽控制理论里有个经验法则电流环带宽应小于1/(10×总延迟)到1/(5×总延迟)。以SSSU、总延迟55微秒为例保守带宽1/(10×55e-6) ≈ 1.8kHz激进带宽1/(5×55e-6) ≈ 3.6kHz但实际能跑到多少还要看PI参数、电机参数、相位裕度要求。我一般会留足裕度把目标带宽设在保守值附近。DSDU、总延迟30微秒的话保守带宽1/(10×30e-6) ≈ 3.3kHz激进带宽1/(5×30e-6) ≈ 6.6kHz这就是为什么高带宽电流环通常要用DSDU——延迟减半带宽理论上可以翻倍。5.3 实际调参时的验证方法理论算完实际调的时候怎么验证我通常用两种方法第一种是看电流阶跃响应。给q轴电流一个阶跃指令看实际电流的上升时间和超调量。上升时间越短、超调越小说明带宽越高、相位裕度越足。第二种是扫频测试。给电流指令叠加不同频率的小信号正弦看实际电流的幅值衰减和相位滞后。幅值降到-3dB的频率就是实际带宽。这个方法更准确但需要额外的测试设备或软件支持。实测下来SSSU在20kHz PWM下电流环带宽做到1.5kHz左右比较稳再往上调PI就容易振荡。DSDU可以做到3kHz以上但前提是CPU算力够、采样噪声小。6. 常见问题与排查技巧实录6.1 电流波形振荡PI怎么调都不稳这是最常见的问题。排查思路先确认延迟是不是太大如果用的是SSSU试试改成DSDU或SSDU看振荡是否改善。如果改善了说明延迟是主因。检查采样时刻用示波器看ADC触发信号和PWM波形的关系确认采样点是否在开关噪声最小的时刻。检查更新时机确认CCR写入后是立即生效还是下周期生效如果是下周期延迟会多一个周期。降低PI增益如果延迟没法改只能降带宽把PI增益调低。6.2 DSDU跑不起来CPU占用率太高DSDU对CPU要求高如果跑不起来可以提高主频STM32G4可以跑到170MHz比F1系列的72MHz宽裕很多。用硬件加速C2000有CLA协处理器STM32G4有CORDIC和FMAC可以加速三角函数和滤波运算。简化算法SVPWM用查表代替实时计算观测器降阶能省不少时间。降PWM频率如果20kHz DSDU跑不动试试10kHz DSDU延迟和20kHz SSSU差不多但采样质量更好。6.3 采样噪声大电流反馈毛刺多如果电流采样噪声大除了硬件优化软件上可以用DSSU策略双采样取平均抑制随机噪声。增加ADC采样时间让采样电容充分充电减少采样误差。在采样时刻避开开关噪声调整ADC触发点选在电流纹波稳定、开关噪声小的时刻。加数字滤波在ADC中断里加一个简单的滑动平均或一阶低通但要注意滤波会引入额外延迟。6.4 常见问题速查表问题现象可能原因排查方法解决方向电流振荡延迟大、PI增益高改DSDU/SSDU对比降增益或减延迟CPU占用高DSDU计算量大看中断执行时间提主频、用加速、降频采样噪声大开关噪声、采样时刻差示波器看触发点改DSSU、调触发点响应慢更新延迟大查CCR预装载配置改更新时机波形毛刺影子寄存器配置不当查ARPE和CCRPE正确配置预装载避坑技巧调FOC电流环时我习惯先用SSSU把基本功能跑通确认采样、计算、更新链路都正常再尝试DSDU或SSDU。直接上DSDU容易因为时序问题卡住排查起来很痛苦。7. 策略选型的个人经验没有最好只有最合适7.1 从应用需求反推策略选哪种策略最终要看应用需求低速大扭矩场景比如电动车启动、压缩机电流环带宽要求不高SSSU足够重点是把无感观测器调好。高速高动态场景比如伺服、无人机电调带宽要求高DSDU或SSDU更合适但要注意CPU算力。低噪声场景比如医疗设备、精密仪器DSSU的双采样平均能改善采样质量但延迟和SSSU差不多。7.2 从平台能力反推策略平台能力也很关键STM32F1/F0主频低、无FPUSSSU是现实选择DSDU基本跑不动。STM32F4/G4带FPU、主频高DSDU可以尝试G4还有CORDIC加速。TI C2000专为电机控制设计CLA协处理器可以并行处理DSDU很轻松。峰岹等专用芯片硬件FOC引擎策略配置更灵活但要看具体型号支持。7.3 一个实际项目的选型过程我之前做一个无感FOC项目电机是低电感高速电机PWM频率20kHzMCU是STM32G431。一开始用SSSU电流环带宽只能做到1.2kHz高速时电流波形畸变明显。后来改成SSDU带宽提到2kHz左右波形改善很多。再尝试DSDU带宽能到3kHz但CPU占用率到了70%以上加上观测器和保护逻辑后余量不足最终选了SSDU作为折中。这个经历说明策略选型不是越激进越好要在带宽、CPU负载、实现复杂度之间找平衡。7.4 后续可以扩展的方向如果四种基本策略还不够还可以考虑变频率策略低速时用高PWM频率提高采样精度高速时降频减少开关损耗。自适应更新根据电流变化率动态调整更新时机变化快时用DSDU变化慢时用SSSU。多采样平均在一个PWM周期内多次采样用更复杂的滤波算法提取真实电流。这些方向在实际产品中都有应用但实现复杂度更高需要根据具体需求权衡。我个人在实际操作中的体会是FOC电流环的延迟问题很多时候不是靠调PI能解决的而是要在架构层面就想清楚。先把采样和更新的时序搞明白再动手写代码比事后调参要省力得多。SSSU、DSDU、SSDU、DSSU这四个词看起来只是缩写但背后是定时器配置、中断设计、CPU负载、控制带宽的一整套逻辑。把这套逻辑理顺了电流环调起来会顺畅很多。