玩转T型三电平并网控制:手撕C代码实现工业级控制方案
s-function(纯C代码),基于三相不平衡下的T型三电平并网控制,采用正负序双PI控制(s-function纯代码),DSOGI锁相环(s-function),SVPWM(mfunction),中点电位平衡采用的buck-boost模式硬件控制。 1.系统代码可代入DSP,ARM中使用 2.除调制方式外均采用c代码编写 3.中点电位平衡采用硬件控制模式 4.提供参考文献,仿真源文件 s-function是simulink中比较复杂的模块,需2018或以上版本,请注意。
“三相电压又抽风了!”——这是做新能源并网的工程师们最头疼的工况。今天咱们撸起袖子,用纯C代码在Simulink环境里搭建一套硬核的三电平并网控制系统,专治各种不平衡工况。(悄悄说:整套代码可直接移植DSP28335或STM32H7系列)
一、系统架构直通车
整个系统由四大金刚组成:DSOGI锁相环实时捕获电网畸变、正负序双PI控制器实现不对称补偿、SVPWM调制模块生成驱动脉冲,还有硬件担当buck-boost电路专职中点电位平衡。重点看C代码实现部分:
// 系统主循环骨架(删减版) static void mdlOutputs(SimStruct *S, int_T tid) { // 获取输入信号 real_T *u = (real_T*) ssGetInputPortSignal(S,0); // 电网电压 // DSOGI锁相环计算 DSOGI_Calc(&sogiparams, u); // 正负序分离 Seq_Decompose(&seqparams, sogiparams.alpha, sogiparams.beta); // 双PI控制器运算 DualPI_Calc(&piparams, seqparams.pos_d, seqparams.pos_q, seqparams.neg_d, seqparams.neg_q); // 生成调制波 Gen_ModulationWave(&svpwmparams, piparams.vd, piparams.vq); // 发送PWM脉冲 ssWriteOutputPort(S, 0, svpwmparams.PWM1); // ...其他PWM通道 }代码亮点解析:
- 结构体封装所有参数(如sogiparams、piparams),方便在不同函数间传递
- 使用指针直接操作Simulink输入输出端口,避免内存拷贝
- 模块化设计让DSP工程移植只需替换硬件驱动层
二、DSOGI锁相环:电网畸变克星
二阶广义积分器的精髓在于正交信号生成,C代码实现比教科书公式更带感:
typedef struct { float omega; // 基波角频率 float Ts; // 控制周期 float alpha; // 当前alpha分量 float beta; // 当前beta分量 } DSOGI_Params; void DSOGI_Calc(DSOGI_Params *p, float u_abc[3]) { // Clarke变换 float alpha = (2*u_abc[0] - u_abc[1] - u_abc[2])/3; // 正交积分器核心算法 static float qv_prev = 0, v_prev = 0; float k = 1.414; // 阻尼系数 float v = (alpha - p->omega*p->Ts*qv_prev) / (1 + p->omega*p->Ts*k); float qv = qv_prev + p->omega*p->Ts*(v - k*qv_prev); // 更新状态 p->alpha = v; p->beta = qv; qv_prev = qv; v_prev = v; }调试踩坑经验:
- 离散化时推荐用Tustin变换,比前向欧拉稳定
- 初始相位突变?加个软启动函数渐变omega值
- 内存记得用static修饰保持状态连续性
三、正负序双PI:不对称工况杀手锏
正负序独立控制的关键在于解耦运算,看这段骚操作:
typedef struct { float Kp_pos, Ki_pos; // 正序PI参数 float Kp_neg, Ki_neg; // 负序PI参数 float err_d_pos, err_q_pos; // 正序误差积分 float err_d_neg, err_q_neg; // 负序误差积分 } DualPI_Params; void DualPI_Calc(DualPI_Params *p, float d_pos, float q_pos, float d_neg, float q_neg) { // 正序轴计算 float out_d_pos = p->Kp_pos * d_pos + p->Ki_pos * p->err_d_pos; float out_q_pos = p->Kp_pos * q_pos + p->Ki_pos * p->err_q_pos; // 负序轴计算(注意符号!) float out_d_neg = p->Kp_neg * d_neg + p->Ki_neg * p->err_d_neg; float out_q_neg = -p->Kp_neg * q_neg - p->Ki_neg * p->err_q_neg; // 叠加输出 float vd = out_d_pos + out_d_neg; float vq = out_q_pos + out_q_neg; // 抗积分饱和 p->err_d_pos = __ssat(p->err_d_pos + d_pos, SAT_LIMIT); // ...其他轴同理 }参数整定口诀:
- 先调正序,再调负序
- 负序Ki值通常取正序的1/3
- 遇到振荡?加个低通滤波环节
四、中点平衡:硬件来carry
虽然代码不直接控制中点电压,但要给buck-boost电路发号施令:
// 硬件控制信号生成 void Balance_Control(float v_dc) { float mid_voltage = Get_AD_Value(ADC_CH_MID); // 读取中点电压 if(mid_voltage > VDC_REF * 1.05) { PWM_SetDuty(BUCK_CH, 0.7); // 启动buck放电 } else if(mid_voltage < VDC_REF * 0.95) { PWM_SetDuty(BOOST_CH, 0.3); // 启动boost充电 } }硬件搭档要点:
- 用SiC器件可提升响应速度
- 驱动电路加死区保护(血泪教训!)
- 采样频率至少是开关频率的2倍
五、仿真效果验证
!并网电流THD<1.5%
s-function(纯C代码),基于三相不平衡下的T型三电平并网控制,采用正负序双PI控制(s-function纯代码),DSOGI锁相环(s-function),SVPWM(mfunction),中点电位平衡采用的buck-boost模式硬件控制。 1.系统代码可代入DSP,ARM中使用 2.除调制方式外均采用c代码编写 3.中点电位平衡采用硬件控制模式 4.提供参考文献,仿真源文件 s-function是simulink中比较复杂的模块,需2018或以上版本,请注意。
(仿真波形示例:A相电压畸变下,并网电流仍保持完美正弦)
仿真资源包:
- 完整Simulink 2021a模型
- TMS320F28377D工程模板
- 测试用例集(含三相跌落、谐波注入等)
下载链接:https://github.com/PowerBoy/T-Type-NPC
经典参考文献:
- 《T型三电平逆变器中点电位平衡策略研究》-- 王院士
- IEEE Trans. On PE vol.32 No.5 "A Novel DSOGI-PLL"
- STM32H7逆变器应用笔记 AN5489
下次搞点更刺激的——弱电网下VSG控制,想看的评论区扣1!
