【2022年单相交流电子负载(A题)的软件部分实现(全国大学生电子设计竞赛】

【2022年单相交流电子负载(A题)的软件部分实现(全国大学生电子设计竞赛】
一、整体控制架构两级的闭环链条系统分为前级整流器模拟负载特性和后级逆变器稳住母线电压。两者通过直流母线电容解耦形成了两个独立的级联闭环前级整流侧有效值外环PI嵌套瞬时值内环PR。负责让输入电流跟随设定值如2A和设定PF角。后级逆变侧直流母线电压外环PI。负责把母线电压稳在55V让能量自动平衡PF改变输入有功功率改变逆变器用于消耗有功功率稳定直流母线电压。控制算法全部在25kHz的HRTIM中断里执行周期40μs执行顺序严格按ADC采样→滤波→锁相→闭环计算→更新PWM比较值。逆变器前馈的推导过程比较简略全是博主个人理解。由于系统损耗仅为5%~10%影响小为简化计算后续计算忽略。二、整流侧闭环外环给幅值内环追波形2.1 外环电流有效值闭环—— PI控制器目标让输入电流有效值等于面板设定的RecISet比如2A。反馈ac_load.rec_i_rms_fit_value软件算出的电流有效值经低通滤波。代码执行// 误差 设定值 - 反馈值dsp_arm_pid_function(pid_rec_i,ac_load.rec_i_set-ac_load.rec_i_rms_fit_value);// 限幅输出作为电流指令的幅值系数if(pid_rec_i.out3.0f)pid_rec_i.out3.0f;if(pid_rec_i.out1.0f)pid_rec_i.out1.0f;物理意义pid_rec_i.out就是电流正弦波指令的有效值。2.2 内环瞬时值闭环—— PR控制器目标让实际的瞬时电流ac_load.rec_i_fit_value无静差地跟踪“幅值×sin(θφ)”这个瞬时指令。关键代码// 内环的输入误差 [外环输出的幅值 × 正弦波(含PF角)] - [实际电流反馈]pr_rec_i.xipid_rec_i.out*1.414213562f*arm_sin_f32(bsp_spll.thetaphase_angle)-ac_load.rec_i_fit_value;// 运行PR控制器在50Hz处提供无限增益pr_control(pr_rec_i);// PR输出限幅调制电压if(pr_rec_i.yo0.95f)pr_rec_i.yo0.95f;if(pr_rec_i.yo-0.95f)pr_rec_i.yo-0.95f;闭合路径设定值(RecISet) →外环PI→ 幅值指令 → × sin(θφ) →内环PR→ 调制电压 → PWM驱动MOS → 实际电流 → ADC采样回来做反馈。整个闭环路径就是这么串起来的。明白了我将“移相实现”作为独立的2.3 节来写紧接在 SOGI 锁相环2.1和 PF 控制原理2.2之后重点讲清楚从 PF 数值到实际电流指令角度偏移的完整映射过程。2.3 移相角的计算与实现PF → 相位映射锁相环SOGI给出了电网电压的实时相位 ( \theta )但要让电流跟踪带有功率因数要求的波形必须在这个相位上叠加一个偏移量 ( \phi )即移相角。本节讲清楚这个偏移量是如何算出来、如何生效、以及如何保证安全的。2.3.1 数学映射一个反余弦函数搞定根据功率因数的定义PF cos(phi)所以给定目标 PF 值例如 0.85移相角就是phi arccos(PF)phi 0电流相位超前电压模拟容性负载电容特性\phi 0电流相位滞后电压模拟感性负载电感特性。关键代码在PAGE_OnParameterChanged回调中当用户按增减键修改 PF 时触发// 根据当前选中的负载类型容性0 / 感性1决定相位角的正负switch(cap_ind_flag){case0:// 容性负载电流超前电压相位角取正phase_anglearm_acos_f32(pf);break;case1:// 感性负载电流滞后电压相位角取负phase_angle-arm_acos_f32(pf);break;}2.3.2 运行时生效注入电流指令与前馈在 25kHz 的 HRTIM 控制中断里SOGI 每周期更新一次bsp_spll.theta代表当前电网电压相位。叠加移相角后生成内环 PR 控制器要追踪的瞬时电流目标值// 外环 PI 输出的幅值系数 × 1.414峰值系数// × sin(电网相位 θ 移相角 φ)floatcurrent_targetpid_rec_i.out*1.414f*arm_sin_f32(bsp_spll.thetaphase_angle);// 内环误差 目标值 - 实际反馈电流pr_rec_i.xicurrent_target-ac_load.rec_i_fit_value;与此同时PWM 前馈项也必须同步叠加上这个移相角否则前馈和闭环指令会“打架”一个超前、一个滞后PR 被迫输出很大校正量// 前馈正弦波与指令保持完全同相位spwm_rec_i.sinearm_sin_f32(bsp_spll.thetaphase_angle)-pr_rec_i.yo;直观理解锁相环给出的theta好比一根代表电压相位的秒针phase_angle就是把电流指令这根“分针”强行拧偏一个固定角度。只要这个偏角不变电流就能持续以设定的超前/滞后关系跟随电压。2.3.3 关键安全保护防止突变炸机代码中实现了一个隐式的互锁机制。面板上“容性/感性切换”按键Cap_Ind并不是随时都能生效的说明书明确警告“PF 不等于 1 时切换必炸”。底层逻辑是这样的if(line_index2)// 用户正在修改 PF 值所在行{// 不直接允许修改 cap_ind_flag而是通过当前 phase_angle 的正负反推状态if(phase_angle-0.1f)cap_ind_flag1;// 负角度 → 感性if(phase_angle0.1f)cap_ind_flag0;// 正角度 → 容性}为什么 PF1.0 是唯一安全切换点当 PF1.0 时phase_angle 0。此时无论从“容性”切到“感性”相位角都是0 → 0无跳变。如果 PF0.5 时硬切相位角会瞬间从60°猛跳至-60°120° 突变。在 25kHz 中断周期下电流指令会像撞墙一样反向PR 控制器输出剧烈过冲直接导致母线过流或炸毁 MOS 管。代码通过依赖当前角度符号来决定标志位相当于软件层面的互锁强行将突变风险隔离。三、重点前馈Feed-Forward加在哪工程上如果只用闭环PID或PR要等误差产生后才动作响应慢且震荡大。代码里巧妙地加了两处前馈大幅减轻了控制器的负担。3.1 整流侧前馈直接叠加电网电压波形代码位置// 关键sin(θφ) - pr_rec_i.yospwm_rec_i.sinearm_sin_f32(bsp_spll.thetaphase_angle)-pr_rec_i.yo;为什么这样加如果PWM占空比完全由PR输出决定那PR要自己扛住整个正弦波的变化从-0.95到0.95。但请记住电网电压本身就是正弦波为了让电流像正弦波基础占空比本来就应该跟着电网电压走类似整流器的前馈解耦。这里把sin(θφ)作为基础前馈项PR输出pr_rec_i.yo只负责微调修正即减去误差产生的校正量。等效于最终调制波 理想正弦波前馈 - PR校正量闭环PR只需输出很小的值通常±0.1以内就能消除静差动态响应极快。3.2 逆变侧前馈功率前馈—— 最精彩的一笔代码位置// 根据功率守恒定律理论计算当前的调制比arm_sqrt_f32((2.0f*inv_resistance*ac_load.rec_v_rms_fit_value*ac_load.rec_i_rms_fit_value*pf),modulation_feedforward);modulation_feedforwardmodulation_feedforward/ac_load.dc_v_set;// 电压外环PI只输出一个小范围的修正量±0.8dsp_arm_pid_function(pid_dc_v,ac_load.dc_v_fit_value-ac_load.dc_v_set);if(pid_dc_v.out-0.8f)pid_dc_v.out-0.8f;if(pid_dc_v.out0.8f)pid_dc_v.out0.8f;// 最终调制比 前馈计算值 闭环修正值modulation_invmodulation_feedforwardpid_dc_v.out;这样设计的好处负载突变时比如PF从1.0突然调到0.5前馈项modulation_feedforward瞬间算出新的理论占空比母线电压几乎无波动。电压外环PIDpid_dc_v.out只限制在±0.8相对于前馈值来说很小它只负责消除因器件损耗、采样偏差导致的静态误差完全不需要大幅波动。四、执行时序为什么25kHz中断里这么排很重要在HAL_HRTIM_RegistersUpdateCallback25kHz中执行顺序是adc_filter_function();// 1. 先读取最新的电流/电压system_safe_check_function();// 2. 安全检查过流保护SPLL_1PH_SOGI_run();// 3. 更新锁相角 theta// --- 开始闭环计算基于最新的theta和采样值---// 4. 整流器闭环外环PI - 内环PR - 生成 spwm_rec_i.sine// 5. 逆变器闭环前馈计算 - 电压环PI - 生成 modulation_inv// --- 计算结束 ---// 6. 立即更新PWM比较寄存器下一个周期立即生效HRTIM1-sTimerxRegs[...].CMP1xR(uint32_t)spwm_rec_i.spwm;HRTIM1-sTimerxRegs[...].CMP1xR(uint32_t)spwm_inv.spwm;关键点ADC采样必须在计算之前锁相角必须在计算之前PWM更新必须在计算之后。如果锁相算在闭环后面相位会滞后一拍导致PF控制不准。五、总结一张图看明白整流侧闭环路径RecISet(目标有效值)→(外环PI)→幅值指令→× sin(θφ)→[-]反馈电流→(内环PR)→校正量→[-] 前馈正弦波→PWM输出→MOS→ 电流采样回来。逆变侧闭环路径计算理论调制比(前馈)→[]电压外环PI修正量→调制比M→× sin(θ)→PWM输出→MOS→ 母线电压采样回来。整个工程最精髓的两点内环误差相减用的是幅值×sin - 反馈而非指令 - 反馈直接把幅值信息融入瞬时值闭环。前馈不来自PID而是来自电网电压波形整流侧和功率守恒定理逆变侧。PID只负责“擦屁股”承担微调修正角色系统才如此稳定且不容易震荡。1105131487