3、数字控制环路:数字PID控制器原理、数字补偿器设计、量化效应对环路的影响

数字电源和模拟电源最大的区别在哪?

我个人觉得,就在这个“控制环路”里。模拟环路靠运放和阻容网络,调起来得换电阻电容,麻烦。数字环路呢?改几个系数就行,甚至可以在线调。听起来很美好,对吧?但数字环路也有它的“坑”。

这一章,我们就来聊聊数字控制环路的三个核心:PID原理、补偿器设计,以及那个容易被忽略的“量化效应”。

3.1 数字PID控制器:从模拟到数字的“翻译”

PID,比例-积分-微分。搞控制的没人不知道。但在数字域里,它不再是连续的电压信号,而是一串离散的数值。

位置式PID,说白了就是直接模仿模拟PID的表达式:

u(k) = Kp * e(k) + Ki * Σe(i) + Kd * [e(k) - e(k-1)]

这个公式很直观,但有个问题——积分项是累加的。如果系统出问题,积分项可能“冲”到天上去,恢复起来很慢。

增量式PID,我更喜欢用这个。它只计算当前控制量的变化量:

Δu(k) = Kp * [e(k) - e(k-1)] + Ki * e(k) + Kd * [e(k) - 2e(k-1) + e(k-2)]
u(k) = u(k-1) + Δu(k)

好处很明显:输出是增量,不会因为积分饱和导致大幅超调。而且,就算你算错了,顶多错一个步长,不会一直错下去。

我的习惯: 在数字电源里,我几乎只用增量式PID。位置式PID的积分饱和问题,在数字域里处理起来反而更麻烦。增量式天然抗饱和,省心。

3.2 数字补偿器设计:从S域到Z域的“变形记”

模拟补偿器设计,我们习惯在S域里搞。画伯德图,调零极点。数字补偿器呢?你得把S域的传递函数,映射到Z域。

常用的映射方法有几种:

映射方法 原理 特点 我推荐吗?
前向欧拉 s = (z-1)/T 简单,但可能不稳定 不推荐,除非你很清楚自己在做什么
后向欧拉 s = (z-1)/(z*T) 稳定,但频率失真 可以用,但要注意高频特性
双线性变换 s = (2/T)*(z-1)/(z+1) 精度高,无混叠 强烈推荐

双线性变换,也叫Tustin变换。它把S平面的左半平面,映射到Z平面的单位圆内。这意味着,只要你的模拟补偿器是稳定的,数字补偿器也一定是稳定的。

举个例子,一个简单的PI补偿器:

模拟域:G(s) = Kp + Ki/s

用双线性变换,s = (2/T)*(z-1)/(z+1):

G(z) = Kp + Ki / [(2/T)*(z-1)/(z+1)]
     = Kp + (Ki*T/2) * (z+1)/(z-1)

整理成差分方程形式:
u(k) = u(k-1) + (Kp + Ki*T/2)*e(k) + (-Kp + Ki*T/2)*e(k-1)

你看,最后就是一个简单的乘加运算。在DSP或MCU里,一个周期内就能算完。

关键点: 双线性变换会引入“频率预畸变”。也就是说,你设计的模拟补偿器在10kHz处的增益和相位,和数字补偿器在10kHz处的实际表现,会有一点点差异。采样频率越高,这个差异越小。一般建议采样频率至少是开关频率的10倍以上。

3.3 量化效应:那个“看不见”的敌人

这是数字电源里,最容易出问题的地方。我刚开始做数字电源时,就吃过这个亏。

量化效应,说白了就是“精度不够”。ADC采样有量化,PWM输出有量化,系数存储也有量化。

ADC量化误差:

假设你的ADC是12位,参考电压3.3V。那么一个LSB代表3.3V/4096 ≈ 0.8mV。如果你的输出电压纹波只有1mV,那ADC只能分辨出1-2个台阶。反馈信号本身就带上了“台阶”,环路能不抖吗?

PWM分辨率:

PWM的占空比也是离散的。假设PWM时钟100MHz,开关频率100kHz,那么PWM分辨率是100MHz/100kHz = 1000个台阶。也就是说,占空比只能以0.1%的步进变化。如果环路计算出的占空比是50.05%,实际输出只能是50.0%或50.1%。这就是“极限环振荡”的根源。

系数量化:

PID系数Kp、Ki、Kd,在代码里是浮点数还是定点数?如果是定点数,你只有16位或32位来表示。很小的系数,比如0.0001,可能直接被截断成0。积分项永远加不上去,稳态误差就消不掉。

我曾经踩过的坑: 有一次调试一个48V转12V的模块,轻载时输出电压一直在11.8V到12.2V之间来回跳。查了三天,最后发现是PID的Ki系数在定点数表示下被截断了。换成32位定点数,问题立刻解决。从那以后,我所有数字电源的PID系数,至少用32位定点数,关键环路用浮点。

3.4 量化效应的应对策略

量化效应无法消除,但可以“管理”。

  • 提高ADC有效位数: 用过采样+求平均,把12位ADC“拼”成14位甚至16位。代价是采样速度变慢,但很多电源应用够用了。
  • 增加PWM分辨率: 用高分辨率定时器(HRPWM),或者用dithering技术。TI的C2000系列就有HRPWM,能把PWM分辨率做到150ps级别。
  • 系数缩放: 把小数系数放大,用整数运算,最后再缩回来。比如Ki=0.001,你可以存成1000,计算完再除以1000000。注意不要溢出。
  • 死区设置: 在误差很小时,干脆不调整占空比。避免极限环振荡。

下面这张图,是我自己总结的数字补偿器设计流程,你可以参考一下:

数字补偿器设计流程 数字补偿器设计流程 1. 系统建模 2. S域补偿器设计 3. 双线性变换→Z域 4. 量化效应分析 5. 代码实现与测试 不满足?返回调整 提示: 采样频率至少为开关 频率的10倍 系数用32位定点数

你看,从建模到代码实现,每一步都有坑。但只要你理解了量化效应的本质,这些坑都是可以填平的。

最后说一句:数字电源的环路调试,别光看仿真。上板实测,用示波器看动态响应,用频谱分析仪看噪声。理论和实践结合,才能真正吃透。