
简介面向备战2020年TI杯大学生电子设计竞赛的参赛学生与指导教师这份PDF收录了单相在线式不间断电源B题的完整赛题原文可用于快速核对题目指标、梳理UPS设计任务与评分要点。内容围绕交流正弦波在线式UPS展开明确U136V、Uo30V±0.2V、f50±0.2Hz等关键参数并给出负载调整率SI≤0.5%、电压调整率SU≤0.5%、THD≤2%、交流断电切换至24V直流储能供电及效率η等要求同时附有设计报告评分表与说明界定SI、SU、η的计算方法、变压器构成、测试点设置和过压过流保护等注意事项。资源包共1个PDF文件约411KB篇幅精炼便于打印或分屏查阅。已有4300人学习下载适合参赛者对照赛题逐项自查方案完整性也便于指导教师据此把握命题重点和报告评分维度。1. 单相在线式不间断电源B题为什么在线两个字让难度翻了三倍把市电插头拔掉的那一瞬间示波器上那条 50 Hz 正弦不能有一丝缺口负载端的有效值波动不超过 ±5%一个工频周期内回到稳态——这是单相在线式不间断电源B题最核心的验收动作。在线式即双变换正常工作时输出也由逆变器供给市电只负责送能量电池只负责在后备时间里顶上去。于是 AC-DC、电池充放电、DC-AC 三条通路必须同时在跑任何一条抖一下输出就跟着抖。很多队伍把精力全压在逆变 SPWM 上结果拔电那 20 ms 翻车问题其实出在前级母线电容和电池升压环的带宽上。这篇写给两类人正在准备电源类赛题、需要从零把整机调通的人以及做小功率 UPS、储能逆变、在线式供电模块需要一份可复现参数表的工程师。2. 双变换链路定案48V 母线、24V 电池与 100VA 逆变级的参数怎么算先把指标钉死后面所有器件都从这张表里长出来。我在复现这类题目时习惯用下面这组自定指标具体以题目原文为准这里只作为设计输入输入 AC 24 V±10%/50 Hz输出 AC 24 V/50 Hz、额定 100 VA、短时 200 VA母线 DC 48 V电池 24 V/7 Ah输出电压稳定度 ±1%线性负载 THD 2%切换时间 0 ms。链路顺序是输入 EMI 滤波 → 整流桥 → Boost 升压到 48 V 母线 → 全桥逆变 → LC 滤波 → 输出继电器 → 负载电池经一个双向 Buck-Boost 挂在 48 V 母线上市电在时它当充电器市电没了它当升压源。这样划分的好处是每一级都能单独上电验证出问题不用整机陪跑。2.1 母线电压为什么定 48V整流峰值、Boost 占空比与保持时间一起算输入 24 Vrms 的峰值是 34 V整流桥两个二极管压降按 1.4 V 算直流侧最低点约 32.6 V。母线必须高于这个峰值否则 Boost 在输入电压顶峰附近失去升压能力电感电流会失控。48 V 给出的最高占空比是 D_max 1 − 32.6/48 ≈ 0.32最小占空比出现在峰值处约 0.29整个工频周期里占空比都在 0.3 附近小幅浮动这对电感设计和电流环来说是最舒服的区间。如果母线取 36 V峰值处几乎没余量输入电压一跌到 −10% 就直接掉出升压区这是最常见的选型翻车点。Boost 电感按电流纹波 30% 取值。满载输入功率约 110 W输入有效电流 4.6 A峰值 6.5 A取纹波 2 AL Vin_pk × D / (ΔI × fsw) 34 × 0.29 / (2 × 100000) ≈ 49 µH实际取 47 µH 的铁硅铝磁环饱和电流留到 12 A 以上。母线电容按保持时间算用来顶住检测到掉电 电池升压环建立这段空窗。检测延时按 2 ms 设计允许母线从 48 V 跌到 42 VC 2 × P × Δt / (V1² − V2²) 2 × 110 × 0.002 / (48² − 42²) ≈ 815 µF实取 2×470 µF 电解并联每个并 0.1 µF 陶瓷。这 940 µF 就是整机的后悔药后面所有切换时间的指标都靠它兜底。参数取值依据母线电压48 V高于整流峰值 32.6 V留 47% 余量Boost 开关频率100 kHz电感体积与开关损耗折中Boost 电感47 µH纹波 30%饱和电流 12 A母线电容940 µF覆盖 2 ms 检测空窗跌至 42 V母线电压纹波 1 V100 Hz 工频纹波影响输出 THD注意母线电容的 ESR 比容值更影响纹波和发热选 105℃、低 ESR 的型号别拿普通品凑数。2.2 电池组电压与挂母线的方式为什么不用 48V 电池直挂电池挂母线只有两条路。第一条是直挂电池电压等于母线电压中间只放一个理想二极管或继电器充电时母线电压被抬高到浮充值。这条路元件最少、放电效率最高但母线电压会跟着电池从 42 V 漂到 54 V逆变级增益跟着变输出电压要么做前馈补偿要么 THD 直接躺平而且 48 V 电池组要 4 串 12 V 铅酸体积和成本都不友好。第二条是独立双向变换器电池 24 V2 串 12 V 或 6 串锂电经双向 Buck-Boost 挂到固定 48 V 母线充电和放电走同一个电感、同一对管。母线恒定意味着逆变级增益恒定输出电压环的线性度好做得多代价是多一级损耗和一套控制。我一般选第二条。原因很实际调机时母线电压是一个可以随便设的常量示波器上看到的扰动只剩负载突变和输入纹波排查范围一下小一半。双向级的参数电感 100 µH、开关频率 100 kHz、充电恒流 1 A约 0.14C、恒压 27.6 V、浮充 27.0 V放电时从 24 V 升到 48 V占空比 0.5输入电流满载约 5 A峰值 8 A。管选 100 V/30 A 的 MOS同步整流那一路别用肖特基效率差 3 个点。真正决定不间断的是这一级的动态。母线从 48 V 掉到 42 V 时放电环必须在 1 ms 内把占空比推到 0.55 以上并把电流拉起来所以它的电流环带宽要做得比逆变级更高我把补偿放到 5 kHz采样和 PWM 同一时刻触发否则工频纹波会把环路带偏。2.3 全桥逆变与 LC 滤波器开关频率、电感量、截止频率的取值链逆变级用四个 100 V MOS 组成全桥单极性倍频 SPWM开关频率 20 kHz输出侧等效纹波频率 40 kHz。单极性倍频的好处是同样开关频率下纹波频率翻倍滤波器可以小一圈。滤波电感由纹波电流反推最恶劣工况下的峰峰值纹波ΔI Vbus / (4 × L × f_eff) 48 / (4 × 600e-6 × 40000) 0.5 A额定输出电流 4.24 A、峰值 5.9 A0.5 A 纹波约占峰值 8.5%合理。电感取 600 µH铁氧体或铁硅铝罐形气隙开够别让 8 A 峰值时进入饱和——饱和那一刻电感量塌下去电流环瞬间失稳输出波形上会看到周期性的尖刺。滤波电容由截止频率定。截止频率取开关频率的 1/10 到 1/20 之间fc 1 / (2π × √(L × C)) 1 / (2π × √(600e-6 × 10e-6)) ≈ 2.05 kHz2 kHz 落在 20 kHz 的十分之一处40 kHz 的纹波被衰减约 26 dB基波 50 Hz 处的相移不到 3°。代价是空载时 LC 谐振的 Q 值很高负载一突变就振铃所以必须加阻尼支路10 µF 串 3.3 Ω 并在输出端把空载 Q 从 8 压到 2 以下。参数取值说明逆变开关频率20 kHz单极性倍频纹波 40 kHz滤波电感600 µH纹波 0.5 A饱和电流 12 A滤波电容10 µF截止频率约 2 kHz阻尼支路10 µF 3.3 Ω抑制空载谐振死区时间300 ns ~ 1 µs与输出电流大小联动见第 6 章2.4 器件选型与损耗估算把 100VA 的发热先算在纸面上100 VA 的机器损耗算不准就会在满载半小时后摸到 90℃ 的散热片。我把每一块分开算纸上先过一遍再画板。环节主要损耗估算值Boost 主管导通I²Rds×D4.6²×0.02×0.30.13 WBoost 二极管Vf×Iavg×(1−D)0.6×2.9×0.71.2 WBoost 开关损耗0.5×48×6.5×40ns×100k0.62 WBoost 电感铜损4.6²×0.030.63 W逆变四管导通4.24²×0.01×20.36 W逆变开关损耗4×0.5×48×5.9×40ns×20k0.45 W逆变电感铜损 磁芯0.8 W驱动、采样、控制静态1.5 W合计—约 8 W总损耗 8 W效率约 92.6%。如果换成通态压降 0.3 V 的同步整流方案二极管那 1.2 W 能省掉大半效率能上到 94%。选型上我的习惯是所有功率管耐压按母线电压的 2 倍取100 V电流按峰值 2 倍取驱动用带自举的半桥驱动自举电容 1 µF 起步。3. 采样、充电与保护把不间断拆成三条独立的时间线这一章讲的是看不见的部分。输出波形好不好看一半靠控制环另一半靠采样准不准、充电状态机会不会误判、保护动作够不够快。三者时间尺度完全不同采样是 50 µs 级充电是分钟级保护是微秒级混在一起调就会互相打架。3.1 电压电流采样1.65V 偏置、两点校准与 PWM 同步触发交流采样必须抬偏置。输出 24 Vrms 峰值 34 V按 1/22 分压后峰值 1.55 V叠上 1.65 V 偏置ADC 端范围 0.1~3.2 V正好落在 0~3.3 V 的线性区中间。ADC 12 位、参考 3.3 V每 LSB 是 0.806 mV折算到输出侧分辨率 17.7 mV对 ±1% 的稳定度要求240 mV绰绰有余。电流采样用 5 mΩ 采样电阻加 50 倍差分放大峰值 5.9 A 时输出 1.47 V同样抬 1.65 V 偏置。别用霍尔小电流下零点漂移比分辨率还大。typedef struct { float k; /* 斜率每码值对应的工程值 */ float b; /* 零点偏置 */ float raw; /* 最近一次原始码值 */ float val; /* 换算后的工程值 */ } adc_ch_t; /* 两点校准给定两个标准输入 v1/v2读回码值 c1/c2 */ void adc_cal(adc_ch_t *ch, float c1, float v1, float c2, float v2) { ch-k (v2 - v1) / (c2 - c1); ch-b v1 - ch-k * c1; } /* 三次采样取中值滤掉开关噪声造成的单点跳变 */ float adc_read_median(adc_ch_t *ch) { int16_t s[3]; s[0] ADC_Get(ch-id); s[1] ADC_Get(ch-id); s[2] ADC_Get(ch-id); /* 中值 */ if (s[0] s[1]) { int16_t t s[0]; s[0] s[1]; s[1] t; } if (s[1] s[2]) { int16_t t s[1]; s[1] s[2]; s[2] t; } if (s[0] s[1]) { int16_t t s[0]; s[0] s[1]; s[1] t; } ch-raw s[1]; ch-val ch-k * ch-raw ch-b; return ch-val; }k和b用两点校准标出来别信电阻的标称值——1% 精度的分压电阻加上运放失调零点误差能到几十毫伏闭环里会直接变成直流偏置。校准点选在量程的 20% 和 80%不要在零点附近校那里噪声占比最大。采样时刻比校准更重要。ADC 触发必须和 PWM 同步放在中心对齐计数器的顶点或谷底这时候四个管子刚换相完毕电流已经稳定、开关噪声也衰减了。随便开个定时器去采波形上会出现和开关频率同频的毛刺电流环里全是噪声这就是很多人调不出来的玄学源头。3.2 电池三段式充电状态机与掉电判据的时间常数充电用恒流、恒压、浮充三段。铅酸 24 V 组恒流 1 A恒压 27.6 V电流跌到 0.1 A 转浮充 27.0 V。锂电 6 串则是 CC 1 A、CV 25.2 V、截止 0.05C。状态机写成显式枚举比一堆 if 好维护。typedef enum { CHG_IDLE, CHG_CC, CHG_CV, CHG_FLOAT, CHG_FAULT } chg_state_t; chg_state_t chg_fsm(chg_state_t st, float vbat, float ibat, float t_c) { /* 温度补偿每节每℃ 减 3 mV这里按 2 节 12V 组折算 */ float v_cv 27.6f - 0.018f * (t_c - 25.0f); float v_fl 27.0f - 0.018f * (t_c - 25.0f); switch (st) { case CHG_IDLE: if (vbat 20.0f) return CHG_CC; /* 深放先小电流唤醒 */ return CHG_CC; case CHG_CC: if (vbat v_cv) return CHG_CV; /* 到达恒压点 */ if (ibat 0.02f) return CHG_FAULT; /* 电流消失检查接线 */ return CHG_CC; case CHG_CV: if (ibat 0.10f) return CHG_FLOAT; /* 0.1A 转浮充 */ return CHG_CV; case CHG_FLOAT: if (vbat v_fl - 0.4f) return CHG_CC; /* 自放电后补电 */ return CHG_FLOAT; default: return CHG_FAULT; } }v_cv和v_fl跟着温度走是因为密封铅酸在低温下恒压点要抬高、高温下要压低否则夏天鼓包冬天充不满。赛题现场一般 20~30℃补偿量可以忽略但状态机里留着这个接口换成锂电只改常数。掉电判据要和母线电容容量对得上。前面算过 940 µF 只能顶 2 ms 左右从 48 V 跌到 42 V、满载 110 W所以检测窗口不能超过 1 ms。我的做法是双条件或输入电压有效值低于 18 V 且持续 1 ms或者母线电压低于 42 V 且持续 0.5 ms。第二个条件更快第一个条件更抗干扰。两个条件任一个成立就切电池升压环同时封锁充电器防止电池电流倒灌回输入端。提示判据里的持续用计数器实现别用软件延时中断里阻塞 1 ms 会把整个控制循环拖垮。3.3 开机时序与保护链预充电、软启动、硬件刹车在线式 UPS 上电最怕浪涌。母线 940 µF 从 0 V 充到 48 V瞬间电流能到几十安继电器触点会粘死。所以加一条 47 Ω/5 W 的预充电阻用继电器并联短路时序是时刻动作判据t0闭合预充继电器经 47 Ω 给母线充电母线 40 V 或 300 ms 超时t0300 ms闭合主继电器短路预充电阻母线 44 Vt1使能电池充电器母线稳定 20 mst2逆变软启动调制比 200 ms 内从 0 爬到 0.72输出有效值到 24 Vt3闭合输出继电器输出电压过零附近动作输出继电器一定要在电压过零附近闭合否则容性负载的浪涌会把过流保护打掉。这一步用软件锁相拿到的过零点做触发误差控制在 1 ms 内。保护分两层。硬件层用比较器直接盯采样电阻阈值设到 12 A超过就拉低驱动的刹车脚MOS 在 1 µs 内关断同时锁存必须手动复位。软件层在控制中断里做阈值 9 A、10 µs 响应只降调制比不关断用来扛启动浪涌和整流负载的峰值。两层阈值必须拉开距离硬件层是最后一道不能和软件层抢着动作。4. 逆变控制代码骨架20kHz 载波、双闭环与软件锁相控制部分能不能一次调通取决于三件事PWM 配置对不对、双环参数从带宽推不是靠试、锁相能不能扛住过零抖动。下面按这个顺序拆。4.1 定时器与 PWM中心对齐、300ns 死区与最小脉宽/* 以某款带互补 PWM 的 MCU 为例寄存器名按各自手册替换 */ void pwm_init(void) { /* 中心对齐fsw 20 kHz主频 120 MHz周期值 120M/(2*20k) 3000 */ PWM-ARR 3000 - 1; PWM-CR1 | PWM_CR1_CENTER_ALIGNED | PWM_CR1_ARPE; /* 死区 300 ns120 MHz 下约 36 个时钟 */ PWM-DTR 36; PWM-CR2 | PWM_CR2_DEADTIME_EN; /* 最小脉宽保护窄于 400 ns 的脉冲直接丢掉防止自举电容充不满 */ PWM-MINPW 48; /* ADC 触发点放在计数器顶点避开开关沿 */ PWM-CR3 | PWM_CR3_ADC_TRIG_AT_PEAK; PWM-CR1 | PWM_CR1_ENABLE; }中心对齐让输出纹波频率变成开关频率的两倍滤波器好做死区 300 ns 对应 100 V 母线、40 ns 开关沿的管子是够的太小会直通太大会畸变最小脉宽保护是给自举电容留充电时间占空比极小时上管导通时间太短自举电容充不上电下个周期上管驱动电压不足管子进入线性区几秒钟就热炸——这个坑我踩过血泪经验。自举电容按 Qg 算管子栅极电荷 30 nC允许电压跌落 0.5 VC ≥ 30n/0.5 60 nF取 1 µF 留 15 倍余量串 10 Ω 限流电阻防止自举二极管浪涌。4.2 电压外环加电感电流内环离散化、限幅与抗饱和外环稳压、内环提动态这是电压源逆变最稳的结构。外环带宽压到 500 Hz工频的 10 倍内环带宽 2 kHz开关频率的 1/10两个环差 4 倍以上互相不打架。typedef struct { float kp, ki; float i_sum; /* 积分累加 */ float out_max, out_min; } pi_t; float pi_calc(pi_t *p, float err, float dt) { float out p-kp * err p-i_sum; /* 抗饱和输出限幅时停止积分防止退饱和滞后 */ if (out p-out_max) { out p-out_max; } else if (out p-out_min) { out p-out_min; } else { p-i_sum p-ki * err * dt; } return out; } /* 每 50 µs 调用一次dt 5e-5 */ void ctrl_isr(void) { float vo adc_read_median(ch_vout); /* 输出电压 */ float il adc_read_median(ch_il); /* 电感电流 */ /* 外环电压误差 - 电流指令限幅到 ±9 A */ float i_ref pi_calc(pi_v, VREF_SIN[idx] - vo, 5e-5f); if (i_ref 9.0f) i_ref 9.0f; if (i_ref -9.0f) i_ref -9.0f; /* 内环电流误差 - 调制比限幅到 ±0.95 */ float m pi_calc(pi_i, i_ref - il, 5e-5f); if (m 0.95f) m 0.95f; if (m -0.95f) m -0.95f; pwm_set_duty(m); /* 单极性倍频一对管走 m另一对管走 -m */ }VREF_SIN[idx]是 200 点正弦表用查表加线性插值比实时算 sin 快一个数量级。kp和ki从带宽推外环 kp 取 0.05~0.1 A/Vki 取 kp×2π×500内环 kp 取 0.05 左右ki 取 kp×2π×2000。推出来只是起点实际还要看阶跃响应超调超过 10% 就把 kp 往下压。调制比限幅 0.95 而不是 1.0是给死区和最小脉宽留余量。限到 0.95 时最大输出 24.7 V正好覆盖 24 V 额定加 3% 的调节余量。4.3 软件锁相与掉电后的频率保持在线式的输出频率要跟市电同频同相才能在带载时和市电无缝。做法是捕获输入过零沿测周期用一阶滤波平滑再拿输出相位和输入相位做 PI 微调。volatile uint32_t t_cap[8]; /* 过零捕获时间戳环形缓冲 */ volatile uint8_t cap_idx; /* 输入过零中断上升沿 */ void zero_cross_isr(void) { t_cap[cap_idx 7] TIM_GetCapture(); } /* 每 1 ms 更新一次频率参考 */ void pll_update(void) { static float f_ref 50.0f; uint32_t p t_cap[(cap_idx - 1) 7] - t_cap[(cap_idx - 2) 7]; if (p TICKS_45HZ p TICKS_55HZ) { /* 45~55Hz 才认 */ float f_meas (float)TICKS_1S / p; f_ref 0.02f * (f_meas - f_ref); /* 一阶低通时间常数约 50ms */ } else { /* 丢脉冲或超范围保持上一次频率切换内部 50Hz 参考 */ f_ref (f_ref 45.0f f_ref 55.0f) ? f_ref : 50.0f; } phase_inc (uint32_t)(f_ref * 200.0f * 4294967296.0f / 200000.0f); }三个细节决定这套锁相能不能用。一是捕获时间戳用硬件捕获寄存器不要在中断里再读计数器否则中断响应抖动直接变成相位噪声。二是环形缓冲深度取 8连续丢 3 个脉冲就判市电异常切内部参考靠晶振精度撑 50 Hz。三是低通系数 0.02对应 50 ms 左右时间常数市电频率变化率通常在 0.1 Hz/s 以内跟得上而单周期抖动被压掉 98%。掉电之后输出频率不能跳变。我的做法是切内部参考时不重置相位累加器让phase_inc保持最后的值慢慢回落到 50 Hz回落速率限在 0.5 Hz/s逆变器看不出来负载也看不出来。5. 避坑与排查五条把板子救回来的现场记录调试期最容易出现的不是不工作而是看起来工作但指标差一点然后一路换器件换到怀疑人生。下面五条我都实打实遇过按现象、原因、解决记下来。5.1 上电就炸下管预充电阻被省掉自举也没充上电现象第一次上电主继电器一吸合四只管子全短路保险丝炸黑母线电容电压瞬间归零。原因有两个叠在一起。一是母线电容 940 µF 直接从 0 V 充电瞬时电流超过 50 A继电器触点拉弧母线电压剧烈振荡振荡峰值超过管子 100 V 耐压。二是自举电容在 PWM 还没启动时是空的主控一使能就输出高占空比上管驱动电压不足进入线性区。解决预充电阻 47 Ω/5 W 必须加预充到 44 V 再吸主继电器PWM 启动前先跑 10 ms 的下管强制导通不打调制波把自举电容充饱软件里加母线过压判定超过 60 V 立即封锁输出。5.2 拔掉市电输出跌到 18V 才回来升压环带宽不够检测又太慢现象满载拔电输出有效值从 24 V 掉到 18 V持续约 8 ms 才恢复示波器上是一段明显的凹陷。原因掉电判据用了 20 ms 的软件平均母线从 48 V 跌到 30 V 才开始动作同时电池升压环的电流环带宽只有 500 Hz建立时间 3 ms。两段时间加起来就超过母线电容的支撑时间。解决判据改成母线 42 V 持续 0.5 ms或输入有效值 18 V 持续 1 ms两条或逻辑响应压到 1 ms 内升压环电流环带宽提到 5 kHz补偿网络重算再把母线电容从 940 µF 加到 1410 µF多买 1 ms 余量。改完凹陷降到 0.8 ms、幅度 2 V。5.3 空载 THD 4% 且波形顶部有台阶LC 谐振加最小脉宽现象空载时输出波形顶部被削平FFT 上 3、5、7 次谐波明显THD 4%带载后反而降到 2.2%。原因空载时 LC 谐振 Q 值高2 kHz 附近的谐波被放大同时轻载时调制比很小占空比接近最小脉宽限值窄脉冲被吞掉波形出现台阶。解决加 10 µF 串 3.3 Ω 的阻尼支路空载 Q 从 8 降到 1.8最小脉宽从 400 ns 降到 200 ns同时把死区从 1 µs 收到 500 ns 并做电流极性补偿输出电压环加一个 2 kHz 的陷波器把谐振点压下去。三项一起改空载 THD 降到 1.6%。5.4 输出频率在 49.8~50.2Hz 之间缓慢爬过零捕获抖动没处理现象频率读数每几秒跳一次负载是电机时能看到转速轻微波动。原因输入过零信号没做硬件滤波市电上的开关噪声让捕获在真实过零点前后几个微秒内随机触发周期测量的抖动被低通滤波变成了慢漂。解决过零比较本文还有配套的精品资源点击获取