Skip to content

19.4 数字控制器的实现 —— 从公式到电路的惊险一跃

我们在上一节把补偿器从模拟域的 s 平面拉到了数字域的 z 平面,画出了一张完美的波特图,甚至连穿越频率和相位裕度都通过 MATLAB 脚本一键验证了。

这时候,很容易产生一种「我已经搞定了」的错觉。

但现实是,到目前为止,我们所有的计算都还在纸面上(或者更确切地说,在 MATLAB 的内存里)。接下来的这一步——把那个传递函数 Gcd(z) 变成烧录进 MCU 的 C 代码,或者烧录进 FPGA 的 Verilog 逻辑——才是让系统真正跑起来的惊险一跃。

如果不搞清楚这一步,你可能会发现:理论上完美的控制器,在板子上上电之后纹波大得离谱,甚至像患了疟疾一样不停地抖动。

这一节,我们要把数字控制器的设计落实为具体的算法结构,并直面数字控制特有的两个「幽灵」:实现结构的选择和量化效应的折磨。


19.4.1 补偿器的解剖学:级联与并联

在模拟时代,我们用运放、电阻和电容搭建补偿器。在数字时代,我们的积木块变了,变成了 加法器、乘法器和存储单元(延迟单元)

给定我们在 19.3 节推导出来的 PID 传递函数 Gcd(z)(即公式 19.51),你可以用无数种方式用这些积木把它搭出来。但在电源控制的工程实践中,有两种结构最常用:级联实现并联实现

为什么要纠结结构?因为不同的结构对计算资源的消耗参数调整的直观性以及抗饱和能力都有巨大的影响。

级联实现 —— 水流式的处理

这是最直观的一种实现方式,就像把滤波器的一阶节、二阶节像水管一样串起来。

PID 补偿器的级联结构是这样的:信号像水流一样从左到右,依次经过比例环节、零点和极点的修正,最后进入积分器。

这种结构背后的代码(无论是 C 语言还是 Verilog)逻辑非常清晰,几乎可以直接对应到差分方程:

c
// 第一步:比例增益
u1[n] = Gd * ve[n];

// 第二步:零点 zL 作用 (这里实际上是在处理极点/零点的差分形式)
// 注意:这里的公式对应的是传递函数分解后的直接形式 I 或 II 的变体
// 原文给出的 u2, u3, u4 是将分子分母因式分解后的级联形式
u2[n] = u1[n] - zL * u1[n-1];
u3[n] = u2[n] - zz * u2[n-1];
u4[n] = u3[n] + zp * u4[n-1];

// 第三步:积分与累加
vc[n] = u4[n] + vc[n-1];

这里有几个关键点值得停下来想一想:

  1. 可编程性Gd(总增益)、zLzz(零点)和 zp(极点)都是乘法系数。这意味着你可以在线调整它们。比如,你可以在运行时动态调整 zp 来改变高频滤波器的衰减程度,这在模拟电路里是不可能做到的。
  2. 最后一步的玄机:注意最后一步 vc[n] = u4[n] + vc[n-1]。这就是离散域的积分器——它本质上是一个累加器。
  3. ⚠️ 警告:这里的积分器需要一把「锁」

积分饱和 是数字控制里最坑人的问题之一。想象一下,如果输出电压突然跌落很大,误差信号 ve[n] 变得极大,积分器就会疯狂累加,导致计算出的占空比命令 vc[n] 远超 1(或者小于 0)。当电压恢复正常时,积分器里的「冤屈值」还在,导致占空比迟迟降不下来,系统响应变得极慢——甚至直接炸机。

所以在最后一步,必须加一个 Anti Wind-up Limiter(抗饱和限幅器)

c
// 伪代码:带限幅的积分
vc[n] = u4[n] + vc[n-1];

