☰
【电赛/毕设封神榜】一并网就炸机?单相逆变器、PR 比例谐振控制器与 SOGI-PLL 软件锁相环硬核避坑指南
2026/10/10 6:58:52 网站建设 项目流程

前言
电赛电源组(A题)历来是“炸机”和“烧钱”的重灾区。尤其是遇到“并网逆变器”或“交流电子负载”这种题目,无数队伍倒在了最后一步的测试现场。
你的逆变器单独接个灯泡完美无缺,为什么一接入 220V 电网(或隔离变压器),MOS 管就瞬间炸裂,甚至把实验室的空开都跳闸了?
你的交流电压波形看着像正弦波,为什么仪器一测,THD(总谐波失真)高达 5%,直接不合格?

真相是:你用错了控制算法!
传统的 PID 天生只能控制“直流(DC)”,面对 50Hz 的交流(AC)正弦波,它存在绝对无法消除的稳态误差与相位滞后!而传统的硬件过零检测电路,根本防不住电网的谐波噪声。
今天,本文将带你撕开高级电力电子控制的数学伪装,手把手教你在 STM32 中部署工业界的终极杀器:PR(比例谐振)控制器与 SOGI-PLL(软件锁相环)!

@TOC


一、 认知颠覆:为什么 PID 控制不了正弦波?

灾难现场:你想让逆变器输出一个绝对标准的 50Hz 正弦波。你把正弦波作为 Target,ADC 采样的实际电压作为 Measure,算出来的 Error 扔进 PI 控制器。
结果你用示波器一看,实际输出的波形总是比目标波形慢了半拍(相位滞后),且波峰永远矮了一截(幅值衰减)!

🚨 数学宣判:PI 的带宽缺陷

积分器(I)的本质作用是消除稳态误差。但是,积分器只有在频率为 0Hz(直流)时,增益才是无穷大!
面对频率为 50Hz 的交流信号,PI 控制器的增益是有限的。增益有限,就意味着系统必须靠“误差”来维持输出。
只要你用 PI 控交流,理论上就永远不可能实现零误差跟踪!你的正弦波永远是变形的,THD 根本压不进 1%!


二、 交流之神:PR(比例谐振)控制器降维打击

既然 PI 只能在 0Hz 处提供无穷大增益,那有没有一种算法,能在指定的 50Hz 处,提供无穷大的增益?

🏆 工业界的王牌:PR 控制器(Proportional-Resonant)

PR 控制器的传递函数中,包含一个“谐振器”。它的特点是:
像一根极度尖锐的针,只在你设定的那个频率(比如

f0=50Hzf0​=50Hz

)处,增益瞬间飙升到无穷大!而在其他频率处,增益迅速衰减!

  • 威力 1:在 50Hz 处增益无穷大,意味着它对 50Hz 基波正弦信号的稳态误差为绝对的 0!完全没有幅值衰减和相位滞后!

  • 威力 2:在非 50Hz 处(比如 150Hz 的三次谐波,250Hz 的五次谐波)增益极小。这就意味着它天生就是一个完美的抗谐波滤波器,输出的正弦波极其纯净,THD 轻松压到 1% 以下!

💻 纯 C 语言实战:准 PR 控制器(Quasi-PR)离散化源码

理想的 PR 在单片机里容易由于浮点数精度发散。工程上使用的是“准 PR 控制器”,增加了一个阻尼系数

ωcωc​

,让那根“针”变得稍微宽一点点,适应电网频率

49.5Hz∼50.5Hz49.5Hz∼50.5Hz

的微小波动。

把下面这段经过双线性变换(Tustin)离散化后的 C 语言代码,直接塞进你的高频定时器中断里!

codeC

