写在前面
1、上传的电路图与PCB是导入到KICAD的,如果发现错误欢迎告知。
2、这是第一版的原理图与PCB,第二版还没画好。
3、已经调试成功,达到实验目的。我会在文中说明调试过程中硬件电路哪些地方做了修改。
4、电源调试有风险,建议不要模仿。
一、所选主题和项目介绍
选的主题是电源。
本项目旨在设计并实现一套基于BOOST拓扑的电感电流恒流控制系统,核心目标是解决交流输入场景下的稳定恒流控制问题,同时兼顾系统可靠性、控制精度与实用性,适配电子负载测试等相关应用需求。可以输入10V-296V的交流电压,通过控制MOSFET开关,实现电感电流变成与整流后电压同相位的馒头波,且幅值可调,我调试的时候最多峰值电流到5A。
二、简短的使用到的所有硬件介绍
1、0ZRP0110FF1E 保险丝
在得捷购买所得,类型是PTC自恢复保险丝,电压最大值60V,电流保持(最大值)1.1A,电流跳断2.2A。
2、主控芯片-STM32F405RGT6
带DSP和FPU的高性能基础系列ARM Cortex-M4 MCU,具有1 MB Flash、168MHz CPU和ART加速器。
3、SiC材质的MOSFET-IMZA120R040M1HXKSA1

示意图
4、隔离运放-AMC1311BDWVR

简化版原理图
5、比较器MS8923
MS8923是一款差分输入、高速、低功耗比较器,具有互补TTL输出。其传输延时在10ns左右,输入共模范围可以到负轨。MS8923在线性区可以保持输出稳定特性,单电源供电是 +5.0V,双电源供电是 ±5V。MS8923采用了SOP8封装。
6、电源模块-B1203S-2WR3、QA123C-1803R3、B1205S-3WR2
易川的隔离电源模块,分别是12转3.3,12转18、-3,12转5。
用到的器件太多了,列举了一些重要器件,其余器件不一一列举了。
三、方案框图和项目设计思路介绍

方案框图
本项目设计基于 BOOST 拓扑结构,实现交流输入下的电感电流恒流控制。系统首先将工频交流电经二极管整流电路转换为单向脉动直流电压,形成典型的馒头波母线电压;随后通过 BOOST 功率回路完成能量传输与升压,输出侧接电子负载以恒定电压模式工作。控制策略采用单电流环架构,通过采样电阻实时采集电感电流信号,经滤波调理后与预设的馒头波电流给定值进行比较,生成不同占空比的 PWM 输出,进而驱动 MOSFET 开关管工作。整个系统以恒定开关频率运行,通过调节使电感电流严格跟踪给定波形,实现稳定的恒流特性。该方案结构简洁、控制逻辑清晰,能够在宽输入波动范围内实现稳定可靠的电流控制,适用于交流输入、输出电压由负载决定的恒流应用场景。
四、原理图和PCB展示及介绍(打了几版、重打原因等等都可以介绍)

原理图

功率电路

MCU部分电路
整个电路分为主功率电路,MOSFET驱动电路,辅助电源,采样电路,MCU控制电路5个部分。
这个电路的特点就是PWM波是外部比较器输出产生的,不是由MCU内部运算产生的不同占空比PWM波。
MCU的作用是采样然后输出给定波形与幅值,驱动继电器,保护MOSFET,串口通信。
与传统的PFC电路不同,这里使用多个不同电源,目的是为了隔离,这里其实不够完善,没有做到相互之间完全隔离,增加了BOM成本,但是更安全。
采样电路使用运放可以使电压更加稳定。
功率电路由有热敏电阻和压敏电阻,起到缓启动和防止冲击的作用,软件上由Relay信号控制继电器将热敏电阻短路出去。
需要修改的地方:MCU复位电路上拉10K欧姆电阻,下接105电容到地。DAC输出的滤波电容改为10K欧姆电阻。驱动电路的加法电路部分,去掉上下分压电阻,直接接地。第一路采样的位置,改在二极管后;第二路的AMC1311改供电为5V/GND_5V,采样电阻改为1K/1K/2K,采样位置改为电流传感器输出;第三路采样电阻3.3K改为2K;

