FOC 参考手册 06 工程实现

时序与同步

电流环页面从连续时间被控对象推导出控制器增益,得到了干净的一阶响应,随后坦言可实现的带宽上限为“约 PWM 频率的十分之一”,却未说明原因。

本页说明了原因。答案是一个单一的数值——即采样电流与施加由此产生的电压之间的时间间隔——事实证明,它恰好能够解释系统的上限。

控制流水线:PWM 计数器、ADC 触发、中断服务程序(ISR)、影子寄存器、栅极开关以及电机的响应。 下一周期生效 PWM 计数器 周期中心点 ADC 触发采样 ADC 转换耗时 ISR Clarke, Park, PI, SVPWM 影子比较寄存器 一直保持到下一次 重装载时刻 门极开关动作 目标电压最终施加 到电机端子 电机绕组响应 并在下一个周期 被采样捕获 总计 ≈ 1.5 个控制周期 相位裕度 = 90° − ωc·T
每一级都会消耗相位裕度,且无一可省略。影子寄存器最容易被遗忘——本周期计算出的占空比要到下一次重装载时才会生效,而且与角度误差不同,这种延迟无法通过预测来消除。

控制链路

从电机中的电流到达电机端的校正电压之间,必须按顺序经过若干环节:

  1. 定时器到达触发点,并启动ADC。
  2. ADC进行采样和转换。
  3. 中断服务程序运行:坐标变换、PI调节、解耦、调制器。
  4. 结果写入比较寄存器。
  5. 这些寄存器带有影子缓冲——它们只有在定时器到达下一次重装载时才会生效。
  6. 新的占空比在整个周期内应用,其平均值落在周期的中间位置。

步骤 5 和步骤 6 是人们最容易遗忘的,但它们共同占据了主导地位。对于计算量能够轻松容纳的单次更新 PWM 来说,它们会带来一个完整周期再加上半个周期的时间延迟,从而形成熟悉的 1.5个周期——在 20 kHz 频率下为 75 µs。

硬件
整定
顶部:两个PWM周期内的信号链路,标示了从采样时刻到所产生电压中心点之间的传输延迟。中部:该延迟预测的相位裕度。底部:仿真器在各带宽下实际测得的过冲。两者并无必然对应关系——它们是共享同一坐标轴的独立计算,关键在于实测过冲会在预测相位裕度降至零的同一列处急剧增大。

在试验台上 步骤 5 并非可选项,绝不能被绕过。比较寄存器采用影子寄存器机制,是为了防止占空比更新在脉冲中途生效而产生窄脉冲(runt pulse),甚至引发更致命的上下桥臂直通。为了“节省一个周期”而异步写入比较寄存器,是公认的烧毁三相桥的做法。

延迟会带来什么代价

纯延迟环节的增益为 1,相位为 。在直流条件下它几乎不引入额外开销,但随着频率升高其影响会逐渐增大——这与控制环路的需求完全相反,因为在可以测量的地方它显得无足轻重,而在无法测量的地方却可能造成致命后果。

回想一下零极点对消后的电流环:开环传递函数是一个纯积分器,即 。它在穿越单位增益时的相位恰好为 ,因此初始具有 90° 的相位裕度,且无条件稳定。所有蚕食这一裕度的因素都来自延迟:

一个调优良好的电流环的稳定性完全由其时序决定,而与其增益无关。这一点值得仔细体会:你无法通过调整增益来解决延迟问题,而一个出现振荡的环路往往更多是时序问题,而非增益问题。

经验法则的来源

令 ,求解保留给定相位裕度所对应的带宽:

期望的相位裕度带宽占 的比例
60°1111 Hz
45°1667 Hz
36°2000 Hz
0°(不稳定)3333 Hz

因此,我们熟悉的 并非随意设定——它恰好对应 36° 相位裕度。系统虽然稳定,但裕度已处于临界状态。

在试验台上 这种临界程度意味着,如果只引用该经验法则而不说明前提,就会显得过于乐观。在仿真器中以 2 kHz 带宽运行,并计入完整的 1.5 个周期延迟,电流阶跃响应会出现 46% 的超调。系统虽然能够收敛并保持稳定,但大多数工程应用都无法接受这样的超调。而在 (即 63° 相位裕度)下,同样的阶跃响应超调量仅为 1.9%。

应将视为明确进入不稳定状态的界限,而非设计目标。

该预测是可检验的

上述公式是在理想开环条件下的代数运算。仿真器对此一无所知:它仅对电机进行积分、运行调制器,并将电压通过影子寄存器流水线传递。如果两者结果一致,则说明该代数描述的是真实情况。

在 20 kHz 开关频率、1.5 个周期延迟下扫描带宽:

带宽预测相位裕度实测特性
500 Hz77°平稳收敛,超调 0.2%
1000 Hz63°平稳收敛,超调 1.9%
1500 Hz50°能够收敛,超调 20.7%
2000 Hz36°能够收敛,超调 46.4%
3000 Hz9°勉强收敛
3200 Hz4°振铃振荡
3400 Hz−2°持续振荡

预测的不稳定频率为 3333 Hz。实测边界位于 3200 至 3400 Hz 之间,与预测值的偏差约为 2%。

这两条计算路径仅共享同一个输入:两者都设定了相同的传输延迟(这是必须的,否则它们描述的就是两套不同的驱动系统)。除此之外,两者完全独立:一条路径在理想开环模型上直接计算 ;另一条路径则对电机微分方程进行数值积分、运行调制器、将电压送入影子寄存器流水线,并直接测量最终输出的超调量。没有任何人为因素强行让两者的结果吻合。

