ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

单相交流电子负载能量回馈:STM32实现SOGI-PLL与并网控制

单相交流电子负载能量回馈:STM32实现SOGI-PLL与并网控制 简介湖北省大学生电子设计竞赛A题“带能量回馈的单相交流电子负载”源码工程面向电子竞赛选手、毕设及课程设计学习者提供从底层驱动到人机交互的完整实现。工程采用全隔离设计功率因数0.11容感性可调输入电流THD低于2%支持CC/CR/CP/CS四种负载模式和多种保护机制压缩包共303个文件以STM32F4 HAL库的C源码与头文件为主包含编译生成的.o/.d/.elf/.map以及CubeMX配置(.ioc)、PDF设计文档和烧录固件(.bin)整体约19.74MB目录结构清晰便于定位。目前已有315人学习下载适合希望深入掌握单相交流电子负载控制思路与能量回馈实现细节的读者。借助该源码可快速理解ADC采样、定时器PWM、UART通信及有功/无功功率计算等关键环节并在此基础上进行二次开发或竞赛复用。1. 带能量回馈的单相交流电子负载竞赛题背后的硬核工程湖北省大学生电子设计竞赛 A 题把「交流电子负载」和「能量回馈」放进同一道题意味着这不是一块靠电阻丝把功率烧成热量的假负载而是一套要同时处理功率吸收、能量转换和并网同步的完整电力电子系统。被测电源输出的交流能量先由 PWM 整流器吸收变成直流存入母线电容再由后级逆变器逆变成与电网同步的交流电送回电网整体效率能做到 90% 以上散热需求大幅下降。对做电源老化台架、UPS 验收和逆变器带载测试的工程师来说这套方案的源码骨架就是「采样—锁相—电流环—回馈并网」这条闭环链路。以下从拓扑选型、软件实现、参数整定和实测验证逐层展开。2. 双级式背靠背拓扑单相交流电子负载的能量回馈主链路2.1 为什么必须用背靠背结构单级电路的能量反向困境单级电路比如可控整流桥加功率电阻只能单向消耗能量没办法让能量反向流动。要在被测设备和电网之间实现能量双向流动标准做法是背靠背结构前级全桥做 PWM 整流器后级全桥做并网逆变器两个 H 桥共用一条直流母线母线电容承担功率解耦。前级负责把输入电流跟踪成给定波形等效为一个可编程交流负载后级负责维持母线电压并把净能量送回电网。竞赛级参数大致如下表环节取值设计依据前级电感 L11~3 mH按电流纹波率 20%~40% 反算后级电感 L22~4 mH抑制并网电流谐波配合 LCL 可更小直流母线电容1000~2200 uF / 450V吸收瞬时功率差母线纹波不超过 5%开关频率10~20 kHzIGBT 取 10k低压 MOS 可取 20k母线额定电压380~400V保证后级能向 220V 电网馈电两级之间是能量守恒关系前级吸收多少瓦后级就回馈多少瓦减去损耗母线电容只承担瞬时功率波动。所以母线电压环的输出直接作为后级电流的幅值指令——母线电压偏高说明回馈不足偏低说明吸收不足。这个闭环方向接反系统会直接失控炸管。2.2 前级 PWM 整流器CR/CC/CP 模式到电流指令的映射前级整流器工作在电流环模式目标是把电感电流控制成与输入电压同频同相的正弦波。四种负载模式本质都是电流指令生成方式的差异CR 恒阻i_ref v_dut / R_set瞬时值除以设定电阻等效纯电阻CC 恒流i_ref I_set × sin(θ)幅值恒定的正弦电流CP 恒功率i_ref P_set / v_dut瞬时功率恒定模拟光伏或电池CV 恒压外环电压 PI 输出电流指令最坑的是 CP 模式输入电压过零附近 P_set / v_dut 趋向无穷大必须做除零保护和限幅。工程做法是当 |v_dut| 8V 时强制电流指令为零再配合一阶低通滤波器让指令平滑过渡// modes.c — CP 模式电流指令生成带过零保护 float mode_cp_calc(float p_set, float v_dut, float v_rms) { float i_ref 0.0f; if (v_rms 20.0f) { // 有效值低于 20V 不工作 if (fabsf(v_dut) 8.0f) { // 瞬时值过零死区 i_ref p_set / v_dut; // P/v 得到瞬时电流 i_ref constrain_float(i_ref, -I_MAX, I_MAX); } } return i_ref; }v_rms 的条件判断比只看瞬时值更可靠DUT 刚上电时电压从零爬升有效值没到 20V 之前电流指令保持为零避免给电源造成冲击负载。I_MAX 按额定电流的 1.2 倍取值超过就限幅宁可功率不足也不能过流。2.3 后级并网逆变器与 SOGI-PLL单相系统怎么锁相后级逆变电流必须和电网电压同频同相才能以单位功率因数回馈能量。单相电网只有一相电压不能直接做 dq 变换最常用的是 SOGI二阶广义积分器构造虚拟正交分量再进入标准的 SRF-PLL同步参考坐标系锁相环路径。SOGI 的传递函数是 G(s) k·ω₀·s / (s² k·ω₀·s ω₀²)k 取 1.414阻尼比 0.707时在 50Hz 处幅值增益为 1、相位滞后接近 0°。PLL 的 PI 带宽设定在 5~15Hz能跟踪电网 ±0.5Hz 的频率漂移同时压制电网谐波和由直流偏置造成的 100Hz 纹波。带宽再高 theta 会抖太低则频率阶跃时要好几个周波才能重新锁住。3. STM32 源码实现SOGI-PLL 与电流环的核心流程3.1 三层任务划分10kHz 电流环 / 1kHz 电压环 / 100Hz 交互数字电源的工程惯例是把实时性要求不同的功能放在不同优先级的执行层。电流环放在定时器更新中断里跑 10kHz母线电压环和保护逻辑放 1kHz 软件定时任务人机交互和参数刷新放 100Hz 主循环。电流环中断里不做字符串处理、浮点打印或延时否则中断抖动会直接变成电流波形上的毛刺。层级周期任务容许抖动电流环中断10kHzADC 采样、SOGI-PLL、电流 PI、占空比输出 1us电压环/保护1kHz母线电压 PI、CV 外环、故障检测 50us主循环100Hz参数刷新、显示、按键、模式切换无要求源码工程按模块拆分目录结构如下src/ ├── main.c // 初始化、主循环任务调度 ├── pll_sogi.c // SOGI-PLL 锁相环 ├── current_loop.c // 前后级电流环 PI ├── voltage_loop.c // 母线电压环 CV 外环 ├── protection.c // 三级过流保护状态机 └── modes.c // CR/CC/CP/CV 模式指令生成3.2 SOGI-PLL 在 Cortex-M4 上的离散化实现下面这份代码可以直接用在 STM32F4 系列上采样率 10kHz输入是电网电压的瞬时采样值// pll_sogi.c typedef struct { float alpha, beta; // SOGI 正交分量 float theta; // 锁相角输出 (rad) float w; // 角频率输出 (rad/s) float integrator; // PLL PI 积分器状态 } sogi_pll_t; void sogi_pll_init(sogi_pll_t *p) { p-alpha 0; p-beta 0; p-theta 0; p-w 314.159f; p-integrator 0; } float sogi_pll_update(sogi_pll_t *p, float v_in, float v_peak) { float v_norm v_in / v_peak; // 幅值归一化PLL 增益与电网电压无关 float Ts 0.0001f; // 10kHz 采样周期 float k 1.414f; // SOGI 阻尼比 float alpha_prev p-alpha; // SOGI 离散化前向欧拉 p-alpha Ts * p-w * k * (v_norm - p-beta); p-beta Ts * p-w * alpha_prev; // Park 变换q 轴分量作为相位误差 float sin_t sinf(p-theta); float cos_t cosf(p-theta); float vq -p-alpha * sin_t p-beta * cos_t; // PI 调节角频率kp30、ki900 对应约 6Hz 闭环带宽 p-integrator 900.0f * Ts * vq; p-w 314.159f 30.0f * vq p-integrator; // 相位积分并折叠到 [0, 2π) p-theta p-w * Ts; if (p-theta 6.28318f) p-theta - 6.28318f; return p-theta; }参数说明v_peak 是电网电压峰值220V 有效值对应 311V归一化后 PLL 的 PI 增益不受电压幅值波动影响。kp30 决定动态响应ki900 决定稳态精度工程上按 ki ≈ 30×kp 起步。调参顺序先把 kp 从 10 往上加观察 theta 输出有无抖动到临界点后退回 70%再单独加 ki 消除稳态误差。3.3 前后级电流环闭环从采样到 PWM 占空比换算一次完整的 10kHz 中断要完成 ADC 读取、两个 PLL 更新、电流指令生成、两个 PI 调节、占空比换算和限幅// current_loop.c — TIM1 更新中断 void TIM1_UP_IRQHandler(void) { TIM_ClearITPendingBit(TIM1, TIM_IT_Update); // 1. 采样五个关键量 float v_dut adc_read(ADC_CH_VDUT); float i_dut adc_read(ADC_CH_IDUT); float v_bus adc_read(ADC_CH_VBUS); float v_grid adc_read(ADC_CH_VGRID); float i_inv adc_read(ADC_CH_IINV); // 2. 双 PLLDUT 相位 电网相位 float theta_dut sogi_pll_update(pll_dut, v_dut, 311.0f); float theta_grid sogi_pll_update(pll_grid, v_grid, 311.0f); // 3. 前级电流指令 PI 调节 float i_ref mode_gen_reference(v_dut, theta_dut); float pi_f pi_update(pi_front, i_ref - i_dut); // 4. 后级母线电压环输出决定电流幅值与电网同相 float i_ref_inv bus_pi.out * sinf(theta_grid); float pi_b pi_update(pi_back, i_ref_inv - i_inv); // 5. 占空比换算全桥 V_ab (2*duty-1)*V_BUS float m_front (pi_f v_dut) / v_bus; // DUT 电压前馈 float m_back (pi_b v_grid) / v_bus; // 电网电压前馈 float duty_front constrain_float(m_front * 0.5f 0.5f, 0.05f, 0.95f); float duty_back constrain_float(m_back * 0.5f 0.5f, 0.05f, 0.95f); pwm_set_duty(TIM_FRONT, duty_front); pwm_set_duty(TIM_BACK, duty_back); }两个细节值得停下来看。一是前馈前后级都在 PI 输出上叠加了各自的电压前馈作用是让 PI 只修正误差而不是独自对抗输入扰动负载突变时的动态性能差距非常明显。二是占空比换算全桥输出 V_ab (2·duty − 1)·V_BUS反解 duty 必须经过 (m1)/2 的线性变换直接拿 PI 输出当占空比会有直流偏置严重时电感饱和。3.4 软启动、并网与回馈状态切换的状态机四态状态机是这类系统的基本骨架IDLE待机、SOFT_START母线预充、FEEDBACK闭环回馈、FAULT故障锁存。软启动阶段母线电容通过预充电阻充电母线电压到达 300V 以上再闭合旁路接触器否则上电瞬间的涌流会烧保险丝// protection.c — 状态机切换 void state_machine_run(void) { switch (sys_state) { case SYS_IDLE: if (start_cmd) { precharge_on(); sys_state SYS_SOFT_START; } break; case SYS_SOFT_START: if (v_bus 300.0f) { // 母线预充完成 bypass_contactor_on(); // 短接预充电阻 soft_start_cnt 500; // 500ms 斜坡 sys_state SYS_FEEDBACK; } break; case SYS_FEEDBACK: if (fault_flag ! FAULT_NONE) { pwm_disable_all(); sys_state SYS_FAULT; } else if (soft_start_cnt 0) { soft_start_cnt--; i_ref_limit I_NOM * (1.0f - (float)soft_start_cnt / 500.0f); } break; case SYS_FAULT: if (fault_ack) { fault_flag FAULT_NONE; sys_state SYS_IDLE; } break; } }提示软启动的本质是逐步放开电流指令的幅值上限让前级功率从零斜坡升到目标值。跳过这一步直接给满功率指令母线电压会过冲后级回馈来不及跟上母线电容很容易损坏。4. PI 参数整定与工程排错电感纹波、死区补偿与过流保护4.1 电流环 PI 的手工整定法仿真里调好的 PI 上电大概率不能用实际系统有死区、采样延迟和电感饱和理想模型体现不出来。手工整定三步走先把 Ki 置零Kp 从 0.5 往上加观察电流波形直到出现等幅振荡记下临界增益 Kp_critKp 取 0.5~0.6 倍的 Kp_critKi 初始化为 Kp·R/L 量级R 是电感铜阻加回路等效电阻再微调。判断标准看电流波形增益过高时正弦电流的 1/4 周期处出现锯齿状边沿增益过低时过零附近出现平顶和相位滞后。相位滞后会让 DUT 侧等效功率因数变差直接影响竞赛评分里「电阻模拟精度」这一项。4.2 死区补偿小电流畸变的元凶与查表法互补 PWM 必须有死区时间1~3us 的典型死区在电流过零附近造成输出电压误差表现为电流波形上的「台阶」THD 能到 5%~8%。死区补偿的标准做法是符号查表法// deadtime_comp.c void deadtime_compensate(float *duty, float i_phase) { static const float v_dt 0.02f; // 归一化死区补偿量 if (i_phase 0.05f) { // 电流正向 *duty v_dt; } else if (i_phase -0.05f) { // 电流反向 *duty - v_dt; } // 滞回区间内不补偿避免方向抖动 }注意过零附近 ±0.05A 的滞回区间必须保留。没有滞回的话电流方向在零点附近反复跳变补偿量跟着抖会在电流波形上产生新的毛刺。v_dt 的工程估算v_dt ≈ fsw × t_dead即开关频率乘以死区时间。10kHz 开关、2us 死区对应 v_dt 0.02与上面代码一致。实测确认方法是把死区从 3us 逐档往下减同时记录 THDTHD 降到最低且不再随死区变化时的值就是你的补偿精度上限。4.3 三级过流保护硬件比较器是最快的那一级只靠软件过流保护不够ADC 采样到 IGBT 封锁之间的延迟至少一个中断周期10kHz 下 100usIGBT 的短路耐受时间通常只有 10us 量级。标准做法是三级保护级别延迟实现动作硬件比较器 1usLM393 比较电流传感器输出直接拉低 PWM 驱动芯片使能脚软件比较器100us电流环中断内阈值判断封锁 PWM 锁存故障码母线过压/欠压1ms电压环周期判断封锁 PWM 断开继电器第一级不走 MCU在 PWM 驱动使能脚比如 IR2110 的 SD 脚上由硬件比较器直接拉低这是唯一能在 IGBT 短路耐受时间内动作的保护。第二级软件比较器负责锁存故障原因方便赛后排查。第三级母线过压和欠压都要做过压说明后级回馈来不及欠压说明前级吸收异常两种都必须进 FAULT 状态。4.4 采样噪声与共地问题ADC 抖动会毁掉波形质量电流环对采样噪声极其敏感。DUT 侧电流用霍尔传感器时信号地必须单点接地避免功率地线上的压降进入控制地形成环路。ADC 触发时刻安排在 PWM 载波的波峰和波谷避开开关噪声。软件里加一阶低通截止 2kHz 左右也可以但滤波相位滞后会吃掉电流环的稳定裕度截止频率不能压得太低。一个容易忽略的硬件坑是电感饱和铁粉芯磁环在大直流偏置下电感量骤降电流纹波随功率升高突变。示波器看电感电流波形如果纹波在 50% 负载以上非线性飙升基本判定磁芯饱和换更大截面的磁芯比调 PI 参数有效得多。5. 用示波器验证能量回馈功率因数、效率与 PLL 相位误差实测5.1 测试接线与回馈效率计算接线路径按「DUT → 前级输入 → 母线 → 后级 → 隔离变压器 → 电网」串联。没有功率分析仪时用两路电压探头加两路电流探头接示波器同时采 DUT 侧和并网侧数据。回馈效率 P_grid / P_dut在额定功率的 25%、50%、75%、100% 四个点各测一组画效率曲线比单点数据更能暴露功耗异常。竞赛评分通常要求满载效率 ≥ 85%、并网功率因数 ≥ 0.95。5.2 用 Lissajous 图形快速评估 PLL 相位误差把电网电压接 CH1、后级输出电流接 CH2示波器切 X-Y 模式。理想单位功率因数回馈下图形是一条 45° 直线出现椭圆说明电流电压之间有相位差椭圆短轴与长轴的比值乘以 57.3°就是相位误差的近似度数。这个方法在现场几秒钟就能判断 PLL 是否锁准比录波回来做 FFT 分析快得多。相位误差大于 5° 时先查 PLL 的 vq 是否收敛到零——vq 有稳定偏置说明 SOGI 的初始角频率和电网频率偏差太大需要放宽 PLL 积分器限幅。提示满载额定功率连续跑 10 分钟用红外测温枪对比前级电感和后级电感温度。两侧温差超过 10°C说明某一级电流环的增益或死区补偿没调均衡回馈效率和波形质量都还有提升空间。本文还有配套的精品资源点击获取
返回列表