原理图
PCB尺寸是11*11,再画紧凑一些可以缩小到10*10,可以用各个厂商的免费券打板。
需要飞线修改的主要是采样部分和输出电容大小,第一版已经飞线把所有问题解决,第二版正在画,打出来后直接烧录程序就可以用了。
实物飞线
五、调试软件、软件流程图和关键代码介绍(若无代码请省略这部分)
写代码和调试用的软件是keil。下图为软件流程图:
软件流程图
关键代码:
uint16_t B = 200u;
val_AC=ADC_DataBuffer[0];
static uint16_t current_peak = 0;
static uint16_t last_peak = 1200u;
if (val_AC > current_peak) {current_peak = val_AC;}
//防冲击
if(val_AC > 250){HAL_GPIO_WritePin(GPIOB, RELAY_Pin, GPIO_PIN_RESET);}
if (last_peak > 0) {
temp = ((uint32_t)val_AC * B) / last_peak;
/* 防止溢出 */
if (temp > 2480u) temp = 2480u;
DAC_Wave[0] = temp;//放入内存,使用DMA输出到DAC
} else {
DAC_Wave[0] = 0u;
}
#define ADC_LOW_TH 80u
#define MIN_HUMP_PEAK 160u
#define PEAK_DECAY 92u
if (val_AC < ADC_LOW_TH) {
if (current_peak > MIN_HUMP_PEAK) {
if (current_peak > last_peak) {
last_peak = (uint16_t)(((uint32_t)last_peak * 3u + current_peak * 7u) / 10u); // 快速上升(7:3)
} else {
last_peak = (uint16_t)(((uint32_t)last_peak * PEAK_DECAY + current_peak * (100u - PEAK_DECAY)) / 100u);
}
current_peak = 0u;
}
}
//直流电压保护,数值可以自己改
VSum = VSum + val_BUS - (VSum>>2);
Vbus_Avg = VSum>>2;
if(Vbus_Avg>508){ HAL_GPIO_WritePin(GPIOB, PROTECT_Pin, GPIO_PIN_RESET); }
if(Vbus_Avg<1933){ HAL_GPIO_WritePin(GPIOB, PROTECT_Pin, GPIO_PIN_SET); }
首先使用STM32CubeMX配置初始文件,ADDA都使用TIM2的TRGO信号触发,都使用DMA搬运数据。
芯片的三个ADC使用同步采样,分别采整流后的交流电压、电感电流和直流母线电压。
因为不控制直流电压,所以采集直流电压是为了保护,当电压超过一定幅值之后,关闭MOSFET,对应电路中的Protect信号。
上电有缓启动,对应Relay信号,控制继电器,把热敏电阻短路出去。
交流电压采集后是馒头波,把馒头波的幅值算出来进行归一化处理,得到馒头波波形,然后乘上想要的峰值,再放入内存,由DMA输出到DAC,DAC输出参考波形,然后利用硬件电路比较,产生PWM控制开关管,最终完成电流控制,这就是完整的逻辑。
上述代码是在ADC的中断服务函数中执行,每次都是计算执行一个点,所以速度非常快。
六、硬件功能展示图及说明
图中黄色为电压波形,蓝色为电流波形。
图1
图1所示为未进行控制时的电压电流波形,可以看到,整流后电压波形为馒头波,电流波形为一个个三角形尖峰。
图2
图2所示为接了工作在CV模式的电子负载,可以看到电压电流波形都成为馒头波。
图3
图3为输入交流电压40V,控制电流峰值5A,负载为40欧姆电阻时的波形,可以看到都是相位一致的馒头波。
七、设计中遇到的难题和解决方法
图4
图4中黄色为给定的参考波形与幅值,紫色为硬件产生的PWM波波形。
遇到的问题是蓝色波形有受控的倾向,馒头波边缘部分曲线几乎一致,但是峰值部分不受控,一直有尖峰。
解决方法:控制的是电感电流,U=L*dI/dt;峰值时U很小,所以dI/dt也很小,所以峰值部分的电流难以控制,只要想办法使得电感两端有电压差,保持公式中的U有一定值,就可以完美控制了。
八、心得体会(包括意见或建议)
原本做的是一个PFC+LLC电路,用的现成的方案,想不通为什莫不能用。做了现在这个电路还是学到很多,以前总是眼高手低,觉得看明白就行,实际做一下还是遇到不少问题。
希望电子森林越来越好,🌹。