简介:一份面向电力电子与嵌入式控制开发者的完整工程资源,基于TMS320F280049C实现DQ解耦控制的单相PWM整流器。输入市电220V、输出800V可调,支持功率因数调节并能单位功率因数运行,覆盖从Simulink仿真验证到CCS工程落地的完整开发链路,适合从事并网变流器、PFC整流器方向的研究生和工程师借鉴。资源包共262个文件、约5.03MB,以C源文件与头文件为主体,辅以asm启动/中断代码、cmd链接脚本、lib库、makefile构建脚本、syscfg配置以及Simulink模型等,构成一套可直接在CCS中编译烧录的完整工程。项目采用TI SysConfig图形化工具配置外设,显著降低底层初始化门槛,便于快速上手实际开发。目前已有2218人浏览学习。获取后可对照Simulink模型理解DQ解耦与环路参数整定思路,也能在CCS工程中查看锁相环、电流内环、电压外环及ADC采样的具体实现,便于快速复现样机测试或进行控制算法二次开发。
1. 单相 PWM 整流器,难的不是整流而是解耦方向
做单相 PWM 整流器的人都有体会:仿真里波形漂亮得像教科书,一上板电流就歪、母线电压抖动、甚至直接炸管。为什么?因为单相系统没有天然的两相旋转坐标系,DQ 全靠人为构造,相位错了、解耦符号反了、启动限幅没做,波形当场翻车。这份基于 TMS320F280049C 的工程包把 Simulink 仿真和 CCS 工程成对给出,仿真里调好的 PI 参数和 SOGI-PLL 可以直接对着代码看实现,适合做数字电源、并网变换器、充电机前级的学生和工程师,尤其适合那些想把“仿真里能转”变成“板子上能跑”的人。
2. 单相 DQ 解耦控制的一纸蓝图:为什么构造正交轴,以及工程包的结构
2.1 单相没有 αβ,怎么硬造一个 DQ 出来
三相系统做 DQ 变换很自然,因为 Clarke 变换把 abc 三相投影到静止 αβ 轴,再通过 Park 变换得到旋转 dq 轴。单相系统只有一个交流电压、一个交流电流,本身没有两相,所以第一步不是控制,而是“构造”一个虚拟正交分量。
常见做法有三种,各有坑:
- T/4 延迟法:把当前采样值延时 1/4 个工频周期得到 β 轴分量。实现最简单,但电网频率波动时 1/4 周期不再是精确 90°,相位偏了,DQ 解耦的整个坐标系都是斜的,你会看到电流有功轴和无功轴互相串扰。适合固定频率的仿真,不适合并网点频率会跳的现实场合。
- 全通滤波器法:相位滞后 90°,但幅值平坦度一般,低频段有衰减,需要配合幅值补偿,调起来比较绕。
- SOGI(二阶广义积分器):这是目前单相 DQ 控制用得最多的做法。SOGI 对方波和谐波有一定抑制能力,在 50Hz 附近能精确构造正交分量,且输出幅值基本一致。F280049C 上有 100MHz 主频,跑一个 SOGI 加 Park 变换加两个 PI 环,中断里全部算完还有余量。
这个工程包里用的就是 SOGI 方案。SOGI 的传递函数结构上分成两个输出:一个带通特性跟踪输入信号,一个低通特性给出虚拟正交相。实际代码里只需要维护两个状态变量:
// SOGI 核心迭代,采样周期 Ts 内执行 float alpha = state_v_alpha + k * (v_in - state_v_alpha); float omega = w0 * Ts; state_v_beta += omega * (state_v_alpha + state_v_beta); state_v_alpha += omega * (v_in - state_v_beta);逻辑说明:SOGI 本质上是一个二阶振荡器,state_v_alpha跟踪输入,state_v_beta输出滞后 90° 的虚拟正交分量。k是阻尼因子,工程上取 1.414 附近,太小收敛慢,太大会把谐波放进来。
2.2 DQ 域数学模型,解耦项到底在解什么
单相全桥整流器交流侧简化模型是 L 串在电网和桥臂之间,忽略寄生电阻后写方程:
L * di/dt = e - ue是电网电压,u是桥臂输出电压(调制波),i是交流侧电流。把它变换到 dq 旋转坐标系后,会看到两个轴之间出现耦合项:
L * di_d/dt = e_d - u_d + ωL * i_q L * di_q/dt = e_q - u_q - ωL * i_d这里的ωL * i_q和ωL * i_d就是耦合项。如果不处理,电流环调 d 轴时会把扰动带到 q 轴,反之亦然。解耦的思路是把 PI 控制器输出当作“虚拟电压指令”,然后再加上补偿项,得到真正的桥臂调制电压:
u_d = e_d + ωL * i_q - PI_d_out u_q = e_q - ωL * i_d - PI_q_out注意符号!整流器模型里 e 在前、u 在后,所以u_d是电网电压前馈加上耦合补偿减去 PI 输出。照搬逆变器那套“PI 加耦合项”的符号过来,解耦会变成强耦合,电流直接发散。
整定 PI 时我用的是典型的零极点对消:
- 电流环带宽取 1kHz 左右,开环增益跨过 0dB 时保证 45° 以上相位裕度。
- 电感 L=3mH,寄生电阻 R=0.1Ω,取电流环闭环带宽 α_i = 2π×1000 rad/s,那么 Kp = L×α_i ≈ 18.8,Ki = Kp×R/L ≈ 628。这个参数先给初值,仿真里再按波形微调。
- 电压环带宽要明显低于电流环,一般取 1/10 到 1/20,否则母线电压会出现低频振荡。电压环比例系数按
Kp_v = Cdc × α_v / 2估算,α_v 取 2π×20。
2.3 工程包的组成,仿真和代码是怎么对应的
解压这份工程包后,你会看到三个层次:
| 模块 | 内容 | 对应关系 |
|---|---|---|
| Simulink 模型 | 主电路、控制回路、SOGI-PLL、PI 调节器 | 验证控制算法和整定参数 |
| CCS 工程 | ADC 采样、坐标变换、PI 控制、EPWM 输出 | 把验证好的算法映射到 F280049C |
| 说明文档 | 参数表、接线定义、示波器观察点 | 软硬件联调时的依据 |
结构清楚之后,你就知道该先看哪块了:先在 Simulink 里跑通带负载启动,再打开 CCS 工程对照中断服务函数看实现,看 ADC 采样的顺序和 PWM 载波周期是否同步。如果直接上手改代码,很容易在坐标变换方向这类细节上栽跟头。
3. Simulink 仿真复现:从模型搭建到参数整定
3.1 主电路与控制环路的对应关系
模型里主电路用的是单相全桥结构:交流电源经过电感和全桥整流后接到直流母线电容和负载电阻。控制回路是典型双环:
- 电压外环:采样直流母线电压,与给定值比较,PI 输出作为有功电流指令
Id_ref。 - 电流内环:采样交流电流,经过 SOGI-PLL 得到 dq 轴分量,与指令值比较,两个 PI 分别调节,然后做前馈和解耦。
- 调制环节:
u_d和u_q经过逆 Park 变换得到调制波,再转换为占空比送给 PWM 发生器。
仿真参数建议如下:
Vg_rms = 220; % 网压有效值 220V f_grid = 50; % 工频 50Hz Fs = 20e3; % 开关频率 20kHz L = 3e-3; % 交流侧电感 3mH R = 0.1; % 电感寄生电阻 Cdc = 3300e-6; % 直流母线电容 3300uF Vdc_ref = 400; % 母线电压给定 400V P_rated = 3000; % 额定功率 3kW参数说明:开关频率 20kHz 与 F280049C 上 EPWM 的设定一致,仿真步长建议设 1e-6 到 5e-6 秒,保证开关动作能被精确捕捉。电感 3mH 在 3kW 功率下,电流纹波大概在 15% 左右,这是常见取值。如果纹波太大,优先加大电感而不是提高开关频率,因为频率上升后开关损耗和 DSP 中断负担都会增加。
3.2 启动过程的斜坡给定与 PI 限幅
启动仿真最容易看到的现象是母线电压超调一大截,或者启动瞬间电流冲到额定值的五六倍。原因不复杂:电压环 PI 看到母线电压误差很大,直接输出一个饱和的电流指令,内环拼命追,电源侧电流就炸了。
处理办法有两个,工程里两个都要做:
- 电压给定用斜坡:
Vdc_ref从 0 逐步升到 400V,斜坡时间取 0.5s 到 1s。 - 电压环 PI 输出加限幅:
Id_ref_max限到额定电流峰值的 1.2 倍左右。
Simulink 里我一般把斜坡函数放在给定值环节,PI 调节器勾选抗饱和选项。这段直接决定你能不能在仿真里复现出“软启动”的波形。母线电容越大,启动电流越猛,限幅越要压得住。
3.3 三个必看波形:PLL 相位、dq 电流、母线电压
仿真跑起来后,不要急着看效率。先用 Scope 观察三个位置:
- PLL 输出的
θ与电网电压波形:θ 过零点应该与网压过零点对齐,如果错位,检查 SOGI 状态变量初始化。 - d 轴电流和 q 轴电流:稳态时
Id是平直的直流量,Iq在 0 附近小幅波动。如果Iq有周期性波动,说明解耦没做干净,通带内还有残余耦合。 - 母线电压:稳态应该稳定在 400V ± 2% 以内,负载切换时超调控制在 5% 以内。
这三个波形都对上了,再打开 CCS 工程,把同样的 PI 参数换算成定点或浮点格式。需要提醒的是,Simulink 模型的理想开关特性在实验里会遇到死区、采样延迟和 ADC 量化误差,所以仿真波形好只是第一步,不是终点。
4. CCS 移植与 F280049C 外设落地的常见坑与排查
4.1 中断优先级和 ADC 触发的顺序
F280049C 上跑这套控制,核心外设是 ADC、EPWM 和 CPU 中断。最常见的问题不是算法本身,而是采样时刻不对。
工程里通常用 EPWM 模块产生 SOC 触发信号启动 ADC 转换,ADC 转换完成后产生中断,进入控制算法。这个顺序保证了每个开关周期采样一次,采样点固定在载波顶点或谷底,避免开关动作噪声干扰采样值。
关键代码片段是这样的:
// EPWM1 配置为 up-down 计数,TBPRD 决定开关频率 EPwm1Regs.TBPRD = 2500; // 100MHz / 2 / 2500 = 20kHz EPwm1Regs.CMPA.bit.CMPA = 1250; // 初始占空比 50% // 在计数等于 0 时触发 ADC 采样 EPwm1Regs.ETSEL.bit.SOCASEL = 2; // 选择 TBCTR = 0 事件 EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能 SOCA 触发 EPwm1Regs.ETPS.bit.SOCAPRD = 1; // 每周期触发一次逻辑说明:F280049C 主频 100MHz,TBPRD=2500 时 PWM 频率正好是 20kHz。选择 TBCTR=0 触发 ADC,意味着在每个载波周期的起始点采样,此时开关器件处于固定状态,采样噪声最小。触发顺序若反了,采到的电流会带上明显的开关毛刺,d 轴电流里全是高频分量。
4.2 PI 抗饱和,代码里必须做的一件事
仿真里不写抗饱和,波形可能只是多几个振荡;板子上不写抗饱和,启动瞬间电流可能直接冲破限幅,轻则保护跳闸,重则炸模块。原因在于:电压环 PI 饱和后,积分项还在累积,母线电压还没到给定值,但积分项已经积到很大,等到电压接近给定值时,积分项仍需很长时间才能退出来,导致严重超调。
工程里我给电压环和电流环都加了一样的抗饱和结构:PI 输出限幅后,把限幅前后的差值按比例反馈回积分项。
// 电压环 PI 带抗饱和,Ts 为中断周期 float error = Vdc_ref - Vdc_measure; pi_v_out = pi_v.Kp * error + pi_v.Integral; // 限幅 float out_limited = fmaxf(-ID_MAX, fminf(ID_MAX, pi_v_out)); // 抗饱和:输出饱和时抑制积分继续增长 if (pi_v_out > ID_MAX || pi_v_out < -ID_MAX) { pi_v.Integral += pi_v.Ki * error * Ts - (1.0f / pi_v.Kt) * (pi_v_out - out_limited) * Ts; } else { pi_v.Integral += pi_v.Ki * error * Ts; }参数说明:Kt是抗饱和回退系数,取 1 到 5 之间,太小退积分太快会让 PI 失去积分作用,太大又等于没做抗饱和。我一般先取 2,然后观察母线电压超调量。
4.3 死区补偿:空载和轻载时的电流削平问题
单相全桥的死区时间如果设了 1.5us,在 20kHz 下占空比损失接近 3%——轻载时影响极其明显,电流过零点附近会被“削”成平顶,谐波变大,功率因数变差。这不是控制环的问题,而是 PWM 输出本身就带误差。
先做三步检查:
- 用示波器勾桥臂输出电压,看死区时间内管压降方向。
- 查看电流方向,根据电流极性对占空比做 ± 补偿。
- 补偿量从死区时间的一半开始加,逐步增加到全死区时间。
死区补偿的方向如果判断反了,波形会从“削平顶”变成“尖顶”,谐波更大。这是我反复踩过的坑,调试时先在开环下用手动占空比验证补偿方向,再闭合电流环。
4.4 坐标变换方向和符号错误的排查法
DQ 解耦这块最怕的不是参数不优,而是符号反了,现象表现为:仿真输出发散或电流畸变,但你盯着公式看半天觉得没问题。
我常用的排查方法是把解耦项人为置零,先做“无解耦运行”:
- 在代码里把
ωL*i_q和ωL*i_d两项注释掉。 - 只保留电网电压前馈,闭合电流环,此时 dq 轴之间会有耦合,但系统大概率还是稳定的。
- 如果这一步波形都不稳定,说明问题不在解耦,而在 Park 变换方向或者 PI 输出极性。
- 如果无解耦稳定但性能差,再逐步恢复解耦项,观察
Iq的波动是否减小。
每次只改一个变量,这是解决“方向玄学”最有效的办法。不要同时改符号、PI 参数和补偿量,否则出了问题根本定位不到是哪一步引入的。
5. 进阶验证:解耦是否干净,用两个小实验说话
把仿真跑通、代码烧进去之后,下一步不是直接做满载,而是先验证解耦到底做干净没有。这里分享两个我常用的验证方法,比看一堆波形靠谱得多。
第一个方法是 q 轴电流扰动法。令电压环保持闭合,让系统运行在额定功率的一半,然后手动给Iq_ref一个阶跃扰动,比如从 0 跳到 2A 保持 100ms 再跳回 0。观察 d 轴电流是否出现明显波动:
- 如果
Id基本不动,说明解耦项把交叉耦合压住了。 - 如果
Id跟着Iq一起跳,说明解耦补偿量不足或方向有偏差,先检查符号,再把补偿系数暂时调大 20% 观察趋势。趋势改善就继续调,恶化就说明方向反了。
这个干扰实验在 Simulink 里用 Step 模块直接加在Iq_ref上,在 CCS 里则改中断代码里Iq_ref的赋值位置。
第二个方法是主动阻尼验证。把母线电压从 400V 阶跃拉到 430V,观察电流内环的响应时间。一个调得好的电流环应该在 1ms 内稳住 d 轴电流,母线电压超调不超过半个 PI 调节周期。如果电流环响应有明显拖尾,优先怀疑积分限幅和抗饱和系数是否匹配。
硬件验证时,我的习惯是先把仿真里记录的Id、Iq、Ud、Uq四路信号通过 DAC 输出到示波器,和仿真波形叠加对比。注意 F280049C 的 DAC 输出要加一级运放缓冲,不然带不动示波器探头。波形形状一致、幅值误差在 5% 以内,说明控制环路是可信的,之后再查效率和谐波才有意义。
遇到解耦调不通的情况,不要一遍遍改 PI 参数碰运气,退一步从 PLL 相位开始查。用示波器同时勾网压和θ信号,确认锁相环没有锁错相位,再往下检查 Park 变换符号。我早期有两次“解耦合不上”,最后发现都是 SOGI-PLL 相位偏了 15°,电流内环指令在那个坐标系下本身就是歪的,后面自然全乱。
从那以后,我每拿到一套新的整流器工程,都会强制走一遍“看 PLL 相位、核对解耦符号、跑一次母线斜坡”三件套,仿真和台架都少熬夜。这套流程对于你手上这份 DQ 解耦工程同样适用,希望能帮到你。
本文还有配套的精品资源,点击获取