简介面向2022年电赛A题参赛者围绕单相交流电子负载与单相PWM整流器中的电网同步需求给出基于STM32F407VET6的单相DQ锁相环工程实现。工程由STM32CubeMX生成初始化代码核心算法参考三相DQ锁相原理改写主要程序集中在main.c中便于移植到其他系列单片机。实现中定时器触发ADC采样交流电压在中断回调内执行DQ锁相中断与采样频率均为20kHz锁相范围默认4555Hz可按需调整。压缩包共191个文件涵盖C源码、头文件、CubeMX配置.ioc、编译产物hex/axf及说明文档整体约9.1MB结构清晰便于查阅已有8155人学习。读者可获得完整单相DQ锁相实现思路、ADC触发与中断采样配置方法以及整流/逆变器控制环路的基础代码框架适合快速搭建赛题方案。1. 2022年电赛A题里的单相交流电子负载为什么它的核心是单相PWM整流和DQ锁相环2022年电赛A题的单相交流电子负载表面上要做的只是一件事让被测交流电源“以为”自己接了一个可编程的电阻、电感或电容。可一旦真的动手搭板子就会发现普通电阻负载和电子负载之间隔着一条深沟——电子负载要把输入电流的幅值和相位都控制住而这恰好是单相PWM整流器的看家本领。换句话说这道题考的不是电源能带多大功率而是你能不能把一个50Hz正弦电流“合成”出来并且让它和电网电压保持精确的相位关系。而“精确相位”正是整套系统里最容易被低估的一环。三相系统可以直接做Clarke变换进dq坐标系单相系统只有一个交流量没有天然的正交分量于是就有了单相DQ锁相环用SOGI这类虚拟正交发生器先把电压拆成alpha和beta两路再做Park变换、用PI把q轴电压压到零。当你真正看懂这条链路会明白为什么过零检测锁相在这种场景下“能跑但不好用”也会明白电流环在dq坐标系里为什么比在静止坐标系里好调那么多。这篇文章就从整流桥的数学模型出发一直拆到STM32F407VET6上的中断实现和调试踩坑把单相电子负载的底层逻辑讲透。2. 单相PWM整流器桥臂是受控电压源调制策略决定了电流纹波与损耗2.1 电子负载的实质在电网侧“合成”任意电流波形先看主电路拓扑交流电源经过一个滤波电感L进入单相全桥H桥的直流侧是母线电容和负载电阻。四个MOS管组成的桥臂本质上是一个受控电压源u_ab它的瞬时值由调制波和直流母线电压决定。忽略开关谐波后电感电流满足u_s - u_ab L * di/dt这个式子虽然简单却是整个控制策略的基石。交流电源电压u_s是固定的50Hz正弦量你没办法改它但u_ab是桥臂输出你可以通过PWM每周期都改变它的平均值。只要让u_ab和u_s之间出现一个可控的电压差电感上就会流过你想要的电流。所以“模拟电阻”并不是真的在电路里放一个电阻而是让输入电流跟随输入电压折算出的等效阻抗正好等于设定值。从功率角度看电子负载必须吸收有功。控制id_ref i_s*cos(theta)让电流与电压同相位系统就从交流侧吸取有功功率送到直流侧电容和负载电阻上耗散。要模拟感性或容性负载只改变电流相对电压的相位即可电流滞后电压对应感性超前对应容性。关键是这个相位差必须稳定不能因为电网电压波形畸变而抖动这就是后面锁相环存在的理由。2.2 双极性SPWM与单极性SPWM开关纹波和损耗的取舍单相全桥的四个开关管有两种经典驱动方式。双极性调制下同一桥臂的上下管互补导通对角线开关同时切换u_ab在Udc和-Udc之间来回跳变。它的好处是控制逻辑简单一个调制波就能决定占空比坏处是电感两端承受的电压摆幅大电流纹波大对滤波电感要求更高开关损耗也更高。单极性调制则把正负半周分开处理。正半周时上桥臂一个管子常通另一个管子高频斩波u_ab在Udc和0之间切换负半周时下桥臂一个管子常通另一个管子高频斩波u_ab在-Udc和0之间切换。同样的开关频率下u_ab的跳变幅度减半电感电流纹波明显更小EMI也更干净。代价是驱动逻辑稍微复杂一点需要根据电流方向或电压极性切换工作象限。在电赛A题这个场景里开关频率通常选15到20kHz滤波电感只有几毫亨。用双极性调制的话电感电流纹波会大得让采样和电流环都很痛苦单极性调制才是更稳的选择。实际写PWM时只需要根据当前调制波的符号选择不同的比较寄存器组合就能实现单极性效果不用修改控制算法。2.3 从静止坐标到旋转坐标单相系统没有“两相”必须先虚拟一相单相PWM整流器可以在静止坐标系里直接用PR比例谐振控制器跟踪正弦电流很多电赛队伍也这么干过。但PR控制器的谐振频率必须和电网频率完全一致一旦频率偏移或波形畸变增益就会明显下降。相比之下dq坐标系下正弦量变成直流量用普通PI就能做到无静差而且有功和无功可以分开调节。问题在于dq变换需要两个正交的交流量单相系统物理上只有一个绕组缺的那一相必须“造”出来。这也解释了为什么单相DQ锁相环不是锦上添花而是整套控制的前置条件。你需要先从电网电压u_s中构造一个滞后90度的虚拟信号然后把这两个正交量当作静止坐标系下的alpha和beta再做一次和三相系统完全相同的Park变换。这个虚拟信号的质量直接决定锁相精度进而决定电流环能不能正常工作——如果虚拟正交分量带偏置或幅值不匹配Park变换出来的vd和vq里就会混入二倍频分量锁相环和电流环都会跟着抖。3. 单相DQ锁相环SOGI虚拟正交信号加上Park闭环把相位误差变成直流量3.1 过零检测锁相为什么不够用相位信息只在过零点有效最容易想到的锁相方案是过零检测用比较器捕捉电网电压过零时刻在中断里修正一个软件计数器的相位。这个方案在纯正弦、无畸变的实验室环境里确实能跑但放到电子负载场景就暴露出两个硬伤。一是过零点的相位信息只有一秒两次两次过零之间全靠开环计数电网频率稍微波动相位误差就会慢慢积累。二是电网电压只要有一点谐波或噪声过零点附近就会出现抖动甚至“来回穿越”一次误触发就能让相位角跳变几度电流波形当场畸变。更微妙的问题是过零检测只给出“何时过零”给不出“电压矢量现在指向哪里”。而电子负载要模拟任意相位角的负载需要的是连续、平滑的实时相位。从控制理论角度看过零检测本质上是一个采样率极低、抗扰能力极差的相位测量环节和后面需要高带宽的电流环完全不匹配。所以DQ锁相环的价值不在于“看起来高级”而在于它每个控制周期都在用闭环误差修正相位动态响应和抗畸变能力都远强于过零方案。3.2 SOGI正交信号发生器传递函数、状态方程和离散实现SOGI二阶广义积分器是目前单相锁相里最常用的虚拟正交方案。它有两个输出一个与输入同相一个滞后90度。理想情况下它的闭环传递函数可以写成H_alpha(s) kws / (s² kws w²) H_beta(s) kw² / (s² kw*s w²)这里的w是谐振角频率固定为2pi50k决定带宽和阻尼。当k取根号2左右时alpha通道在50Hz处增益接近1相位接近0度而beta通道滞后约90度增益同样接近1。对偏离50Hz的谐波分量SOGI会自然衰减相当于一个窄带滤波这比单纯把信号延时四分之一周期要干净得多。离散化可以用二阶状态方程。令状态量g代表beta/w的积分中间量a代表alpha状态方程如下da/dt kwu - kwa - w²*g dg/dt a在STM32上以20kHz控制周期做前向欧拉离散写出来是typedef struct { float w; // 谐振角频率 2*pi*50 float k; // 阻尼系数约1.4 float Ts; // 控制周期50us float g; // 中间状态g beta / w float a; // alpha输出 } SOGI; void SOGI_Update(SOGI *s, float u) { float da s-k * s-w * u - s-k * s-w * s-a - s-w * s-w * s-g; float dg s-a; s-a da * s-Ts; s-g dg * s-Ts; }注意alpha和beta不是直接各做一次滤波而是共用一个二阶状态。alpha取自状态量abeta等于w*g。这样做的好处是两路输出天然正交不会出现相位误差随离散步长累积的问题。实际调试时如果发现锁相角度在稳态下有小幅摆动先检查SOGI的k值是不是取得太小k1.4附近是比较均衡的起点k太大会让谐波抑制变差k太小会让动态响应变慢。3.3 Park变换与PI闭环让q轴电压归零锁相角就出来了有了alpha和beta就可以做Park变换。假设当前锁相角为theta变换公式为vd alphacos(theta) betasin(theta) vq -alphasin(theta) betacos(theta)当theta恰好等于电网电压的相位时电压矢量全部落在d轴上vd等于电压幅值vq等于0。如果theta偏小或偏大vq就会出现正负误差。于是锁相环变成一个标准的闭环调节问题用PI控制器把vq压到零PI输出的积分量修正频率比例量加快收敛速度。typedef struct { float theta; // 锁相角 float freq; // 当前频率启动时2*pi*50 float integral; // PI积分项 float Kp, Ki; // PI参数 float Ts; } PLL; void PLL_Update(PLL *p, float alpha, float beta) { float vq -alpha * sinf(p-theta) beta * cosf(p-theta); p-integral p-Ki * vq * p-Ts; p-freq 2.0f * 3.1415926f * 50.0f p-integral p-Kp * vq; p-theta p-freq * p-Ts; // 角度归一化到 0 ~ 2*pi if (p-theta 2.0f * 3.1415926f) { p-theta - 2.0f * 3.1415926f; } }这段代码里有一个关键点freq的初值直接设成50Hz对应的角频率而不是从0开始积分。这样上电瞬间锁相环就在正确的频率附近搜索不会出现几十毫秒的频率“拉拽”。PI参数方面锁相环带宽不建议取得太高10到30Hz比较合适因为电网电压谐波主要集中在低频段带宽太高会把谐波误差放进相位里电流环带宽则可以到几百赫兹两者之间留出足够的频率间隔控制环路才不会互相干扰。4. 基于STM32F407VET6的实现框架采样点对齐、控制时序与母线电压环4.1 外设配置定时器触发ADCPWM用互补输出带死区STM32F407VET6跑168MHz完全撑得起20kHz的控制频率。关键是外设之间的配合方式而不是单纯把主频拉高。推荐的结构是TIM1产生20kHz的PWM同时用TIM1的TRGO事件去触发ADC注入组采样这样电流采样时刻天然和PWM周期对齐不用软件去猜开关沿在哪里。外设配置要点说明时钟HSE 8MHzPLL到168MHz主频足够控制周期50usTIM1PWM频率20kHz互补输出CH1/CH2驱动H桥插入死区250nsADC1注入组双通道采样电网电压和电感电流TRGO触发12位采样时间尽量长DMAADC结果直接搬运到内存变量减少中断里的等待时间USART115200或更高速率输出调试变量调PLL和电流环必备Cubemx里要把TIM1的TRGO设置为Update EventADC1的触发源选TIM1_TRGO并且把两个ADC通道的采样时间拉长。很多人忽略采样时间这个参数实际上STM32F4的ADC输入阻抗不低采样时间太短会采到不准的电压值轻则零点漂移重则电流环噪声大。经验值是采样周期至少拉到84个周期以上宁可牺牲一点采样率也不要让ADC结果里混入明显的建立误差。4.2 控制时序先在中断里读ADC再更新锁相环和电流环整个控制算法都放在TIM1的更新中断里执行。每个50us周期按固定顺序做以下事情void TIM1_UP_TIM10_IRQHandler(void) { // 1. 读取ADC结果并换算成实际电压电流 float u_s (float)adc_buf[0] * voltage_scale; float i_L (float)adc_buf[1] * current_scale; // 2. 单相DQ锁相SOGI生成正交分量再更新锁相角 SOGI_Update(sogi, u_s); PLL_Update(pll, sogi.a, pll_beta); // 3. 电流Park变换把电感的实际电流换到dq轴 float ialpha i_L; float ibeta 0.0f; // 实际中由SOGI的输出或另一个正交发生器给出 float id ialpha * cosf(pll.theta) ibeta * sinf(pll.theta); float iq -ialpha * sinf(pll.theta) ibeta * cosf(pll.theta); // 4. 电流PI控制输出dq轴电压指令 float vd_ref PI_id_update(id_ref - id); float vq_ref PI_iq_update(iq_ref - iq); // 5. 逆Park变换得到alpha轴调制波 float m_alpha vd_ref * cosf(pll.theta) - vq_ref * sinf(pll.theta); m_alpha / dc_bus_voltage; // 归一化到调制比 // 6. 更新PWM比较寄存器单极性调制 update_pwm(m_alpha); }这里有一个容易误解的细节单相系统只有一个电流ibeta并不是测出来的而是虚拟出来的。如果你用SOGI对电网电压做正交化那么电流环同样需要对电感电流构造一个虚拟beta分量。最简单的方法是让ibeta滞后ialpha一个控制周期即把上一周期的ialpha存下来当作ibeta。这在50Hz下引入的相位误差很小实测可用。更讲究的做法是用SOGI对电流也做一次正交化多花一点算力但更严谨。采样点对齐是这套时序里最重要的环节。ADC由TIM1的Update事件触发而TIM1的计数器在溢出时同时更新PWM寄存器所以采样时刻正好落在PWM周期的起点。单极性调制下这个时刻对应的电感电流纹波处于谷底或中心点ADC读到的值最接近电流平均值。如果把触发点放在开关切换附近采到的往往是纹波的尖峰电流环很容易来回振荡。4.3 母线电压环外环输出电流幅值内环负责波形和相位电子负载不能只有电流环否则直流母线电压会随着交流输入功率波动而失控。母线电压环的作用是采样直流母线电压与目标值做差经PI后输出d轴电流参考值id_refiq_ref根据你所模拟的负载类型设置。模拟纯阻性负载时iq_ref设0模拟感性负载时iq_ref设为正或负的固定值。电压环的带宽要比电流环低一个数量级一般取5到10Hz。这样交流侧功率波动不会被电压环放大电流波形也更干净。限幅是必须做的id_ref的幅值要限制在硬件允许的最大电流以内电压环PI的积分项也要单独限幅。电赛现场最常见的母线过压多半就是电压环积分饱和后电流指令不收手能量源源不断灌进直流侧而负载电阻又来不及耗散。比较好的启动顺序是先让直流侧通过预充电阻建立母线电压再闭合继电器最后投入电压环和电流环整个过程用斜率给定让母线电压缓慢爬升。5. 电赛调试避坑PLL失锁、过压与电流发散的五类现场问题5.1 一上电就跳闸母线电容像短路一样现象合上交流电源瞬间空气开关直接跳闸或者整流桥的保险丝烧断。原因直流母线电容初始电压为零H桥的体二极管在不控整流状态下给电容充电充电电流只受线路阻抗限制瞬间可以达到几十安培。这不是控制算法的问题是硬件上电时序的问题。解决在交流侧串联预充电阻或NTC热敏电阻上电后先让电容通过电阻缓慢充电等母线电压到达额定值附近再用继电器短接预充电阻。软件里要检测母线电压到位后才允许发PWM避免电容没充满就强行建立功率回路。5.2 锁相角在过零附近来回抖动vq不归零现象串口打印锁相角发现稳态下角度仍有±2度左右的波动并且以100Hz的频率反复摆动。原因电网电压采样通道存在直流偏置SOGI输入里混入直流量后alpha和beta的幅值不再匹配另外采样时刻离开关动作太近尖峰噪声串进了电压通道。直流偏置会直接转化为Park变换后的vq误差而且是100Hz的波动PI调不快也压不掉。解决上电后先采集一段电压平均值把零点校准掉在每个控制周期减去这个偏置再进SOGI。采样触发点严格放到PWM溢出时刻ADC引脚前加一阶RC滤波。如果用了互感器和运放调理电路还要检查参考地是不是干净数字地和模拟地单点相连。5.3 母线电压冲到400V以上电容发烫现象带上负载后直流母线电压缓慢上升超过设计值甚至顶到电容耐压极限。原因母线电压环没有投入或者PI积分饱和。电流环只控制波形和相位控制不了直流侧能量平衡当id_ref恒为正值时交流侧不断向直流侧输入有功而负载电阻阻值偏大能量消耗不掉电容电压就只能一直涨。解决确保电压环在电流环外层运行id_ref由电压环PI输出而不是手动给常数。PI积分项加限幅输出加总限幅。调试时先给一个较小的id_ref上限观察母线电压是否稳定再逐步放宽。5.4 电流波形毛刺多占空比抖动开关管发烫现象用电流探头看电感电流波形边缘有明显的尖刺噪声幅度能到几百毫安PWM占空比在小数点后一两位来回跳。原因采样点离开关切换沿太近采到的电流是纹波峰值而非平均值或者电流反馈方向接反导致PI控制器在正反馈和负反馈之间震荡。前者表现为高频毛刺后者表现为系统啸叫或发散。解决ADC触发严格同步到PWM周期中心或溢出点电流霍尔传感器接线方向与软件符号保持一致示波器确认正方向。可以在中断里打印id和iq的实际值看它们是否稳定在参考值附近如果id的反馈符号反了PI输出会直接饱和。5.5 加大负载后锁相失锁电流相位乱跳现象轻载时锁相正常一旦把负载功率调大vq开始剧烈波动锁相角在几个周期内偏移十几度电流波形严重畸变。原因大电流工作状态下电流采样通道的共模噪声或开关噪声通过地平面耦合进电压采样通道另外锁相环带宽太低SOGI在高畸变下无法及时跟踪相位。也可能是电流环和锁相环共用同一个采样时刻电流纹波尖峰正好落在电压采样窗口里。解决检查电压采样电路是否用了差分结构是否靠近H桥输出端把SOGI的k值从1.0提高到1.5左右锁相环带宽适当上调。还有一招很实用锁相用的电压信号单独用一路ADC同时采样而不是和电流共用多路复用通道避免通道切换带来的时序错位。6. 从锁相环到电流环DQ变换在单相系统中值得坚持的设计取舍6.1 为什么最终选SOGI而不是简单延时四分之一周期构造虚拟正交信号最朴素的做法是把电压数组存起来延时5ms后再取出来当作beta分量。这在纯正弦且频率严格50Hz时没有任何问题但真实电网总有谐波和频率漂移。简单延时会把这个周期出现的谐波原样带到下一周期alpha和beta的幅值相位都会失真SOGI的本质是一个窄带滤波器它对50Hz附近分量做正交变换同时对远离谐振点的频率分量进行衰减。这个差别在电赛现场电网质量参差不齐时直接决定锁相环能不能稳住。6.2 带宽、电感值和开关频率是如何互相制约的电感取值和电流环带宽是绑在一起的。电感太大电流跟踪速度慢动态响应差电感太小电流纹波大采样噪声和开关损耗都会上来。常见的折中是在额定电流下让纹波峰峰值控制在额定电流的20%到30%对应到参数上几毫亨的电感和20kHz开关频率在大多数电赛场景里都能兼顾。电流环带宽设到开关频率的十分之一左右比较安全过高会让数字控制延迟带来的相位滞后显现出来过低又会让动态响应变得肉。6.3 调好一台PWM整流器的关键顺序调完这台设备后我最大的教训是顺序不能乱。先锁相再调电流环最后才碰电压环。锁相环没调干净之前任何电流波形问题都可能是相位误差造成的你会陷入“调PI参数像在猜谜”的困局。从那以后我每次给单相PWM整流器上电都强制先看vq是否收敛到零、锁相角是否平滑再观察id和iq能否稳定跟随参考值最后才去动母线电压环。这套顺序帮我避开了绝大多数“玄学”问题希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?