if (vc[n] > D_MAX) {
    vc[n] = D_MAX; // 也就是 1 (100% 占空比)
} else if (vc[n] < D_MIN) {
    vc[n] = D_MIN; // 也就是 0
}
// 注意:在某些抗饱和策略中,只限幅是不够的,
// 还需要把积分器里的多余值「扣掉」,这叫 back-calculation 或 tracking。

级联结构末尾那个 Limiter 模块,干的就是这件事。

并联实现 —— 像调音台一样调节 PID

级联结构虽然直观,但它有个缺点:参数耦合。当你想调整积分增益 KI 时,在级联结构里你可能得同时改好几个系数,因为 KI 是分散在各个 z 域系数里的组合结果。

并联实现 解决了这个问题。它通过部分分式展开,把 PID 补偿器拆成了三条独立平行的支路:比例(P)、积分(I)和微分(D)。

这就像调音台的 EQ,低频、中频、高频旋钮各管各的,互不干扰。

公式 (19.65) 给出了变形后的传递函数:

Gcd(z)=KP+KI1z1+KD1z11z1

(注:原文第三项分母实际包含 zp,此处先简化描述)

这种结构画出来是这样的:P、I、D 三条路清晰地并排分开,各自算各自的,最后在一个加法节点上汇合。

对应的代码逻辑如下:

c
// P 支路:即时反应
up[n] = KP * ve[n];

// I 支路:历史的积淀(别忘了抗饱和限幅)
ui[n] = KI * ve[n] + ui[n-1];
// 这里也需要加上 Limit 检查

// D 支路:预测趋势(带一阶低通滤波)
// 先算纯微分
ud1[n] = KD * (ve[n] - ve[n-1]);
// 再加上极点 zp 的滤波作用 (ud 的一阶惯性环节)
ud[n] = ud1[n] + zp * ud[n-1];

// 最后把三路信号加起来
vc[n] = up[n] + ui[n] + ud[n];

这种结构对调试非常友好。当你发现超调太大,怀疑是 KD 玩脱了,你只需要单独调节 KD 这个系数,而不需要去重新推导整个 z 变换的公式。

关于 zp 的一点补充: 如果我们在设计时采用了预畸变技术,并且高频极点 fp1 刚好等于预畸变频率 fprewarp,根据公式 (19.68),你会发现 zp=0。 这意味着那个高频滤波器极点在 z 平面原点,公式 (19.65) 就简化成了最纯粹的教科书级 PID(公式 19.69)。在这种特殊情况下,并联结构的 D 支路会变得更简单,ud[n]=ud1[n],那个 zp 的反馈路直接消失了。这是很多数字 PID 教程默认的「简单模式」。


19.4.2 量化效应与极限环 —— 数字世界的「心跳」

现在假设你已经选好了结构,把代码写好烧进去了。理论上,系统应该稳稳地停在设定值。

但示波器上可能出现了奇怪的一幕:输出电压在设定值附近极其规律地、细微地抖动,频率通常是开关频率的一半或更低。 这不是噪声,也不是干扰。这是数字控制特有的「心跳」—— 极限环振荡

这是由 A/D 和 DPWM 的有限分辨率引起的非线性现象。

无限分辨率的乌托邦

先回到理想世界。假设系统拥有无限分辨率的 A/D 和 DPWM。

  • 直线 A/D 特性:ve[n]=ve。输入多少,输出就是多少,没有任何台阶。
  • 负反馈线:ve=VrefVgH0Gcd0ve[n]

这两条线的交点就是系统的平衡点。如果补偿器里有积分环节(Gcd0),交点会落在 ve[n]=0 的轴上(记为 B 点)。这意味着稳态误差为零。这我们在模拟控制章节已经反复论证过了。

有限分辨率的地狱

现实是残酷的。一旦把有限分辨率请回来,情况就变了:

  • A/D 变成了台阶状:ve[n]=QA/D(ve)。每一个台阶的高度是 qA/D(LSB 分辨率)。
  • DPWM 也变成了台阶状:这导致反馈回路的特性变成了锯齿状。

