2026年东南大学电子设计竞赛 B题参赛作品
基于 STM32F103C8T6 + LM5175 四开关同步升降压拓扑的数控直流恒流电源,输入 12V,输出电流 0~2A 可调,效率实测 90.5%。
- 宽范围恒流输出:0~2A 连续可调,精度优于 ±5mA(校准后)
- 自动 CC/CV 切换:输出电压低于 18V 时恒流,超过 18V 自动限压
- 高效率:2A/8Ω 工况实测效率 95.5%,超出题目 90% 要求
- 三重硬件保护:CS/CSG 逐周期峰值限流(2.66A)、ISNS 平均电流限制(2.27A)、LM5175 Hiccup 短路保护
- 自适应 PID:基于负载电阻和误差大小的双重增益调度,全负载范围(0~10Ω)稳定控制
- 数字人机交互:4×4 矩阵键盘设定电流,OLED 实时显示电流、电压、负载电阻、工作模式
12V 输入
│
├── MSMP2307DN(12V→5V)→ STM32 最小板 LDO(5V→3.3V) 辅助电源
│
└── LM5175 四开关升降压功率级
│ (4× IRLR7843 MOSFET + 1mH 电感)
│
Rsample(20mΩ) ← INA226(I2C1, Alert→EXTI)
│
0~2A 输出 → 负载(0~10Ω)
STM32F103C8T6
├── TIM1 CH1 PWM → RC 滤波 → 注入 LM5175 FB 引脚(调节输出电压)
├── I2C1 → INA226(电流/电压采样)
├── I2C2 → OLED SSD1306(DMA 刷新)
├── I2C2 → 4×4 矩阵键盘
└── GPIO → EN/UVLO(输出使能)、PGOOD(状态监测)
| 模块 | 器件 | 说明 |
|---|---|---|
| 功率拓扑控制 | LM5175 | 四开关同步升降压控制器,内置补偿、保护 |
| 功率 MOSFET | IRLR7843TR (UMW) ×4 | 30V/161A,Rds(on)=2.6mΩ,Qg=9.1nC |
| 储能电感 | 1mH / 80mΩ 扁线绕线 | 大电感方案,纹波电流仅约 10mA |
| 电流/电压采样 | INA226 | 16-bit,增益误差 0.1%,I2C 数字输出 |
| 主控 | STM32F103C8T6 | 72MHz,TIM1 高级定时器 PWM |
| 辅助电源 | MSMP2307DN-LF-Z | 同步 Buck,12V→5V,效率约 90% |
| 肖特基二极管 | BAT54S | 自举充电 + GPIO 保护,统一型号 |
| 显示 | OLED SSD1306 128×64 | I2C,DMA 异步刷新,水平寻址模式 |
| 键盘 | 4×4 矩阵键盘 | I2C 接口扩展 |
输入电压范围:7-21V 最大输出电流:2.45A左右(ISNS限流)
| 参数 | 数值 | 说明 |
|---|---|---|
| 开关频率 | 300 kHz | RT = 84.5 kΩ(减小电阻则增大频率) |
| 工作模式 | CCM + Hiccup | MODE = 93.1 kΩ to GND |
| 输出电压范围 | 1~20V | 由 PWM 注入量决定 |
| FB 上分压 RFB2 | 365 kΩ | Vout 基准设定 18V |
| FB 下分压 RFB1 | 20 kΩ | |
| PWM 注入总阻 Rinj | 63.4 kΩ | 含两级 RC 滤波电阻 20kΩ |
| 斜坡补偿 CSLOPE | 27 nF (C0G) | 配合 1mH 大电感 |
| 补偿零点 Rc1/Cc1 | 680Ω / 4.7μF 钽 | 环路带宽约 68Hz |
| 高频极点 Cc2 | 3.9 nF (C0G) | 60 kHz,Fsw/5 |
| 逐周期限流 Rsense | 20 mΩ | 限流约 2.66A |
| 平均电流限制 RISNS | 20 mΩ | 限流约 2.45A |
| 参数 | 数值 |
|---|---|
| I2C 地址 | 0x40(A0=A1=GND) |
| 采样电阻 Rsample | 20 mΩ |
| Current LSB | 100 μA/bit |
| 校准寄存器 CAL | 0x09E0(2528,实测校准后) |
| 平均次数 | 16 次 |
| 单次转换时间 | 4.156 ms(双通道) |
| 更新周期 | 133 ms |
| 电压软件修正系数 | 1.006 |
├── Core/
│ ├── Src/
│ │ ├── main.c # 主循环、PID 控制、CC/CV 模式管理
│ │ ├── INA226.c # INA226 中断驱动(状态机 + I2C_IT)
│ │ └── oled.c # OLED 驱动(水平寻址 + DMA 异步刷新)
│ └── Inc/
│ ├── INA226.h # INA226 寄存器定义、状态枚举、函数声明
│ └── oled.h
├── Middlewares/
│ └── KeyBoard/ # 矩阵键盘驱动
└── README.md
采用中断驱动状态机,Alert 引脚下降沿触发读取,全程无阻塞:
Alert EXTI(转换完成)
→ INA226_StartRead()
→ HAL_I2C_Mem_Read_IT(读 Current 寄存器)
→ MemRxCplt 回调 → 保存电流,读 VBus 寄存器
→ MemRxCplt 回调 → 保存电压,读 Mask/Enable(清除 CVRF)
→ MemRxCplt 回调 → 计算电阻,data_ready=1,回到 IDLE
状态通过 ina226_state(INA226_State 枚举)对外可见,主循环和 EXTI 均可判断是否空闲。
- CC 模式:自适应 PID,增益随负载电阻(gain_R = R/5Ω)和误差大小(平滑非线性 gain_E)动态调度
- CV 模式:独立 PI 控制器,维持输出电压 18V
- 防震荡:CC↔CV 切换采用 0.5V 迟滞带(进入 CV:V≥18.0V,退出 CV:V<17.5V)+ 无冲击积分初始化(跟踪抗积分饱和)
使用SD1306-0.96寸显示屏,代码来自b站up主keysking 切换为水平寻址模式,全屏 1024 字节单次 DMA 发送,CPU 在传输期间完全空闲:
// 每帧:重置列/页指针 → 触发 DMA → busy 标志 → 回调中清零
OLED_ShowFrame(); // 非阻塞,约 20ms 后 DMA 完成采用 2 层板:
关键布局原则:
- 单点接地:AGND 与 PGND 仅在 Rsense 负端处单点相连
- 开尔文连接:Rsense 和 Rsample 两端各用细线(0.1mm)单独引出到 IC 引脚,不与功率铜皮共路
- SW 节点留空:SW1/SW2 正面仅小面积铺铜,背面在 SW 投影区域挖空,消除寄生电容
- 自举电容就近放置:BOOT1/BOOT2 电容横跨 IC 引脚,HDRV 走线从电容焊盘间隙穿出到背面
- INA226 放背面:远离 SW 高 dv/dt 区域,模拟测量环境更干净
| 设定值 | 实测值 | 偏差 |
|---|---|---|
| 1.000 A | 1.000 A | +0 mA |
| 1.500 A | 1.500 A | +0 mA |
| 2.000 A | 2.000 A | +0 mA |
| (当然是准的啦) |
| 工况 | Vout | Pout | 效率 |
|---|---|---|---|
| 2A / 8Ω | 16V | 32W | 90.5% |
| 指标 | 要求 | 实测 |
|---|---|---|
| 电流调节范围 | 0~2A | 0~2A ✓ |
| 电流精度 | ±20mA | <±1mA ✓ |
| CV 限压 | 18V | 18.0V ✓ |
| 效率(2A/8Ω) | >90% | 90.5% ✓ |
| 负载电阻显示 | — | 实时显示 ✓ |
- 12V 直流输入接功率级 VIN 和 GND
- 负载(0~10Ω 滑动变阻器,PCB中小功率电位器不可作负载)接输出端
- 12V 直流输入通过XH2.54连接到辅助电源输入
- STM32 最小板 5V 引脚接辅助电源输出
使用 STM32CubeIDE 打开工程,直接编译烧录即可。工程基于 STM32CubeMX 生成,HAL 库版本无特殊要求。
上电后通过串口或 OLED 调试界面观察 INA226 读数,对比实验室万用表:
k_I = I_真实 / I_INA226
CAL_new = 2560 × k_I
将 INA226.h 中 INA226_CALIB_VAL 修改为计算值,重新烧录。
LM5175 上电 SS=0.8V,无输出
原因:确保LM5175引脚焊接
MIT License