共计 2286 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点:为什么 PI 参数整定这么难?
刚开始接触 Buck 电路闭环控制时,最头疼的就是 PI 参数的调试。传统试错法不仅效率低下,还容易引发一系列问题:

- 参数设置不当导致输出电压振荡,严重时可能损坏功率器件
- 超调量过大影响负载设备的正常工作
- 动态响应慢,无法适应快速变化的负载条件
这些问题在实际工程中往往会造成巨大时间成本和经济损失。我记得第一次调试时,花了整整两天时间反复调整参数,最终还是没能达到理想的动态性能。
理论基石:从微分方程到传递函数
要理解 PI 控制器的参数整定,首先需要建立 Buck 电路的数学模型。假设电路工作在连续导通模式 (CCM),可以得到状态空间方程:
$$\frac{dv_c}{dt} = \frac{1}{C}(i_L – i_{load})$$
$$\frac{di_L}{dt} = \frac{1}{L}(DV_{in} – v_c)$$
通过拉普拉斯变换,可以得到电压环的开环传递函数:
$$G_{open}(s) = \frac{V_c(s)}{D(s)} = \frac{V_{in}}{LCs^2 + \frac{L}{R}s + 1}$$
Ziegler-Nichols 整定法
工程上常用的 ZN 整定法提供了一套系统化的参数确定流程:
- 先置 $K_i=0$,逐渐增大 $K_p$ 直到系统出现等幅振荡(临界比例度)
- 记录此时的临界增益 $K_{cr}$ 和振荡周期 $P_{cr}$
- 按照下表确定 PI 参数:
| 控制器类型 | $K_p$ | $K_i$ |
|---|---|---|
| P | $0.5K_{cr}$ | 0 |
| PI | $0.45K_{cr}$ | $1.2K_p/P_{cr}$ |
MATLAB 实战:自动计算 KP/KI
以下 MATLAB 脚本演示了如何通过频域分析确定 PI 参数:
% Buck 电路参数
L = 47e-6; % 电感值 (H)
C = 220e-6; % 电容值 (F)
R = 5; % 负载电阻 (Ω)
Vin = 24; % 输入电压 (V)
Vout = 12; % 输出电压 (V)
% 开环传递函数
num = Vin;
den = [L*C L/R 1];
sys = tf(num, den);
% 绘制 Bode 图
figure;
bode(sys);
grid on;
% 根据相位裕度设计 PI 控制器
PM_desired = 60; % 目标相位裕度 (度)
[mag,phase,w] = bode(sys);
% 找到增益穿越频率
[~,idx] = min(abs(phase(:) - (-180 + PM_desired)));
w_gc = w(idx);
% 计算 KP
mag_gc = mag(idx);
Kp = 1/mag_gc;
% 计算 KI (选择零点在 1 /10 穿越频率处)
Ki = Kp * w_gc/10;
% 显示结果
fprintf('设计结果:\nKP = %.4f\nKI = %.4f\n', Kp, Ki);
关键点说明:
– 通过 bode 图分析系统相位裕度
– 在目标相位裕度处确定穿越频率
– 根据穿越频率计算 KP 和 KI
硬件实现:STM32 上的 PID 算法
实际工程中还需要考虑抗积分饱和等问题,以下是经过验证的 C 语言实现:
// PID 结构体定义
typedef struct {
float Kp;
float Ki;
float Kd;
float integral;
float prev_error;
float out_max;
float out_min;
} PID_Controller;
// PID 计算函数
float PID_Compute(PID_Controller *pid, float setpoint, float measurement) {
float error = setpoint - measurement;
// 比例项
float proportional = pid->Kp * error;
// 积分项(带抗饱和处理)pid->integral += pid->Ki * error * dt;
// 积分限幅
if(pid->integral > pid->out_max) pid->integral = pid->out_max;
else if(pid->integral < pid->out_min) pid->integral = pid->out_min;
// 微分项
float derivative = pid->Kd * (error - pid->prev_error) / dt;
pid->prev_error = error;
// 输出限幅
float output = proportional + pid->integral + derivative;
if(output > pid->out_max) output = pid->out_max;
else if(output < pid->out_min) output = pid->out_min;
return output;
}
工程避坑指南
在实际硬件实现中,会遇到许多理论模型未考虑的因素:
- 电感饱和
- 大电流时电感值下降,导致实际环路增益变化
-
解决方法:选择饱和电流余量大的电感,或采用电流模式控制
-
采样延迟
- ADC 转换和数字控制引入的延迟会减小相位裕度
-
补偿方法:适当降低穿越频率或在算法中加入预测补偿
-
PWM 分辨率
- 有限的 PWM 分辨率会导致极限环振荡
- 改善措施:提高 PWM 计数器位数或采用 dithering 技术
思考题:向双环控制拓展
要实现更精确的电压 + 电流双环控制,需要考虑:
- 需要增加的传感器:
- 电流检测(可采用采样电阻或霍尔传感器)
-
可能需要更高精度的电压检测
-
控制结构变化:
- 内环(电流环)需要更快的响应速度
-
外环(电压环)负责稳态精度
-
参数整定顺序:
- 先整定内环参数,再整定外环
- 两个环路的带宽需要合理分配(通常内环带宽是外环的 5 -10 倍)
通过本文介绍的方法,相信你能更系统地解决 Buck 电路控制参数整定问题。实际调试时,建议先用仿真验证,再逐步过渡到硬件实现,这样可以大大减少开发时间和风险。