这里出现了一个非常致命的问题:平衡点可能根本不存在!

看那个记为 A 的位置——根据回路方程计算出的理想平衡点,恰好落在 A/D 特性的「垂直跳跃段」上。也就是说,理论上 ve 应该是这个值,但 A/D 转换器根本输出不了这个中间值,它只能输出上面的台阶或者下面的台阶。

系统就像一个找不到座位的醉汉,在两个台阶之间来回跳变。这就是 Limit Cycling

拯救平衡点:无振荡条件

我们要想消除这种振荡,必须让系统至少有一个能坐得住的椅子。

看看那个能稳住的 B 点:它(以及它附近可能存在的平衡点)都刚好落在 A/D 的「零误差台阶」(即 ve[n]=0)范围内。

要实现这一点,必须满足一个极其苛刻的几何条件: DPWM 造成的电压台阶宽度,必须小于 A/D 的台阶宽度。

VgH0qDPWM<qA/D

(公式 19.75)

这就是著名的 无极限环条件 的核心。

直白地翻译一下: 你的 DPWM 调节太粗糙了(qDPWM 太大),它每动一个 LSB,输出电压跳变的幅度超过了 A/D 转换器能分辨的最小单位。这就像是 A/D 转换器还没来得及看清那个电压的变化,系统就已经「过头」了。系统永远无法精确收敛,只能在两个分辨率台阶之间反复横跳。

更通用的公式是 (19.76):

Gd0H0qDPWM<qA/D

实战验证:拿两套配置对比着看,最直观。

  • 10-bit DPWMqDPWM 比较大,不满足上述条件。你看那个控制信号 vc[n],在稳态时依然在不停地跳动,输出电压 v(t) 上也叠加了纹波。
  • 12-bit DPWM:把 DPWM 分辨率提高到 12-bit,条件满足了。你看大约 75us 之后的波形,vc[n] 稳定不动了,输出电压也稳稳地停在零误差 bin 里。

另一个隐形的杀手:积分增益 KI

好了,你可能会说:「这简单,我把 DPWM 位数加高不就行了吗?比如我直接上个 16-bit DPWM。」

且慢。还有一个更隐蔽的坑。

即使你的 DPWM 分辨率无限高(qDPWM0),也不一定能消除振荡。问题出在积分器上。

再看积分器这条路。如果 A/D 量化导致的最小误差是一个 LSB(即 qA/D),这个误差经过积分增益 KI 放大后,会给占空比命令 vc[n] 造成一个跳变。 这个跳变的幅度是 KIqA/D

这意味着,即便 DPWM 是无限分辨率的,积分器输出的信号本身也是量化的!积分器把 A/D 的粗糙度「传递」给了 DPWM 的输入端。

所以,为了避免积分器把系统推入振荡,KI 也不能太大。必须满足:

Gd0H0KI<1

(公式 19.78)

总结一下避免数字电源「抽搐」的两个铁律(公式 19.79):

  1. 硬件要够细:Gd0H0qDPWM<qA/D (DPWM 分辨率要够)
  2. 软件要够柔:KI<1Gd0H0 (积分增益要收敛)

如果这两条没满足,你的电源就算是「稳住了」,也是在颤抖着稳住。

⚠️ 踩坑预警:极限环不是「没调好」,是「无解」:新手看到输出在设定值附近规律抖动,第一反应是「我 PID 参数没调好,再加大点增益」——结果越调抖得越欢。记住上面这两条铁律是几何条件,不是参数优化能绕过去的:只要 DPWM 一跳的电压比 A/D 的台阶宽,系统在数学上就找不到平衡点,只能左右横跳。这时候正确的动作不是动 PID,而是回头去加 DPWM 位数(或塞个 ΔΣ)、压低 KI。先确认硬件分辨率达标,再谈环路调参,顺序反了一定白忙活。


19.4.3 硬件实现 —— 如何对付这些苛刻条件

