单相全桥PWM整流双闭环控制。 电压环采用PI控制器,电流环采用PR控制器;可以实现整流器交流侧单位功率因数,直流侧电压恒定。 额定:交流侧电压60V,电流10A,直流侧电压150V。 图为电阻1秒突加时的波形图,验证了闭环控制系统的稳定性!

单相全桥PWM整流这玩意儿搞双闭环控制到底有多猛?直接拿电阻突加实验说话——直流侧电压纹丝不动,交流电流还能和电压同相位,这就叫闭环控制的硬实力。电压环用PI,电流环上PR,这套组合拳可不是随便选的。PI控制器对付直流电压的稳态误差有天然优势,而PR控制器专治交流电流跟踪,谐振点在工频50Hz附近直接锁死基波分量。

先看电压外环的代码实现,核心就是离散化的PI运算:

% 电压外环PI控制器
function [I_ref] = VoltageLoop_PI(Vdc_ref, Vdc_meas, Kp_v, Ki_v, Ts)
    persistent integral_error;
    if isempty(integral_error)
        integral_error = 0;
    end
    error = Vdc_ref - Vdc_meas;
    integral_error = integral_error + error * Ts;
    I_ref = Kp_v * error + Ki_v * integral_error;  % 输出电流幅值指令
end

这里的积分项处理用了个小技巧——把积分时间常数藏在Ki参数里,省得每次都重新计算。采样时间Ts必须和实际控制周期严格对应,否则积分会飘得亲妈都不认识。注意这里的I_ref可不是直接给电流环用,得先乘上正弦同步信号生成电流指令的波形。

电流内环的PR控制器更带劲,直接上传递函数:

// PR控制器离散化实现(双线性变换法)
float PR_Controller(float error, float Kp, float Kr, float w0, float Ts) {
    static float prev_error = 0.0;
    static float prev_output = 0.0;
    
    float a = (2/Ts)*w0;
    float b = (Kr*a*Ts)/(4 + a*Ts);
    float output = prev_output 
                 + Kp*(error - prev_error) 
                 + b*(error + prev_error);
    
    prev_error = error;
    prev_output = output;
    return output;
}

这个实现直接把谐振峰钉死在w0=314rad/s(50Hz)。参数Kr决定谐振强度,大了容易振荡,小了跟踪不给力。实战中得拿扫频仪实测伯德图,看着相位裕度调参数才靠谱。

突加负载测试时,直流侧电压的恢复过程暴露了控制器的真本事。看看这波形:1秒时负载电阻从30Ω突变到15Ω,直流电压瞬间跌了5V,0.2秒内就拉回150V。秘密藏在电流环的快速响应——PR控制器的误差放大直接让IGBT的PWM占空比暴增,电感电流飙升速度比猎豹还快。

交流侧单位功率因数怎么实现的?看相量图就明白:网侧电压vac和电流iac完全同相位。实测THD不到3%,关键在PWM调制时加入了电压前馈补偿。这里有个骚操作——把电网电压的瞬时值乘以电流指令的符号位,直接抵消掉电网波动的影响:

def feedforward_compensation(v_grid, I_mag):
    phase = np.sign(v_grid)  # 检测电压极性
    return I_mag * phase * abs(v_grid)/Vdc_meas  # 动态调整调制深度

这招比单纯用锁相环快得多,特别适合电网电压有畸变的场合。不过要注意前馈量不能加太猛,否则会引发PWM饱和。

整套系统跑在10kHz开关频率下,用STM32G4系列的主控刚好吃得消。中断服务程序里把ADC采样、控制算法、PWM更新这三个动作压缩在50μs内完成,秘诀是用Cortex-M7内核的双精度浮点加速器——别再用定点数了,那玩意儿调参数能调到你怀疑人生。

最后说个实战坑点:直流侧电容的ESR直接影响电压环稳定性。曾经有个兄弟用普通电解电容,结果负载突变时电压振荡得像心电图。换成固态电容后波形立马光滑如丝——这年头,硬件选型不过关,软件再牛逼也白搭。

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