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负载 | 适用场景 |
|---|---|---|---|---|---|
| SSSU | 1 | 1 | 约1.0 | 低 | 入门、低带宽需求 |
| DSDU | 2 | 2 | 约0.5 | 高 | 高带宽、算力充足 |
| SSDU | 1 | 2 | 约0.5-1.0 | 中 | 折中、改善响应 |
| DSSU | 2 | 1 | 约1.0 | 中 | 采样降噪、特殊场景 |
这个表里的延迟是典型值,实际延迟还取决于定时器的具体配置,比如影子寄存器是立即生效还是下周期生效、ADC触发点选在哪里。下面会详细说这些细节。
4. 定时器配置实战:影子寄存器、触发点和中断时机
4.1 影子寄存器:决定更新何时生效的关键
不管你用哪种策略,占空比的更新最终都要写到定时器的比较寄存器(比如STM32的CCR寄存器)。但很多定时器都有一个“影子寄存器”机制:你写入的值不会立即生效,而是等到下一个更新事件(UEV)时才从影子寄存器搬到实际寄存器。
这个机制的好处是防止PWM波形出现毛刺,但代价是引入额外延迟。如果你在周期中间写入CCR,但更新事件在周期结束时才发生,那新占空比就要等到下一个周期才生效。
所以配置时一定要确认:你写入CCR后,新值是在本周期生效还是下周期生效?这直接决定了更新延迟是0.5个周期还是1.5个周期。
以STM32的高级定时器为例,CCR寄存器有预装载功能,通过TIMx_CR1的ARPE位控制。如果ARPE=1,CCR的写入会在更新事件时生效;如果ARPE=0,写入立即生效。但立即生效可能导致当前周期波形异常,所以通常还是用预装载。
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对应ARR=4250 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:主频低、无FPU,SSSU是现实选择,DSDU基本跑不动。
- STM32F4/G4:带FPU、主频高,DSDU可以尝试,G4还有CORDIC加速。
- TI C2000:专为电机控制设计,CLA协处理器可以并行处理,DSDU很轻松。
- 峰岹等专用芯片:硬件FOC引擎,策略配置更灵活,但要看具体型号支持。
7.3 一个实际项目的选型过程
我之前做一个无感FOC项目,电机是低电感高速电机,PWM频率20kHz,MCU是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负载、控制带宽的一整套逻辑。把这套逻辑理顺了,电流环调起来会顺畅很多。