既然条件这么苛刻,我们怎么造出符合要求的 DPWM 和 A/D?

数字 PWM (DPWM) 的黑科技

最朴素的 DPWM 就是一个计数器加一个比较器。

  • 要实现 nDPWM 位分辨率,计数器时钟频率 fclk=2nDPWMfs
  • 想要 12-bit 分辨率,开关频率 1MHz?那你需要 4,096 MHz 的时钟。这在硅片上是功耗和灾难级别的不可行。

为了解决这个矛盾,工程师们发明了各种花活,不用把时钟频率拉到天上去:

  1. 抽头延迟线: 不用高频时钟计数,而是利用逻辑门传输延迟的微小差异。比如反相器的传播延迟是 10ps,串起来一串,就能作为极小的时间刻度来「精细」调整脉冲边沿。这相当于在粗粒度的计数器基础上叠加了一个高精度的「游标卡尺」。

  2. 混合结构: 把计数器(负责粗调)和延迟线(负责精调)结合起来。这是目前最常用的平衡性能和面积的方法。

  3. ΔΣ 调制器 —— 噪音整形魔术: 这是比较高级的玩法。我们在补偿器和 DPWM 之间插入一个二阶 ΔΣ 调制器。

    • 原理:ΔΣ 调制器会故意把量化误差(噪音)「推」到高频去(噪声整形)。
    • 结果:虽然送给 DPWM 的信号是低位数的(比如 8-bit),但噪音都在高频。而功率级(电感+电容)本质上是一个低通滤波器,它会把那些高频噪音滤掉。
    • 收益:在等效感知上,你获得了一个极高分辨率(比如 14-bit 甚至更高)的 DPWM,而且硬件成本极低。这算是数字控制相对于模拟控制的一个降维打击优势。

A/D 转换器 —— 为电源量身定做

通用的 A/D 芯片(如 SAR ADC)虽然线性度好,但对于电源控制来说太慢、太费电,而且很多功能(比如输入范围)是浪费的。

电源控制需要的 A/D 有两个特点:

  1. 只要中心精确:我们并不关心电压是 0V 还是 50V,我们只关心它是不是精确地等于 1.2V(参考电压)。所以只需要在 Vref 附近极其精确。
  2. 速度要快:必须在开关周期内完成采样。

基于此,诞生了 窗口闪存 A/D (Window Flash A/D)

  • 它只在 Vref 附近的一小段窗口内设置比较器。
  • 在某些应用中,甚至只需要 3 个电平:+1 LSB, 0, -1 LSB。这意味着你只需要两个比较器就能搞定。这极大地节省了芯片面积和功耗。

此外还有基于延迟线的 A/D,利用逻辑门延迟随电压变化的特性来测量电压,这在数字工艺(如 CMOS)下非常好集成。


本章回响:模拟与数字的融合

我们终于把数字电源的全链路走通了:从模型的建立,到 z 域的设计,再到代码结构的实现,最后直面量化噪声的挑战。

回头看这一章,我们其实是在解决一个核心矛盾:如何用离散的、有限精度的 0 和 1,去模拟连续的、无限精度的物理世界?

  • 我们用 Z 变换 架起了模拟域和数字域的桥梁。
  • 我们用 抗饱和限幅器 弥补了数字积分器的脆弱。
  • 我们用 高分辨率 DPWM 和 ΔΣ 调制 对抗了量化误差的幽灵。

在下一章,我们将把目光从单一变换器的控制移开,看向更广阔的领域。你会发现,今天建立的这些数字控制思维——采样、延迟、离散传递函数——将在那里以一种完全不同的尺度再次出现。


参考说明:参考自 geqianQWQ 同学阅读《Fundamentals of Power Electronics》的笔记,仅作理解线索;本文为结合自己理解重新整理的学习笔记,不涉及对原书的复制或翻译。

面向嵌入式学习者的硬件学习笔记