单相变流器不平衡DQ控制与正弦PWM仿真实现

发布时间:2026/8/27 21:54:18
单相变流器不平衡DQ控制与正弦PWM仿真实现 1. 项目概述与核心价值最近在做一个关于单相变流器功率因数校正的项目客户要求系统不仅能把交流电高效地转换成直流电还得保证从电网看进去电流和电压的波形是同相位的也就是所谓的“单位功率因数”运行。这听起来像是电力电子领域的经典课题但实际做起来尤其是在单相系统里实现类似三相系统那样优雅的d-q解耦控制还是有不少门道的。我这次选择的研究路径是“不平衡d-q控制在同步参考框架中实现”并用Simulink搭建了完整的仿真模型来验证。这个标题里的“UDQ正弦PWM”可能有点唬人其实拆开看“U”可以理解为“Unified”或者“Unbalanced”指的就是这种针对单相系统特殊构造的、非对称的d-q变换方法而“正弦PWM”则是我们最终控制开关管发出接近正弦波电流的手段。简单来说这个项目要解决的核心问题是如何让一个单相的电压源型逆变器VSI或者交直变流器在完成AC-DC或DC-AC能量转换的同时还能像一个纯电阻一样工作不从电网吸收或发出无功功率。这对于提升电网电能质量、降低线路损耗、满足并网标准至关重要。传统的双闭环PI控制虽然常用但在应对单相系统这种“先天不足”缺少一个自然正交的相量时显得有点笨拙。而不平衡d-q控制通过构造一个虚拟的正交分量巧妙地将单相问题映射到了我们熟悉的两相旋转坐标系d-q轴中从而可以借用三相系统中成熟的控制理论比如前馈解耦、电流内环快速跟踪等来实现高性能的控制。这次分享我会把自己从理论推导、Simulink建模到参数调试的完整过程梳理出来。你会看到如何从零开始搭建一个包含PWM生成、坐标变换、电流电压双闭环控制的完整模型并理解每一个模块背后的物理意义和数学原理。无论你是正在做相关课题的学生还是需要开发类似产品的工程师相信这些从仿真中踩过的“坑”和总结出的经验都能让你少走弯路。2. 核心控制原理从不平衡d-q变换到同步旋转坐标系要理解整个控制系统必须先从坐标变换这个“数学工具”说起。在三相系统中我们有天然的a, b, c三相通过Clark变换可以转换到静止的α-β两相坐标系再通过Park变换就能转到随电网电压同步旋转的d-q坐标系。在d-q坐标系下交流量变成了直流量用PI控制器就能实现无静差跟踪这是其核心优势。但单相系统只有一根火线和一根零线或另一根相位差180度的线我们只能测量到一个电流或电压信号。如何得到类似α-β那样正交的两相信号呢这就是“不平衡d-q”或者叫“单相d-q”变换的起点。2.1 构造虚拟正交分量的方法常见的方法有两种我都在仿真里试过最终选择了第二种因为它更易于数字化实现且动态性能更好。方法一基于Hilbert变换的90度移相器。理论上对一个正弦信号进行Hilbert变换可以得到其正交分量。在连续域这很完美。但在离散的数字化控制比如用DSP或单片机中实现一个精确的全通90度移相网络需要较高的阶数会引入不可忽略的相位延迟和计算负担影响系统带宽。在Simulink里你可以用Discrete Hilbert Transform模块来模拟但要注意它本质是一个FIR滤波器存在群延迟。方法二基于延时四分之一基波周期的T/4延时法。这是工程上更实用、也更直观的方法。假设电网基波频率是f如50Hz周期为T。如果我们测得的单相电流为iα(t)那么我们可以构造一个虚拟的β相电流iβ(t) iα(t - T/4)。对于正弦波而言延时四分之一周期正好产生90度的相位差。在50Hz系统中T/4就是5ms。注意这种方法在稳态正弦条件下是精确的。但在动态过程中特别是电流指令突变或电网电压畸变时这个构造的β分量会存在误差因为t时刻的iα和t-T/4时刻的iα并不严格满足当前时刻的正交关系。不过由于电流环带宽通常远高于基波频率这个误差在控制系统的调节能力范围内。在Simulink中我使用Discrete Delay模块来实现这个固定步长的延时。关键在于你的仿真步长和控制周期必须是T/4的整数分之一以确保延时点数的精确性。例如控制周期为100us10kHz那么延时点数应为 5ms / 100us 50个点。2.2 单相系统的Park变换与反变换一旦我们有了iα和iβ就可以像三相系统一样进行Park变换了。变换矩阵如下Park变换abc/αβ - dq[ id ] [ cosθ sinθ ] [ iα ] [ iq ] [ -sinθ cosθ ] [ iβ ]其中θ是同步旋转坐标系的相位角通常通过一个锁相环PLL从电网电压vα实测电压和vβ构造的虚拟电压中获取。反Park变换dq - αβ[ vα* ] [ cosθ -sinθ ] [ vd* ] [ vβ* ] [ sinθ cosθ ] [ vq* ]这里得到的vα*和vβ*是我们在α-β静止坐标系下的电压指令。注意对于单相系统我们最终只需要vα*来生成PWM波vβ*仅作为变换过程中的中间变量没有实际的物理输出端口与之对应。这就是“不平衡”或“非对称”的一个体现——我们用一个两维的控制器去驱动一个一维的被控对象。为什么选择d轴对齐电网电压矢量这是实现单位功率因数的关键。我们通常将旋转坐标系的d轴定向与电网电压矢量方向重合。这样电网电压在d-q坐标系下就表现为Vd Vm电压幅值Vq 0。根据瞬时功率理论在d-q坐标系下有功功率P正比于Vd*id Vq*iq由于Vq0所以P ∝ Vd*id无功功率Q正比于Vd*iq - Vq*id即Q ∝ Vd*iq。因此控制id就可以直接控制从电网吸收的有功功率进而控制直流母线电压。控制iq就可以直接控制无功功率。为了实现单位功率因数纯有功交换无功为零我们只需将iq的指令值iq_ref设为0。通过这种对齐方式我们将复杂的功率控制问题解耦成了两个独立的直流电流控制问题思路非常清晰。3. Simulink仿真模型搭建全解析理论明白了接下来就是动手搭建模型。我的仿真模型主要分为几个子系统主电路、信号检测与构造、锁相环PLL、电流内环控制器、电压外环控制器以及PWM生成。下面我逐一拆解。3.1 主电路与信号测量模块主电路很简单就是一个单相全桥逆变器或变流器通过一个LCL或LC滤波器接入电网。直流侧接一个电压源模拟光伏或电池或负载电阻模拟整流状态。我用的是Simulink的Simscape Electrical库里的Universal Bridge模块设置为Full-bridge (4 switches)开关器件选择IGBT/Diodes这样更贴近实际。关键参数设置直流母线电压Vdc需要高于电网电压峰值。对于220Vrms电网峰值约311VVdc通常设置在400V左右为调制波留出余量。滤波电感L取值很关键。太大则动态响应慢太小则电流纹波大开关损耗也高。一个经验公式是电感上的压降在额定电流时不超过额定电压的10%-20%。可以初步计算L (Vdc/2) / (ΔI * f_sw)其中ΔI是允许的电流纹波峰峰值f_sw是开关频率。我假设开关频率10kHz允许纹波20%额定电流假设10A则L ≈ (400/2) / (2*10*10000) 1mH。实际仿真中我用了2mH兼顾了滤波效果和响应速度。滤波电容CLCL滤波器时主要用于滤除开关频率次谐波。其阻抗在基波频率下应远大于电网侧阻抗以免吸收过多基波无功。通常按谐振频率f_res 1/(2π√(L*C))在开关频率的1/10到1/2之间来选取。我采用简单的L滤波器所以未加电容。测量方面需要测量电网电压、网侧电流和直流母线电压。电压电流测量模块后要接Continuous或Discrete的Mean Value模块来模拟传感器的低通滤波效应滤除开关噪声。3.2 信号构造与锁相环模块这是单相系统的特色模块。电网电压虚拟β分量构造将测量到的电网电压vα经过一个T/4 Delay模块得到vβ。这个vβ将和vα一起送入锁相环。单相锁相环我使用了基于同步参考系SRF的PLL。其原理是将vα和vβ进行Park变换到d-q坐标系初始相位角估计为0通过一个PI控制器调节旋转速度使得变换后的vq趋于0。当vq0时说明d轴已经对齐电压矢量。PI控制器的输出是角频率偏差加上额定角频率如314 rad/s for 50Hz积分后得到精确的相位角θ。Simulink中有PLL (3ph)模块但我们需要将其配置为单相输入。更直接的方法是自己用Math Operations搭建核心就是一个PI控制器调节vq至零。网侧电流虚拟β分量构造同样将测量到的网侧电流iα经过一个T/4 Delay模块得到iβ。实操心得T/4 Delay模块的初始条件Initial condition要设好。仿真开始时延迟缓冲区里没有数据输出为初始值。如果设为0在启动瞬间会构造出一个错误的β分量导致PLL或电流环紊乱。我的做法是在仿真最初的一个T/4周期内让系统先不启用基于d-q的控制而是采用一个软启动或开环预充电过程等延迟缓冲区被真实数据填满后再切换闭环。或者更简单粗暴一点将初始条件设置为一个接近稳态值的估计值可以减少启动冲击。3.3 双闭环控制器设计控制器的核心是电流内环和电压外环。3.3.1 电流内环d轴和q轴电流内环负责快速、准确地跟踪指令。我们将iα和iβ通过Park变换得到实际的id,iq。指令值id_ref来自电压外环iq_ref设为0单位功率因数。电流环的控制器通常用PI。其输出是d-q坐标系下的电压指令vd*和vq*。但这里有一个关键步骤前馈解耦。观察主电路的电压方程在同步旋转坐标系下vd* (R sL) * id - ωL * iq Vd vq* (R sL) * iq ωL * id Vq其中Vd和Vq是电网电压在d-q轴的分量我们已使Vq0。-ωL * iq和ωL * id是耦合项。为了将d轴和q轴电流控制解耦成两个独立的单输入单输出系统我们在PI控制器输出的基础上加上这些耦合项和电网电压前馈项vd_pi_out PI_id(id_ref - id) vq_pi_out PI_iq(iq_ref - iq) vd* vd_pi_out - ωL * iq Vd vq* vq_pi_out ωL * id Vq (Vq0)这样vd*就只与id有关vq*只与iq有关大大简化了控制器设计。在Simulink中需要实时计算ωL * id和ωL * iqω来自PLL输出。然后将它们作为前馈量加入。PI参数整定电流环需要高带宽。通常按典型I型系统或II型系统整定。一个工程化的方法是忽略反电势前馈补偿掉了将对象近似为1/(LsR)。采用PI控制器Kp Ki/s闭环传递函数是二阶的。可以按“模最优”或“对称最优”整定或者更简单地先设Ki R/L * Kp以抵消对象极点然后将系统简化为Kp/(Ls)再根据期望的带宽f_bandwidth来定KpKp 2π * f_bandwidth * L。例如期望带宽500HzL2mH则Kp ≈ 6.28。Ki可以取Kp * R/L若R很小如0.1Ω则Ki也很大实际仿真时可以适当降低Ki以避免积分饱和先调Kp保证响应速度再调Ki消除静差。3.3.2 电压外环直流母线电压控制电压外环是功率平衡环。直流母线电容上的电压反映了有功功率的收支情况。其指令Vdc_ref是给定的如400V。外环PI控制器的输入是电压误差输出就是id_ref即需要从电网吸收的有功电流指令。物理意义直流母线电压低了说明负载消耗功率大于电网输入功率需要增大id_ref从电网吸收更多有功电压高了则减小id_ref。PI参数整定电压环响应应比电流环慢一个数量级以保证稳定性。对象可以近似为一个积分环节1/(C*s)从有功功率到直流电压。整定方法类似但带宽要低得多比如10-20Hz。可以先设一个较小的Kp慢慢增加直到电压能跟上指令但又不产生太大超调然后加入Ki来消除稳态误差。注意事项电压外环的输出id_ref必须进行限幅限幅值由变流器的最大允许电流和电网容量决定。同时启动时直流母线电压需要从0软启动到目标值避免初始电流冲击。我通常在Vdc_ref信号后加一个Ramp模块让其缓慢上升。3.4 PWM生成与调制波处理经过前馈解耦计算出的vd*和vq*需要通过反Park变换得到静止坐标系下的vα*。如前所述我们只取vα*作为调制波。正弦PWMSPWM实现标幺化调制波vα*需要除以(Vdc/2)进行标幺化将其范围归一化到[-1, 1]之间以适应PWM发生模块。与三角载波比较Simulink中可以使用PWM Generator (2-level)模块选择单相全桥模式。将标幺化后的调制波输入设置好开关频率如10kHz模块会自动生成四路驱动脉冲给全桥的四个开关管。死区时间设置极其重要实际硬件中同一桥臂的上下两个开关管不能同时导通否则会直通短路烧毁器件。必须在互补的驱动信号中加入死区时间Dead Time即一个管子关断后延迟一段时间再开通另一个管子。在Simulink的PWM发生器模块中可以设置死区时间典型值1-3us。即使仿真也建议加上以观察其对波形的影响。4. 仿真调试与关键问题排查实录模型搭好了一运行结果往往不是教科书上的完美波形。下面是我在调试中遇到的几个典型问题及解决方法。4.1 问题一启动瞬间电流冲击过大甚至仿真报错现象仿真开始后网侧电流瞬间冲到几百安培直流电压震荡剧烈有时导致代数环错误或仿真中断。原因分析控制器初始状态不匹配仿真开始时PI控制器的积分器初始为0但主电路电容电压为0电网电压处于某个相位导致巨大的误差瞬间积分输出饱和。T/4 Delay模块初始数据无效如前所述导致构造的β分量错误。没有软启动直流电压指令Vdc_ref直接阶跃给定电压外环输出巨大的id_ref。解决方案分阶段启动将仿真分为两个阶段。前0.1秒几个工频周期让系统开环运行。可以给一个很小的固定调制比让直流母线电压慢慢建立起来同时T/4 Delay模块缓冲区被填充。使用Simulink的Manual Switch或Multiport Switch在0.1秒后切换到闭环控制。电压外环软启动Vdc_ref通过一个Ramp模块缓慢上升比如在0.2秒内从0上升到400V。设置PI控制器抗饱和Anti-windupSimulink的PID Controller模块可以勾选Anti-windup并选择back-calculation方法限制积分器的累积。合理设置初始值给直流母线电容一个初始电压如300V给PI控制器的积分器一个接近稳态的初始值。4.2 问题二稳态运行时电流波形存在畸变或相位偏差现象系统稳定后网侧电流虽然是正弦波但总谐波畸变率THD较高或者与电网电压的相位不完全同相功率因数不是1。原因分析PLL精度不够锁相环动态响应慢或者在电网电压畸变时锁相不准导致提取的相位角θ有误差。θ的误差会直接导致Park变换和反变换出错造成控制偏差。前馈解耦不准确公式中的电感L值与实际参数有偏差或者电网电压前馈Vd测量不准。电流采样或PWM延迟未补偿从电流采样、计算到PWM更新存在一个控制周期如100us的延迟。这个延迟在高带宽的电流环中会引入相位滞后影响性能。解决方案优化PLL参数适当提高PLL中PI控制器的带宽但过高会引入噪声。可以尝试在PLL前对vα和vβ进行低通滤波滤除高频噪声。检查T/4 Delay是否精确对于50Hz延时必须是5ms整。参数辨识与自适应如果条件允许可以在控制中加入在线参数辨识实时更新L和R的值用于前馈计算。至少要用实际测量或估算的电感值。加入延迟补偿一种常见的补偿方法是在计算出的调制波vα*上乘以一个超前补偿因子e^(s*Td)其中Td是总延迟时间通常取1.5个控制周期。在离散域这可以近似为在调制波上增加一个与微分项相关的补偿。更简单的方法是在电流采样后用预测观测器如龙伯格观测器预测下一个周期的电流值用预测值进行控制。4.3 问题三直流母线电压存在二倍频纹波现象直流母线电压在稳态值附近以二倍电网频率100Hz周期性波动。原因分析这是单相系统的固有特性。瞬时输入功率是脉动的p(t)v(t)*i(t)单相正弦电压电流相乘结果包含一个直流分量和一个二倍频交流分量而输出功率假设是平稳的带阻性负载这个功率不平衡就会导致直流侧电容反复充放电产生二倍频电压纹波。解决方案增大直流侧电容这是最直接有效的方法。电容越大储存能量越多对功率波动的平滑作用越强。可以根据允许的电压纹波ΔV来计算所需电容C ≈ P / (ω * Vdc * ΔV)其中P是额定功率ω是二倍频角频率2π*100。但电容体积和成本会上升。在电压外环引入陷波器在电压外环的反馈通道或误差通道加入一个中心频率为100Hz的陷波器Notch Filter可以抑制该频率的纹波对控制器的影响避免控制器对100Hz纹波产生响应而加剧电流畸变。Simulink中有Notch Filter模块。在id_ref指令中注入二倍频分量这是一种有源抑制方法。通过检测直流电压的二倍频分量经过一个谐振控制器生成一个二倍频的id补偿指令使其产生的有功功率脉动正好抵消固有的功率脉动。这需要增加一个额外的控制环路设计更复杂。4.4 仿真性能与代码生成考量当模型调试稳定后你可能还想做两件事提高仿真速度或者生成C代码部署到硬件。提高仿真速度将模型中所有连续模块如Transfer Fcn,Integrator替换为离散模块Discrete Transfer Fcn,Discrete Integrator。使用Fixed-step求解器步长与你的控制周期一致如100us。对于功率电路部分如果不需要观察开关细节可以使用Averaged Model平均模型代替详细的开关模型。Universal Bridge模块可以设置为Switching devices或Switching function后者就是平均模型仿真速度会快很多。合理设置仿真Stop Time只仿真需要观察的动态过程。Simulink C代码生成 这是将算法部署到DSP如TI C2000的关键步骤。数据类型固定在Model Settings-Hardware Implementation中将Device type选为你的目标芯片。在Code Generation-Interface中取消MAT-file logging等选项以减少生成代码量。最重要的是在Simulink根目录的Model Settings-Optimization-Signals and Parameters下将默认数据类型设置为single单精度浮点。大部分电机控制DSP支持单精度浮点运算这能在保证精度的同时提高计算速度、减少内存占用。子系统封装与接口定义将整个控制算法从AD采样输入到PWM占空比输出封装成一个Subsystem。为该子系统定义清晰的输入/输出端口并设置好端口的数据类型uint16_tfor ADC,float32_tfor internal signals等。配置代码生成使用Embedded Coder工具。为模型配置一个System Target File例如ert.tlcEmbedded Real-Time。在Code Generation面板进行详细设置比如是否生成可重入代码、内存分配方式等。处理T/4 Delay离散延时模块在代码中会生成一个数组作为缓冲区。要确保这个数组的大小延时点数是固定的并且初始化正确。检查生成的代码看延时缓冲区的管理是否高效。外设驱动集成生成的代码只包含控制算法。你需要手动编写或配置ADC采样、PWM输出、GPIO控制等外设驱动代码并将算法代码集成进去。Simulink Coder可以生成与这些外设驱动对接的接口函数。5. 从仿真到实践的延伸思考仿真通过波形完美THD低于5%功率因数接近1这只是一个理想的开始。真正要把这套算法烧录进芯片驱动实际的IGBT和电感还需要跨越巨大的鸿沟。首先是采样和计算的实时性。仿真里我们可以轻松地在每个仿真步长完成所有变换、PI运算和前馈计算。但在实际的DSP中必须在中断服务程序通常由PWM定时器下溢触发规定的几十微秒内完成所有任务。这意味着代码需要高度优化使用查表法代替实时计算sin/cos将矩阵运算展开为标量运算合理使用DSP的硬件加速单元如TI C2000的TMU、FPU。其次是抗干扰和鲁棒性。仿真中的电网是理想正弦波实际电网含有谐波、电压跌落和闪变。仿真中的电感值是恒定的实际电感会饱和参数会随温度漂移。这就需要我们的控制器有更强的鲁棒性。可以考虑将传统的PI控制器升级为比例谐振PR控制器它在基波频率处具有无穷大增益能实现对正弦指令的无静差跟踪同时对电网谐波干扰有更好的抑制能力。或者引入自适应控制或滑模变结构控制来应对参数变化。最后是保护逻辑。仿真可以忽略硬件上必须严防死守过流保护、过压保护、欠压保护、IGBT驱动故障保护、散热保护等等。这些保护环路的响应速度必须远快于控制环路通常由硬件比较器或FPGA来实现软件层面也要做快速中断响应。搭建这个Simulink模型的过程就像在虚拟世界里建造并调试一台精密的机器。每一个模块的参数每一次波形的异常都加深了对单相功率因数校正本质的理解。不平衡d-q变换巧妙地将单相问题纳入了三相的分析框架而前馈解耦则让复杂的多变量控制变得清晰直观。仿真最大的价值不在于得到一幅漂亮的波形图而在于让你能够安全、低成本地验证想法暴露问题并深刻理解每一个控制量之间的动态关系。当你最后看到网侧电流完美地“贴”着电网电压直流电压稳稳地锁定在设定值那种感觉就像解出了一道复杂的数学题所有的变量都找到了它们该在的位置。