1. 电流环闭环控制设计概述
在功率变换器(如车载充电机OBC、PFC、DC-DC等)设计中,电流环作为最内层控制环路,其性能直接影响系统动态响应和稳定性。我在多个OBC项目中实测发现,电流环带宽不足会导致输出电压纹波增大15%以上,而相位裕度不够则可能引发高频振荡。本文将基于实际工程经验,从信号链路设计、算法实现到参数整定,详解一套经过量产验证的电流环闭环方案。
电流环的核心任务是实现两个目标:一是快速跟踪指令电流(动态响应时间通常需小于1ms),二是抑制扰动(如输入电压突变或负载阶跃)。为实现这一目标,我们需要构建包含采样、控制、执行和保护四个环节的完整闭环系统。下面这张表格对比了不同应用场景下的典型性能指标:
| 应用场景 | 带宽要求 | 相位裕度 | 过流响应时间 |
|---|---|---|---|
| 车载充电机(OBC) | 1-3kHz | ≥45° | <10μs |
| 服务器电源 | 5-10kHz | ≥50° | <5μs |
| 光伏逆变器 | 500Hz-2kHz | ≥60° | <20μs |
注:带宽选择需考虑开关频率限制,经验法则是带宽不超过开关频率的1/10
2. 系统架构设计与实现
2.1 电流采样链路优化
电流采样是闭环控制的基础,常见的方案有三种:采样电阻+差分放大、霍尔传感器、以及电流互感器。在OBC项目中,我们选用采样电阻方案,因其成本低(比霍尔传感器节省60%)、线性度好。具体实现要点:
-
采样点选择:对于Buck/Boost拓扑,建议在低频支路(如电感下端)放置采样电阻,可避免高频开关噪声干扰。实测表明,相同布局下低频支路采样信噪比提升20dB以上。
-
信号调理电路:
- 采用仪表放大器(如INA240)实现高共模抑制比(CMRR>100dB)
- 二阶低通滤波截止频率设为带宽的5-10倍,例如带宽1kHz时取5kHz
- 加入TVS二极管防止电压尖峰损坏ADC
-
数字滤波处理:
c复制// 移动平均滤波示例(适用于STM32)
#define FILTER_WINDOW 8
uint16_t moving_avg(uint16_t new_sample) {
static uint16_t buffer[FILTER_WINDOW];
static uint8_t index = 0;
static uint32_t sum = 0;
sum -= buffer[index];
buffer[index] = new_sample;
sum += new_sample;
index = (index + 1) % FILTER_WINDOW;
return (uint16_t)(sum / FILTER_WINDOW);
}
2.2 控制算法实现
2.2.1 PI控制器离散化
数字控制器需将连续域传递函数离散化。以PI控制器为例,采用双线性变换(Tustin)方法:
-
连续域表达式:
$$ G_c(s) = K_p + \frac{K_i}{s} $$ -
离散化过程(采样周期T):
$$ s \leftarrow \frac{2}{T} \cdot \frac{z-1}{z+1} $$
$$ G_c(z) = K_p + K_i \cdot \frac{T}{2} \cdot \frac{z+1}{z-1} $$ -
差分方程实现:
c复制typedef struct {
float Kp;
float Ki;
float T; // 采样周期
float limit; // 输出限幅
float integral;
} PI_Controller;
float PI_Update(PI_Controller *ctrl, float error) {
ctrl->integral += error * ctrl->T;
// 抗积分饱和处理
float output = ctrl->Kp * error + ctrl->Ki * ctrl->integral;
if (output > ctrl->limit) {
output = ctrl->limit;
ctrl->integral -= error * ctrl->T; // 回退积分
} else if (output < -ctrl->limit) {
output = -ctrl->limit;
ctrl->integral -= error * ctrl->T;
}
return output;
}
2.2.2 前馈补偿增强
对于输入电压波动明显的场景(如电动汽车充电时电网电压抖动),需加入电压前馈:
$$ D_{ff} = \frac{V_{out}}{V_{in}} $$
实际实现时需考虑ADC采样延迟,建议采用一阶滞后补偿:
c复制float feedforward_compensation(float Vin, float Vout) {
static float prev_ff = 0;
float alpha = 0.2; // 滞后系数
float ff = Vout / (Vin + 0.001f); // 避免除零
prev_ff = alpha * ff + (1 - alpha) * prev_ff;
return prev_ff;
}
3. 保护机制设计
3.1 硬件保护电路
-
过流快速保护:
- 比较器硬件触发(响应时间<1μs)
- 采用TLV3501等高速比较器,阈值通过DAC可调
- 触发后直接关闭PWM驱动芯片(如UCC21710)的SD引脚
-
软件保护策略:
c复制void Safety_Check(float I_meas) {
static uint32_t fault_count = 0;
if (I_meas > I_FAULT_THRESHOLD) {
PWM_Disable();
Fault_Latch();
}
else if (I_meas > I_WARNING_THRESHOLD) {
fault_count++;
if (fault_count > 3) {
PWM_Reduce_Duty(50); // 降载运行
}
} else {
fault_count = 0;
}
}
3.2 抗饱和处理技巧
积分饱和是PI控制的常见问题,除了常规的积分限幅外,我们采用动态积分增益:
$$ K_i' = K_i \cdot \left(1 - \frac{|u|}{u_{max}}\right) $$
这种非线性调整可在接近限幅时自动降低积分作用,实测可减少超调量30%以上。
4. 参数整定与调试
4.1 频域法整定步骤
-
获取被控对象模型:
- 注入扫频信号(0.1fs~0.5fs)
- 通过FFT分析幅频/相频特性
- 拟合传递函数(通常为一阶惯性环节)
-
计算初始参数:
- 带宽$f_c$取开关频率的1/10
- 相位裕度目标设为45°~60°
- 根据幅值交点准则计算$K_p$:
$$ |G_p(j2\pi f_c)G_c(j2\pi f_c)| = 1 $$ - 积分时间常数:
$$ T_i = \frac{tan\phi_m}{2\pi f_c} $$
其中$\phi_m$为相位裕度
4.2 时域调试技巧
-
阶跃响应测试:
- 先设$K_i=0$,逐步增大$K_p$至出现轻微振荡
- 取该值的60%作为最终$K_p$
- 然后增加$K_i$直至消除静差,但需保证超调<10%
-
抗扰动测试:
- 突加/突减负载(如20%→80%)
- 观察恢复时间,调整前馈系数
- 典型指标:恢复时间<5ms,超调<5%
调试工具推荐:
- 示波器:Keysight DSOX1204G(带电源分析选件)
- 协议分析:CANoe用于车载通信验证
- 数学工具:Python Control库进行频域分析
5. 工程实践中的典型问题
5.1 ADC采样时序问题
在STM32系列MCU中,ADC采样窗口与PWM更新不同步会导致相位延迟。解决方案:
- 使用定时器触发ADC采样(TIMx_TRGO)
- 将采样时刻设置在PWM周期中点:
c复制// STM32 [HAL](https://taotoken.net/?utm_source=hardware)库配置示例
hadc.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
htim3.Instance->CR2 |= TIM_CR2_MMS_1; // TRGO输出更新事件
htim3.Instance->CCR2 = htim3.Instance->ARR / 2; // 50%占空比触发
5.2 数字量化误差处理
当电流指令变化较小时,12位ADC分辨率可能不足。可采用以下措施:
- 软件过采样:
c复制#define OVERSAMPLE 16
uint16_t adc_oversample(void) {
uint32_t sum = 0;
for (int i=0; i<OVERSAMPLE; i++) {
sum += HAL_ADC_GetValue(&hadc);
delay_us(1);
}
return (sum + OVERSAMPLE/2) / OVERSAMPLE; // 四舍五入
}
- 死区补偿:
在误差小于阈值时,累加微小误差直至达到LSB:
c复制float deadzone_comp(float error) {
static float accum = 0;
accum += error;
if (fabs(accum) > ADC_LSB) {
float output = accum;
accum = 0;
return output;
}
return 0;
}
6. 实测性能优化案例
在某800V车载充电机项目中,初始设计出现以下问题:
- 输入电压90-264VAC时,输出电流THD>8%
- 负载阶跃响应时间达15ms
通过以下改进措施后:
- 在PI控制器前加入谐波补偿器:
$$ G_{comp}(z) = \frac{1 - 0.8z^{-1}}{1 - 0.2z^{-1}} $$ - 采用自适应前馈系数:
$$ \alpha = 0.3 + 0.7 \cdot \frac{V_{in}}{264} $$
最终指标:
- THD降至3%以下
- 阶跃响应时间<5ms
- 效率提升1.2%(得益于开关损耗降低)