typedef struct { float Kp; // 比例系数 float Kr; // 谐振系数 (决定消除稳态误差的速度) float Wc; // 截止频率 (增加带宽,防电网频率波动,通常取 2*PI*1.0) float W0; // 谐振中心频率 (通常为 2*PI*50.0) // 离散化历史状态缓存 (严禁外部篡改) float err_1; float err_2; float out_1; float out_2; float dt; // 运行周期 (如 0.0001s, 即 10kHz) // 预计算的离散化系数 float a1, a2, b0, b1, b2; } PR_Controller_t; /** * @brief 初始化 PR 控制器系数 (提前在初始化时算好,省 CPU) */ void PR_Init(PR_Controller_t *pr, float kp, float kr, float w0, float wc, float dt) { pr->Kp = kp; pr->Kr = kr; pr->W0 = w0; pr->Wc = wc; pr->dt = dt; pr->err_1 = 0; pr->err_2 = 0; pr->out_1 = 0; pr->out_2 = 0; // Tustin 离散化系数计算 (推导过程省略,直接用) float T = dt; float den = 4.0f + 4.0f*wc*T + w0*w0*T*T; pr->b0 = (4.0f*kp + 4.0f*kp*wc*T + kp*w0*w0*T*T + 8.0f*kr*wc*T) / den; pr->b1 = (2.0f*kp*w0*w0*T*T - 8.0f*kp) / den; pr->b2 = (4.0f*kp - 4.0f*kp*wc*T + kp*w0*w0*T*T - 8.0f*kr*wc*T) / den; pr->a1 = (2.0f*w0*w0*T*T - 8.0f) / den; pr->a2 = (4.0f - 4.0f*wc*T + w0*w0*T*T) / den; } /** * @brief PR 控制器计算迭代 * @retval 输出给占空比的控制量 */ float PR_Calc(PR_Controller_t *pr, float target, float measure) { float err = target - measure; // 核心差分方程:一行代码实现无限增益! float out = pr->b0 * err + pr->b1 * pr->err_1 + pr->b2 * pr->err_2 - pr->a1 * pr->out_1 - pr->a2 * pr->out_2; // 更新历史状态 pr->err_2 = pr->err_1; pr->err_1 = err; pr->out_2 = pr->out_1; pr->out_1 = out; return out; }

用法:不要再用 PI 去控正弦电压了!把电压外环换成这个 PR_Calc,你的逆变器空载波形将如同教科书上的正弦波一般完美无瑕!


三、 并网炸机的罪魁祸首:硬件过零检测的脆弱

痛点:如果要并入电网,逆变器输出的交流电必须与电网的交流电同频同相。只要差几度,几百安培的环流就会瞬间把 MOS 管炸成粉末。
新手死法:用比较器(LM393)搭一个硬件过零检测电路。电网电压一跨过 0V,STM32 就进一次外部中断,记录下频率和相位。
真相:实际的 220V 电网(或隔离变压器)里充满了高频谐波、用电器切换带来的毛刺!硬件比较器会在过零点附近发生**“疯狂的连续翻转”**。你的 STM32 中断瞬间瘫痪,提取出来的相位疯狂抖动,一并网就火葬场!


四、 工业并网之魂:SOGI-PLL 软件锁相环

在高端 UPS 和光伏逆变器中,硬件过零检测早被淘汰了。取而代之的是纯软件的算法:SPLL(软件锁相环)。
单相锁相环最顶级的架构叫做:SOGI-PLL(基于二阶广义积分器的锁相环)。

SOGI 的神奇魔力:无中生有!

在三相电中,我们可以用 Clark 和 Park 变换提取相位。但在单相电中,只有一个电压

VαVα​

,没法做数学变换。
SOGI 的作用就是“无中生有”!
它能吃进去一个充满谐波的单相脏电网电压,利用积分器,吐出两个极其纯净、且相位刚好相差

90∘90∘

(正交)的电压信号:

VαVα​

(同相)和

VβVβ​

(正交)。
有了这两个互相垂直的信号,我们就可以愉快地使用 Park 变换了!

SOGI-PLL 算法极简工作流

  1. ADC 以 10kHz 采集极度不纯净的电网电压

    UgridUgrid​
    。
  2. 将

    UgridUgrid​
    送入SOGI 算法,得到纯净的正交信号
    VαVα​
    和
    VβVβ​
    。
  3. 把

    VαVα​
    和
    VβVβ​
    进行Park 变换(参考前文 FOC 篇),得到直流分量
    VqVq​
    。
  4. 锁相核心:把

    VqVq​
    送进一个普通的 PI 控制器,目标值设为 0!
  5. PI 控制器输出的调节量加上

    2π×50Hz2π×50Hz
    ,就是电网的实时瞬时角频率
    ωω
    。
  6. 把

    ωω
    积分一次,就得到了绝对平滑、丝毫不受噪声影响的电网绝对相位
    θθ
    !

有了这个由纯数学算法提取出来的

θθ

,你再把它乘上你设定的电流幅值生成正弦波,你的逆变器就仿佛和电网“心灵相通”,并网电流如丝般顺滑,毫无冲击!


五、 控制系统终极架构:双闭环的艺术

有了 PR 和 SOGI-PLL,一个满分的电赛并网逆变器/交流电子负载的 C 语言核心框架应该是这样的(运行在 10kHz~20kHz 的中断里):

codeC

void Inverter_Control_Loop(void) { // 1. 采集电压电流 float U_grid = Get_Grid_Voltage(); // 电网侧电压 float I_inv = Get_Inverter_Current(); // 逆变器电感电流 float U_inv = Get_Inverter_Voltage(); // 逆变器电容电压 // 2. SOGI-PLL 锁相环,锁定电网相位 float theta = SOGI_PLL_Run(U_grid); // 3. 电压外环 (采用 PR 控制器,实现交流电压零稳态误差跟踪) // 目标电压:用锁出来的相位生成一个完美的正弦波 float V_target = 36.0f * arm_sin_f32(theta); // 外环输出的,是内环的期望电流! float I_target = PR_Calc(&Volt_PR, V_target, U_inv); // 4. 电流内环 (采用普通 PI 即可,因为电流内环带宽极高) // 如果想要极致性能,电流内环也可以用 PR 控制器! float duty_cycle = PI_Calc(&Current_PI, I_target, I_inv); // 5. 电网电压前馈补偿 (抗电网波动的保命神技) duty_cycle = duty_cycle + (U_grid / BUS_VOLTAGE); // 6. 输出 SPWM 驱动 H 桥 Set_SPWM_Duty(duty_cycle); }

这就是百万级商用储能逆变器的基础缩影!从锁相、并网到双闭环,全流程软件化!


结语

在电力电子(Power Electronics)的世界里,硬件是强壮的肌肉,而控制算法是拥有高级智慧的大脑。

当你抛弃了那些“差不多就行”的硬件比较器,放弃了在交流域里力不从心的 PI 积分,转而用SOGI-PLL从浑浊的噪声中提取出最纯粹的相位,用PR 控制器在数学的奇点处建立起无限大的增益屏障时……
你就不再是一个在实验室里被炸管声吓得发抖的新手了。

预祝各位挑战电源组天花板的电气极客们:锁相一发入魂,PR 跟踪丝毫不差,并网毫无波澜,THD 碾压全场,稳稳拿下那个属于你们的国一“杯子”!🏆

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询