ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于STM32F407的单相DQ锁相环与交流电子负载实现

基于STM32F407的单相DQ锁相环与交流电子负载实现 简介面向2022年电赛A题的单相交流电子负载场景这份工程以STM32F407VET6单片机为载体借助STM32CubeMX完成底层初始化提供一套单相DQ锁相环参考实现重点解决单相PWM整流或逆变器并网时的相位跟踪问题适合电赛备赛者、电力电子专业学生以及需要移植锁相算法的嵌入式开发者。压缩包共一百九十一个文件大小约九点一兆包含C语言源码、头文件、CubeMX工程配置、编译生成的中间文件与固件、工程配置文件及少量说明文档方便直接打开工程阅读也可以重新编译验证。目前已有八千一百四十四人学习下载验证了其实用性。工程核心逻辑集中在主程序文件中通过交流电压实时采样在二十千赫中断回调里完成单相锁相默认锁相频率限制在四十五到五十五赫兹之间可根据需求自行调整。采样既支持定时器触发也支持软件触发整体参考三相锁相原理进行单相适配便于快速迁移到其他系列单片机。 2022年电赛A题的单相交流电子负载几乎所有做电源方向的队伍都会在同一个地方栽跟头题目说白了就是模拟电阻、恒流、恒压、恒功率外加功率因数可调但落到实际电路上就变成了单相PWM整流器的电流控制问题再往下钻最劝退的就是那颗基于STM32F407VET6的单相DQ锁相环。为什么这么说因为三相系统拿三个相电压做Clark变换就能得到αβ两相单相只有一根火线一根零线没有天然正交信号必须自己造一个虚拟β轴出来这一造锁相环的稳定性和动态响应就全看它了。这篇文章把我做这个题时的完整思路整理出来从锁相环原理、STM32F407VET6外设用法到四种负载模拟策略和实测踩坑过程给准备复现的读者一条能直接走通的路。1. 先搞懂单相交流电子负载在考什么PWM整流与能量回馈的本质交流电子负载并不是电阻箱整流桥这么简单。早期方案确实有人用可调功率电阻直接吸收交流功率或者用不控整流桥把交流转成直流后再接一个直流电子负载。这类方案的局限性非常明显电流波形由电网电压和电阻决定完全不可控只能模拟纯电阻且功率因数为1既模拟不了感性/容性负载也实现不了功率因数可调更谈不上能量回馈。2022年电赛A题要求模拟电阻、恒流、恒压、恒功率还要求功率因数可调这些指标全部指向同一件事必须主动控制交流侧的电流波形。也就是说你要让输入电流的幅值、相位、波形都由自己的控制环路决定而不是让电网电压说了算。能实现这一点的拓扑就是单相PWM整流器也就是一个由四个开关管组成的H桥交流侧串入滤波电感L直流侧挂母线电容C。从功率流向看PWM整流器是个四象限变换器。它既能工作在整流状态把交流电的能量送到直流侧也能通过改变交流侧电压的相位让能量从直流侧倒灌回电网。电子负载正常工作的时候能量从电网流入装置直流母线电压会有抬升趋势所以直流侧必须把能量处理掉要么接耗散电阻把能量变成热量要么再接一级回馈逆变器把能量重新送回电网。实际竞赛中两种方案都有人用回馈方案效率高但控制复杂度翻倍电阻耗散方案简单可靠。不管哪种电网侧的PWM整流前级都是绕不开的因为负载模拟质量完全由前级电流环决定。整个控制架构大致是锁相环先跟踪电网电压的相位上层根据负载模式算出电流指令电流环跟踪这个指令最终通过PWM占空比调节H桥交流侧电压。锁相环一旦锁错相后面全错锁相环动态慢恒功率负载模式就会抖动。所以我个人认为A题拿高分的核心不在拓扑而在锁相环和电流环这两层控制上。2. 单相DQ锁相环没有天然αβ两相怎么锁出电网相位2.1 为什么单相系统不能直接做DQ变换三相DQ锁相环的思路很简单三相电压经过Clark变换得到αβ静止坐标系的vα、vβ再做Park变换得到旋转坐标系下的vq、vd用PI把vq压到0就锁住了相位。这套流程在单相系统里直接卡在第一步Clark变换需要两个正交分量电网电压采样只有一个值没有第二个正交分量。解决思路是造一个虚拟β轴。电网电压是单一频率正弦量延迟四分之一周期就能得到一个正交信号这是最朴素的方法但电网频率波动时延时的角度会偏锁相精度直接受影响。Hilbert变换理论上能精确移相90°但FIR实现阶数高、计算量大在20kHz中断里跑不划算。工程上最常用的是二阶广义积分器SOGI它不仅能生成两个正交信号还自带带通滤波特性对采样噪声和低次谐波有一定抑制能力。2.2 SOGI正交信号发生器β轴怎么构造SOGI的连续域模型用下面这组状态方程来描述dx1/dt -k·ω·x1 - ω·x2 k·ω·v_g dx2/dt ω·x1其中v_g是电网电压采样值k是阻尼系数ω这里是谐振角频率。两个输出为x1与输入同相的α轴分量和x2滞后90°的β轴分量。对输入v_g求传递函数可以得到vα(s)/v_g(s) k·ω·s / (s² k·ω·s ω²) vβ(s)/v_g(s) k·ω² / (s² k·ω·s ω²)把sjω代进去很容易验证在输入频率等于谐振频率ω时vα幅值为输入幅值且相位为0vβ幅值也为输入幅值但相位滞后90°两个输出完美正交且幅值一致。k的取值决定带宽k越小滤波效果越好但动态响应越慢k越大响应越快但抗谐波能力变差。我用的k1.414也就是阻尼比0.707的临界阻尼状态超调小、收敛快配合锁相环使用体验最好。离散化我直接用前向欧拉20kHz控制频率下半个工频周期就有200个采样点前向欧拉的截断误差完全可以接受。每个中断周期里执行// vg: 电压采样值w: 锁相环输出的角频率x1,x2: SOGI状态量 float e vg - x2; x1 Ts * (-K * w * x1 - w * x2 K * w * vg); x2 Ts * ( w * x1); vAlpha x1; vBeta x2;注意SOGI的ω不能写死成2π×50必须由锁相环PI输出实时更新。因为锁相环工作的本质就是让SOGI谐振频率跟着实际电网频率走形成一个自适应正交系统。这一点是很多队伍抄代码时容易忽略的写死ω会导致电网频率稍有偏移dq轴上就出现明显的100Hz纹波。2.3 从Park变换到PI闭环锁相公式与前馈量有了vα和vβ就能做单相Park变换了角度用锁相环自身的估计角θ_hatvd vAlpha·cosθ_hat vBeta·sinθ_hat vq -vAlpha·sinθ_hat vBeta·cosθ_hat假设真实相位是θ输入电压幅值是V那么vqV·sin(θ-θ_hat)。当估计角接近真实角时sin(θ-θ_hat)≈θ-θ_hatvq就等价于相位误差信号。把vq丢给PI调节器PI输出的是角频率修正量Δω再加上50Hz对应的2π×50前馈ω0积分后得到θ_hat这就构成了完整的闭环锁相。闭环从θ误差到vq的传递函数近似为V·(kpki/s)/s设计成典型二阶系统时PI参数可以按下面关系给kp 2·ζ·ωn / Vn ki ωn² / Vn这里Vn是标幺化后的电压幅值建议把ADC采样电压在程序里统一标幺成1.0额定幅值这样PI参数不再受输入电压变化影响。锁相环带宽ωn我取2π×20约125.6rad/s阻尼比ζ取0.707算出来kp≈177ki≈15791。再给PI输出做限幅把锁相频率限制在45Hz到55Hz之间防止启动时频率乱飞。2.4 单相DQ锁相环相对过零锁相的优势过零检测法虽然简单每个工频周期只有两次过零更新相位且过零点容易受谐波和毛刺干扰动态性能很差。DQ锁相环每个采样周期都在更新相位电网电压突然变化时能在一两个周期内重新锁定。对电赛这种要求在纯阻、恒流、恒功率之间快速切换的场景只有DQ锁相环跟得上。它还天然为后面DQ电流环准备好了角度和正交分量一套SOGI两处复用性价比很高。3. STM32F407VET6软硬件落地同步采样、定时器PWM与控制中断排布3.1 为什么选STM32F407VET6STM32F407VET6是LQFP100封装168MHz主频Cortex-M4内核带单精度硬件FPU和DSP指令集。对20kHz控制频率的数字电源来说这个性能绰绰有余电流环、SOGI、锁相环、负载模式计算全部放进中断也才占用不到三分之一CPU时间。它内置的TIM1和TIM8能输出带死区的互补PWM正好驱动H桥上下桥臂12位ADC配合DMA可以在PWM载波中心自动触发采样。顺带说一句很多人搜STM32F407VET6集成PHY吗VET6不带以太网PHY不过做电源控制完全用不到以太网与其纠结这个不如把TIM1的配置吃透。3.2 主电路与传感器选型我的H桥用的是四颗60V/30A的N沟道MOSFET交流侧电感L取2.2mH直流母线电容用了两个470μF电解电容并联。输入电压范围按赛题给的十几伏到三十伏有效值设计直流母线电压稳定在60V左右。电压采样用差分放大电路将电网电压调理到ADC量程内电流采样用霍尔电流传感器量程选±5A输出信号再经过一级运放偏置到0到3.3V。选这些参数有个粗略依据单极性调制下电感电流纹波ΔI≈Vdc/(8·L·fsw)母线电压60V、开关频率20kHz、电感2.2mH时ΔI≈60/(8×0.0022×20000)≈0.17A相对额定电流来说很小电流波形毛刺不会太大。3.3 ADC采样时刻为什么必须和PWM载波对齐这是整个外设配置里最关键的细节。PWM整流器的电感电流天然带有开关频率纹波如果ADC采样点落在开关动作瞬间附近采到的电流可能是纹波尖峰电流环看到的就是一堆毛刺轻则波形不干净重则环路不稳定。正确做法是用中心对齐PWM模式并在计数器计数到0或周期值ARR时触发ADC采样。中心对齐模式下开关管在载波顶点和谷底切换而PWM周期中间时刻电感电流正好等于平均值这个点采样能天然滤除开关纹波。配置上让TIM1的TRGO事件触发ADC1规则组扫描采样电网电压、电感电流、母线电容电压三路DMA自动搬运到内存数组全程不占用CPU。3.4 TIM1互补PWM与死区配置TIM1的ARR设成168MHz/(2×20kHz)-14199选择中心对齐模式1输出四路PWMCH1/CH1N和CH2/CH2N分别驱动H桥两个桥臂。死区时间用BDTR寄存器设置我按MOSFET栅极驱动芯片的关断延迟留了0.8μs。死区太小会在上下管切换时直通炸管死区太大则会造成电流波形底部失真这个值需要在示波器上实际确认。控制中断采用TIM1更新中断频率20kHz。中断里依次执行读DMA采样值并标幺化、更新SOGI、更新PLL、根据负载模式计算电流指令、执行DQ电流环PI、把输出反变换到静止坐标系生成调制波、更新TIM1的比较寄存器CCR1和CCR2。整个中断实测运行时间大约15μs远小于50μs的周期还有余量做保护逻辑和通信。4. 四种负载模式与PF可调从电流指令生成到双环控制4.1 四种负载模式的电流指令生成电阻模式最简单也最优雅直接用瞬时电压除以设定电阻i_refv_g/R。这个指令天生与电压同相没有外环延迟动态响应最快上电第一件事就该验证这个模式。恒功率模式用功率方程反推i_ref2·P·v_g/V_peak²V_peak是电网电压幅值估计。注意这里用的是瞬时电压的比例关系不是用正弦指令乘以幅值好处是电压波形畸变时电流也跟着畸变平均功率更准确。V_peak可以用PLL输出的vd幅值也可以用移动窗口的有效值计算。恒流模式直接用i_ref√2·I_rms·sinθθ来自锁相环保证电流和电压严格同频同相。功率因数可调的实现就是在相位上偏移i_ref√2·I_rms·sin(θ-φ)φarccos(PF)。PF0.5滞后时φ60°电流滞后电压60°等效模拟的是阻感性负载。4.2 DQ旋转坐标系下的电流内环与前馈既然已经有了SOGI和锁相角电流环直接在DQ坐标系做。电感电流采样值经过同样的SOGI得到iα、iβ再Park变换成id、iq这样正弦交流量就变成了直流量用两个PI就可以做到无静差跟踪。d轴电流代表有功分量q轴代表无功分量控制目标分别就是电流与电压同频同相和相位偏移角度。被控对象是电感L传递函数近似为1/(Ls)电流环PI参数按期望带宽ωc设计kpL·ωcki可以留一个小值消除静差。开关频率20kHz时电流环带宽取2kHz左右对应的ωc≈12566rad/sL2.2mH时kp≈27.6。这个公式给的是参考起点实际调试还要根据阶跃响应微调。调制波计算时一定要加电网电压前馈u_ab_refu_gPI_out也就是在电流环PI输出上叠加电网电压瞬时值。不加前馈的后果是电流在电压过零点附近会明显畸变波形呈平顶状加了前馈后正弦度立刻改善。这个细节在仿真里看不出来实测差异很大。4.3 启动流程与保护逻辑控制器上电后的顺序很重要。先只跑SOGI和PLL同时通过预充电继电器给母线电容充电等锁相标志位置位持续50个周期vq小于阈值后再使能电流环。电流指令不能直接给定阶跃要加斜坡或软启动否则启动瞬间电流冲击会触发过流保护。保护逻辑分两层软件上每周期检查直流母线电压是否超过70V、电感电流绝对值是否超过5A超了就立刻封锁PWM并把故障锁存硬件上还要有一路比较器直接接到定时器刹车输入BKIN一旦过流立即关断PWM比软件快一个数量级。竞赛现场演示时观众最常问的就是你怎么保证不炸管子这两层保护就是答案。5. 实测排错记录锁相方向、母线失控与参数整定的真实过程5.1 锁相环把因果锁反了第一次上电实测电流波形和电压波形完全反相电子负载像变成了电源能量从装置倒灌回电网母线电压短时间飙升。排查过程先看PLL输出角度每周期应该从0到2π线性增长结果增长方向正确但初始相位偏了π再看vq发现vq收敛到0但锁的是负峰值。原因在于SOGI的αβ输出接反了或者Park变换公式符号取反导致锁相环锁到了电压负半周的相位。解决方法是把vα、vβ的接线映射检查一遍在程序里打印vq和vd的稳态值。正常锁定时vd应为正幅值、vq≈0。如果vd为负说明锁相角实际落后于真实相位π把Park变换里的vα或vβ取反即可。当时花了两个小时才定位到这个低级错误教训就是调试PLL时永远先看vd的正负再看vq是否收敛。5.2 采样点不对齐导致的电流毛刺另一个高频问题电流波形整体正弦但每条正弦曲线上都叠加了一团一团的高频毛刺电流环稍微加增益就啸叫。用示波器对比ADC采样值和外部仪表值后确认是ADC触发时刻在PWM周期的上升沿附近正好采到了开关关断瞬间的振铃。修正方法就是把ADC触发从更新事件改到计数器计数到0事件同时检查PWM输出极性确保采样点避开死区换向时刻。调整之后毛刺几乎消失电流波形干净程度肉眼可见提升。数字电源的电流波形好不好看一半取决于环路另一半取决于采样时刻这句话一点不夸张。5.3 SOGI频率失配造成的dq纹波锁相环能锁定但dq轴上的vd总有100Hz纹波锁相角也有微弱抖动导致恒功率模式下输出功率小幅波动。一开始怀疑母线电容不够加大电容后纹波依旧。后来用串口把SOGI的x1和x2实时发出来看发现x2幅值比x1小约5%且相位差不完全等于90°。问题出在SOGI的ω初始值写死为2π×50而实际电网频率只有49.8Hz。虽然PLL最终会收敛但SOGI作为PLL的眼睛如果它自己频率不对锁相角就会带纹波。修复方法是让SOGI的ω直接用PLL的PI输出加前馈后的角频率频率闭环建立后纹波消失。此后我所有的单相锁相方案都坚持让SOGI与PLL频率完全互联绝不写死。5.4 母线电压失控与启动冲击回馈型方案调试时还遇到过母线电压失控。现象是直流侧电压从60V一路涨到80V触发软件过压保护。根因是启动时序问题PWM整流器使能后直流侧回馈级还没启动母线能量只进不出当然会涨。解决方法是启动回馈级并让母线电压环参与控制母线电压超过设定值时回馈级自动加大回馈功率把电压压回来。如果采用电阻耗散方案要注意耗散电阻的功率裕量。当时用的100Ω/100W电阻60V母线电压时耗散功率约36W连续运行半小时电阻表面温度就能到80℃加了风扇才稳住。5.5 一套能复现的调参顺序最后给一套我验证过多次的调参顺序。第一步断开电流环只跑SOGI和PLL观察vd为正、vq收敛到0、θ线性增长用信号发生器把输入频率从49Hz扫到51Hz确认锁相环能跟频。第二步单独给id一个阶跃指令调电流环kp、ki让电流上升时间在1ms到2ms之间且无超调这个阶段先不给iq指令。第三步接入电阻模式验证PF1电流波形接近正弦。第四步验证恒功率和PF可调通过外层功率环或相位偏移指令观察动态响应。最后再做启动冲击测试和保护测试。每一步都需要用示波器和串口把关键变量拉出来看不要盲目相信一次上电就成功。PWM整流器的控制链路长变量多分步验证能省下大量排查时间。做完整套项目后我的体会是单相DQ锁相环并不比三相版本难多少难的是第一次面对没有β轴这个反直觉的问题时能不能静下心把SOGI的传递函数推一遍。建议复现这个题的读者先把SOGI和PLL的数学模型在电脑上仿真跑通再碰STM32F407VET6的寄存器。另外示波器一定要有两通道以上同时看电网电压和电感电流所有波形问题一眼就能分辨是相位问题、采样问题还是环路震荡问题。本文还有配套的精品资源点击获取
返回列表