19.4 数字控制器的实现 —— 从公式到电路的惊险一跃
我们在上一节把补偿器从模拟域的
这时候,很容易产生一种「我已经搞定了」的错觉。
但现实是,到目前为止,我们所有的计算都还在纸面上(或者更确切地说,在 MATLAB 的内存里)。接下来的这一步——把那个传递函数
如果不搞清楚这一步,你可能会发现:理论上完美的控制器,在板子上上电之后纹波大得离谱,甚至像患了疟疾一样不停地抖动。
这一节,我们要把数字控制器的设计落实为具体的算法结构,并直面数字控制特有的两个「幽灵」:实现结构的选择和量化效应的折磨。
19.4.1 补偿器的解剖学:级联与并联
在模拟时代,我们用运放、电阻和电容搭建补偿器。在数字时代,我们的积木块变了,变成了 加法器、乘法器和存储单元(延迟单元)。
给定我们在 19.3 节推导出来的 PID 传递函数
为什么要纠结结构?因为不同的结构对计算资源的消耗、参数调整的直观性以及抗饱和能力都有巨大的影响。
级联实现 —— 水流式的处理
这是最直观的一种实现方式,就像把滤波器的一阶节、二阶节像水管一样串起来。
PID 补偿器的级联结构是这样的:信号像水流一样从左到右,依次经过比例环节、零点和极点的修正,最后进入积分器。
这种结构背后的代码(无论是 C 语言还是 Verilog)逻辑非常清晰,几乎可以直接对应到差分方程:
// 第一步:比例增益
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];这里有几个关键点值得停下来想一想:
- 可编程性:
(总增益)、 、 (零点)和 (极点)都是乘法系数。这意味着你可以在线调整它们。比如,你可以在运行时动态调整 来改变高频滤波器的衰减程度,这在模拟电路里是不可能做到的。 - 最后一步的玄机:注意最后一步
vc[n] = u4[n] + vc[n-1]。这就是离散域的积分器——它本质上是一个累加器。 - ⚠️ 警告:这里的积分器需要一把「锁」:
积分饱和 是数字控制里最坑人的问题之一。想象一下,如果输出电压突然跌落很大,误差信号
所以在最后一步,必须加一个 Anti Wind-up Limiter(抗饱和限幅器):
// 伪代码:带限幅的积分
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
级联结构虽然直观,但它有个缺点:参数耦合。当你想调整积分增益
并联实现 解决了这个问题。它通过部分分式展开,把 PID 补偿器拆成了三条独立平行的支路:比例(P)、积分(I)和微分(D)。
这就像调音台的 EQ,低频、中频、高频旋钮各管各的,互不干扰。
公式 (19.65) 给出了变形后的传递函数:
(注:原文第三项分母实际包含
这种结构画出来是这样的:P、I、D 三条路清晰地并排分开,各自算各自的,最后在一个加法节点上汇合。
对应的代码逻辑如下:
// 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];这种结构对调试非常友好。当你发现超调太大,怀疑是
关于
19.4.2 量化效应与极限环 —— 数字世界的「心跳」
现在假设你已经选好了结构,把代码写好烧进去了。理论上,系统应该稳稳地停在设定值。
但示波器上可能出现了奇怪的一幕:输出电压在设定值附近极其规律地、细微地抖动,频率通常是开关频率的一半或更低。 这不是噪声,也不是干扰。这是数字控制特有的「心跳」—— 极限环振荡。
这是由 A/D 和 DPWM 的有限分辨率引起的非线性现象。
无限分辨率的乌托邦
先回到理想世界。假设系统拥有无限分辨率的 A/D 和 DPWM。
- 直线 A/D 特性:
。输入多少,输出就是多少,没有任何台阶。 - 负反馈线:
。
这两条线的交点就是系统的平衡点。如果补偿器里有积分环节(
有限分辨率的地狱
现实是残酷的。一旦把有限分辨率请回来,情况就变了:
- A/D 变成了台阶状:
。每一个台阶的高度是 (LSB 分辨率)。 - DPWM 也变成了台阶状:这导致反馈回路的特性变成了锯齿状。
这里出现了一个非常致命的问题:平衡点可能根本不存在!
看那个记为 A 的位置——根据回路方程计算出的理想平衡点,恰好落在 A/D 特性的「垂直跳跃段」上。也就是说,理论上
系统就像一个找不到座位的醉汉,在两个台阶之间来回跳变。这就是 Limit Cycling。
拯救平衡点:无振荡条件
我们要想消除这种振荡,必须让系统至少有一个能坐得住的椅子。
看看那个能稳住的 B 点:它(以及它附近可能存在的平衡点)都刚好落在 A/D 的「零误差台阶」(即
要实现这一点,必须满足一个极其苛刻的几何条件: DPWM 造成的电压台阶宽度,必须小于 A/D 的台阶宽度。
(公式 19.75)
这就是著名的 无极限环条件 的核心。
直白地翻译一下: 你的 DPWM 调节太粗糙了(
更通用的公式是 (19.76):
实战验证:拿两套配置对比着看,最直观。
- 10-bit DPWM:
比较大,不满足上述条件。你看那个控制信号 ,在稳态时依然在不停地跳动,输出电压 上也叠加了纹波。 - 12-bit DPWM:把 DPWM 分辨率提高到 12-bit,条件满足了。你看大约 75us 之后的波形,
稳定不动了,输出电压也稳稳地停在零误差 bin 里。
另一个隐形的杀手:积分增益
好了,你可能会说:「这简单,我把 DPWM 位数加高不就行了吗?比如我直接上个 16-bit DPWM。」
且慢。还有一个更隐蔽的坑。
即使你的 DPWM 分辨率无限高(
再看积分器这条路。如果 A/D 量化导致的最小误差是一个 LSB(即
这意味着,即便 DPWM 是无限分辨率的,积分器输出的信号本身也是量化的!积分器把 A/D 的粗糙度「传递」给了 DPWM 的输入端。
所以,为了避免积分器把系统推入振荡,
(公式 19.78)
总结一下避免数字电源「抽搐」的两个铁律(公式 19.79):
- 硬件要够细:
(DPWM 分辨率要够) - 软件要够柔:
(积分增益要收敛)
如果这两条没满足,你的电源就算是「稳住了」,也是在颤抖着稳住。
⚠️ 踩坑预警:极限环不是「没调好」,是「无解」:新手看到输出在设定值附近规律抖动,第一反应是「我 PID 参数没调好,再加大点增益」——结果越调抖得越欢。记住上面这两条铁律是几何条件,不是参数优化能绕过去的:只要 DPWM 一跳的电压比 A/D 的台阶宽,系统在数学上就找不到平衡点,只能左右横跳。这时候正确的动作不是动 PID,而是回头去加 DPWM 位数(或塞个 ΔΣ)、压低
。先确认硬件分辨率达标,再谈环路调参,顺序反了一定白忙活。
19.4.3 硬件实现 —— 如何对付这些苛刻条件
既然条件这么苛刻,我们怎么造出符合要求的 DPWM 和 A/D?
数字 PWM (DPWM) 的黑科技
最朴素的 DPWM 就是一个计数器加一个比较器。
- 要实现
位分辨率,计数器时钟频率 。 - 想要 12-bit 分辨率,开关频率 1MHz?那你需要
的时钟。这在硅片上是功耗和灾难级别的不可行。
为了解决这个矛盾,工程师们发明了各种花活,不用把时钟频率拉到天上去:
抽头延迟线: 不用高频时钟计数,而是利用逻辑门传输延迟的微小差异。比如反相器的传播延迟是 10ps,串起来一串,就能作为极小的时间刻度来「精细」调整脉冲边沿。这相当于在粗粒度的计数器基础上叠加了一个高精度的「游标卡尺」。
混合结构: 把计数器(负责粗调)和延迟线(负责精调)结合起来。这是目前最常用的平衡性能和面积的方法。
ΔΣ 调制器 —— 噪音整形魔术: 这是比较高级的玩法。我们在补偿器和 DPWM 之间插入一个二阶 ΔΣ 调制器。
- 原理:ΔΣ 调制器会故意把量化误差(噪音)「推」到高频去(噪声整形)。
- 结果:虽然送给 DPWM 的信号是低位数的(比如 8-bit),但噪音都在高频。而功率级(电感+电容)本质上是一个低通滤波器,它会把那些高频噪音滤掉。
- 收益:在等效感知上,你获得了一个极高分辨率(比如 14-bit 甚至更高)的 DPWM,而且硬件成本极低。这算是数字控制相对于模拟控制的一个降维打击优势。
A/D 转换器 —— 为电源量身定做
通用的 A/D 芯片(如 SAR ADC)虽然线性度好,但对于电源控制来说太慢、太费电,而且很多功能(比如输入范围)是浪费的。
电源控制需要的 A/D 有两个特点:
- 只要中心精确:我们并不关心电压是 0V 还是 50V,我们只关心它是不是精确地等于 1.2V(参考电压)。所以只需要在
附近极其精确。 - 速度要快:必须在开关周期内完成采样。
基于此,诞生了 窗口闪存 A/D (Window Flash A/D):
- 它只在
附近的一小段窗口内设置比较器。 - 在某些应用中,甚至只需要 3 个电平:+1 LSB, 0, -1 LSB。这意味着你只需要两个比较器就能搞定。这极大地节省了芯片面积和功耗。
此外还有基于延迟线的 A/D,利用逻辑门延迟随电压变化的特性来测量电压,这在数字工艺(如 CMOS)下非常好集成。
本章回响:模拟与数字的融合
我们终于把数字电源的全链路走通了:从模型的建立,到 z 域的设计,再到代码结构的实现,最后直面量化噪声的挑战。
回头看这一章,我们其实是在解决一个核心矛盾:如何用离散的、有限精度的 0 和 1,去模拟连续的、无限精度的物理世界?
- 我们用 Z 变换 架起了模拟域和数字域的桥梁。
- 我们用 抗饱和限幅器 弥补了数字积分器的脆弱。
- 我们用 高分辨率 DPWM 和 ΔΣ 调制 对抗了量化误差的幽灵。
在下一章,我们将把目光从单一变换器的控制移开,看向更广阔的领域。你会发现,今天建立的这些数字控制思维——采样、延迟、离散传递函数——将在那里以一种完全不同的尺度再次出现。
参考说明:参考自 geqianQWQ 同学阅读《Fundamentals of Power Electronics》的笔记,仅作理解线索;本文为结合自己理解重新整理的学习笔记,不涉及对原书的复制或翻译。