在试验台上 本章对模型进行了改进。在此之前,仿真器在计算出电压的同时就将其施加,因此仅具有半个周期的占空比平均效果,看起来比硬件稳定得多——在3600 Hz时,仿真显示2%的超调,而实际闭环却会发生振荡。加入影子寄存器流水线(voltageDelayPeriods)后问题得以解决,上述一致性便是佐证。

补偿延迟

双次更新 PWM 在重装载时刻和峰值时刻均更新比较寄存器。传输延迟减半至 0.75 个周期,在相同相位裕度下可用带宽翻倍。代价是控制中断服务程序(ISR)的执行频率翻倍,因此时钟周期预算减半。

缩减计算耗时 只有在能帮你跨过更新时刻边界时才有意义。在此阈值之下,哪怕把 ISR 执行时间缩短几微秒也毫无收益——因为延迟是由等待重装载决定的,而非由算术运算耗时决定。在 20 kHz 下将计算耗时从 12 µs 缩短到 6 µs,总延迟依然是 1.5 个周期不变。

计算耗时真正致命的地方在于那个“悬崖”边界。一旦计算耗时超过一个更新间隔,占空比更新就会滑过整整一个周期:总延迟从 1.5 个周期骤增至 2.5 个周期,稳定极限随之暴跌 40%。在图中将计算时间滑块拖过更新间隔,即可看到 ISR 色带变为红色。

提高 PWM 频率 会按比例缩短延迟时间(因为延迟是以周期数衡量的)。但代价是开关损耗增加,同时还会压缩电流测量页面中讨论的电流采样窗口——这是从硬币的另一面看到的同一个权衡。

角度预测是独立的

同样的延迟还带来第二个后果,这是一个性质不同的问题,也有相应的解决方法。

当电压真正作用到电机上时,转子已经转过了 。因此输出反变换应当使用转子届时所处的角度,而非电流采样时刻的角度:

在 75 µs 的延迟下,在参考电机上,1800 rpm 时为 3.2°,6000 rpm 时为 10.8°——这是一个随转速增长的一阶误差,这正是那种在试验台上表现良好但在实际应用中令人失望的驱动器的典型特征。

与相位裕度不同,这种误差确实可以补偿,而且代价很低:一次乘法加一次加法。应当进行补偿。

在试验台上 同一个延迟会带来两种截然不同的后果,务必将它们区分开来。相位裕度损失会限制环路带宽,且无法通过预测消除;角度误差则是一种坐标旋转偏差,可通过角度预测完全消除。实现后者对前者毫无帮助——即便角度预测再完美,驱动器仍会在相同的带宽下失稳。

ISR 时钟周期预算

在 170 MHz 内核上以 20 kHz 进行单次更新时,每次更新拥有 8500 个时钟周期。双次更新将其减半至 4250 个周期。需要容纳的计算包括:

大致开销
ADC 读取与缩放50–100 个周期
Clarke + Park 变换100–200个周期(主要由sin/cos决定)
两次 PI 更新 + 解耦100个周期
反 Park 变换 + 调制器150–250个周期
观测器,如果是无传感器方案300–800个周期

带传感器的控制环路可以轻松控制在 1000 个时钟周期以内;无位置传感器方案大致翻倍。两者都远低于 8500 个周期的上限,这就是为什么在现代微控制器上电流环时序极少受限于算力——也是为什么延迟预算主要受制于等待重装载,而非算术计算本身。

sin/cos 这一对通常是最大的单项开销。应在每次更新时计算它们 一次 次,并将结果传递给 Clarke 与 Park 变换,而不是对三角函数进行两次调用。

在代码中

/* The trigger chain is configured in hardware and never touched by software.
 * A sample scheduled by an interrupt is a sample taken at the wrong time. */
timer_set_adc_trigger(TIM_TRGO_UPDATE);   /* ADC starts at the reload */
timer_set_preload(ENABLE);                /* compare regs are shadowed */

void adc_complete_isr(void)
{
    const float theta = encoder_angle();
    const float omega = encoder_speed();

    /* Predict forward to where the rotor will be when this lands. */
    const float theta_out = theta + omega * DELAY_SECONDS;

    float s_in, c_in, s_out, c_out;
    sincosf(theta,     &s_in,  &c_in);    /* once, for the input transform  */
    sincosf(theta_out, &s_out, &c_out);   /* once, for the output transform */

    foc_step(s_in, c_in, s_out, c_out);
}

要点回顾

  • 对于单次更新的PWM,从采样到施加电压的延迟为1.5个PWM周期。主导这一延迟的是影子比较寄存器与占空比平均化,而非计算过程。
  • 一个调优良好的电流环路初始具有 90° 的相位裕度,并将这一裕度全部用于补偿延迟:。稳定性是一种时间特性,而非增益特性。
  • 对应 36° 的相位裕度,且阶跃超调高达 46%。除非确实需要极高的动态响应速度,否则应优先选择 。
  • PWM 双次更新可使延迟减半,并将可用带宽提高一倍,但中断服务程序(ISR)的执行频率也提高一倍。
  • 除非中断服务程序曾超出更新周期,否则提高其运行速度并无意义——而一旦出现这种情况,提速则能带来显著收益。
  • 将角度向前预测 。这消除了与转速相关的旋转, 并且对系统的稳定性没有任何影响。

这就闭合了该网站开头提出的闭环:三个正弦波、两次变换、一个PI 控制器、六个晶体管,以及由整个过程所需时间所设定的硬限制。