一、作品介绍
DCTC系统的全称是Dual-channel Type-C 机器人供电系统。使用type-c接口,解决中小型机器人的充电问题,桌面NUC、迷你主机的实时供电问题。在GaN技术和C口协议充分发展的今天,存量的C口输出充电器有很多,利用现存的充电器完成供电,降低用户的使用门槛和购入成本。避免专用设备给用户的使用成本带来提高。同时兼顾便携部署。
二、系统框图
2.1 设计思路
本项目基于MP4201和MP4583搭建一个电源转换板卡,输出标准ATX接口的线对板针座,同时板载一个带USB功能的MCU,对外提供5V电源方便调试,同时可快速使用上位机查看和控制逻辑,完成温度检测,控制逻辑的处理,对外输出两个GPIO接口可设置为UART或者软件I2C协议,以便多板互联,增加电流输出的功能。
2.2 系统框图
2.3 系统硬件介绍
PD_IN接口的数据线连接到PD诱骗芯片,诱骗GaN充电头完成20V、28V、48V电压的输入,优先使用48V档位协议,同时兼顾老旧65W充电头的最大20V输出。
针对ATX主板的多重供电,使用MP4201作为主降压DCDC,将输入电压降低为12V主板母线电压。使用2颗MP4583做辅助的DCDC,降压输出5V和3V3电压,为主板、硬盘、待机电源等使用,宽电压输入使得不管PD协议电压为12V还是高达48V,都可以从容应对。
被动器件中电容选择的高耐压值,输入输出均设置多个MLCC搭配电解电容。电感的饱和电流均大于电源芯片最大输出电流。板载多颗NTC热敏电阻STM32C071芯片,可完成温度采集、MP4583输出检测、MP4201的逻辑控制。
三、各模块介绍
3.1 type-c模块
本模块由两个C口组成,一个是PD_IN输入电源的C口,C口的CC通过5.1K下拉到GND,C口的DM、DP、CC线连接到CH224Q,完成PD诱骗,输入电压。另一个是USB-C,连接到STM32C071的C口,用以数据通讯、调试所用。两个C口均防止TVS和保险丝,PD_IN放置的保险丝是6A,USB-C口放置的是1A保险丝。
3.2 MP4201模块
本模块由MP4201及其外围元器件组成,搭建MP4201的最小系统。四开关的MOS管选择的是PDFN-8封装的XRS50N10LF型号,驱动栅极均通过0R电阻跳线和电容连接。24引脚VDDH和23引脚VCC为MP4201内部电源引脚,用以内部供电和上下拉电阻指示,外部放置10uF和100nF电容。引出四个SDA、SCL、ALT、GPIO引脚和控制MCU进行通信。1脚NTC引脚外部通过R21电阻上拉到MP4201的23引脚VCC,下接R20 NTC热敏电阻。MP4201的输入、输出侧均布置了100uF电解电容和4.7uF的MLCC进行滤波。MP4201的输出电压通过软件控制,外部可不连接FB引脚。
3.3 MP4583模块
本模块有两个MP4583模块组成,其中一个MP4583负责降压输出+5V电压,另外一个MP4583负责降压输出+3V3电压。16脚VCC是MP4583内部LDO供电引脚,需在外部连接1uF电容,同时最后通过二极管对地,防止过压。2脚EN需要通过100K电阻串联到输入电源侧,在DCTC系统中常开。三个SW引脚通过铺铜连接到电感处,在连接FB分压电阻后放置输出滤波电容,输出侧放置两个22uF电容。输入侧放置两个4.7uF的MLLC和一个100nF电容,组成输入侧滤波。FB分压电阻均采用1%精度,同时并联3.3pF的滤波电容连接输出电压和FB引脚。电容滤波后通过两个一样的1%精度电容,引出MCU的ADC检测用。
3.4 STM32C071
STM32C071的PC14、PC15连接到X1晶振,2016封装的48MHZ晶振,无需分频可直接供给MCU的USB外设提供时钟。输入电源引脚外部放置1uF和100nF滤波电容。C071可选用专用的LDO供电,由MP4583输出的+5V电源轨供电,TPSPX3819降压3V3为C071供电。R4作为跳线0R电阻,可在不使用LDO的情况下,使用MP4583输出的+3V3供电。
此外NTC热敏检测下,引出两个ADC引脚,外接NTC热敏电阻,上拉到3V3电源。有BOOT0、NRST和USER三个用户按钮,LED有LD1和LD2两个LED组成,外部上拉,GPIO拉低即可点亮LED灯。
MP4201和CH224Q的I2C接口均采用独立两路I2C接口配置,同时设置0R电阻跳线,以便调试时排除干扰情况。为MCU外置ADDR检测电路,通过两个电阻分压,C071的ADC检测中点电压,可在多个MP4201通过一个设备集中控制时,无需修改固件即可完成连接通信。
在下载调试引脚方面,引出SWD接口和3V3以及GND网络,引出默认的USART2引脚以便出厂情况下烧录固件。
在对外通讯接口,引出USART1,方便debug调试和多板互联互通。
3.5 对NUC接口
此模块是给NUC、ATX主板供电接口,采用兼容电脑电源的4.2mm间距的线对板针座,以便兼容NUC现在的供电座子,同时提供12V、5V和3V3的电源轨,极大程度方便了机器人系统的使用。在开关机信号和-12V负压电源,引出2.54mm的排针,方便后调试和使用。
3.6 PCB设计
四、作品源码
DCTC系统的代码逻辑主要部署在STM32C071上,使用STM32cubemx生成工程,使用cubeide的无头模式,让AI加速开发。
代码架构框图
┌─────────────────────────────────────────────────────────────┐
│ 应用层 (main.c) │
│ - MP4201 初始化配置 │
│ - 遥测数据读取 │
│ - 故障检测与打印 │
├─────────────────────────────────────────────────────────────┤
│ 驱动层 (mp4201.c/h) │
│ - I2C 寄存器读写 │
│ - PMBus 命令封装 │
│ - 电压/电流/温度转换 │
├─────────────────────────────────────────────────────────────┤
│ HAL层 (i2c.c) │
│ - I2C1 外设配置 (PB6=SCL, PB7=SDA) │
│ - HAL_I2C_Mem_Read/Write │
└─────────────────────────────────────────────────────────────┘
MP4201 驱动核心代码 (mp4201.h)
/* I2C 地址配置 */
#define MP4201_ADDR_7BIT 0x27U // ADDR=GND
#define MP4201_I2C_ADDR (MP4201_ADDR_7BIT << 1) // 0x4E
/* PMBus 命令码 */
#define MP4201_OPERATION 0x01U // 开关控制
#define MP4201_VOUT_COMMAND 0x21U // 输出电压设定
#define MP4201_IOUT_OC_FAULT_LIMIT 0x46U // 输出电流限制
#define MP4201_IIN_OC_FAULT_LIMIT 0x5BU // 输入电流限制
#define MP4201_STATUS_WORD 0x79U // 状态字
#define MP4201_READ_VIN 0x88U // 输入电压
#define MP4201_READ_VOUT 0x8BU // 输出电压
#define MP4201_READ_IOUT 0x8CU // 输出电流
#define MP4201_READ_TEMPERATURE 0x8DU // 温度
#define MP4201_MFR_CTRL1 0xD0U // 控制寄存器1
/* 电压转换公式 */
// 内部反馈模式 (FB_MODE=1, ratio=32):
// VOUT(mV) = reg[11:0] * 20
// 例: 12V → reg = 12000/20 = 600 = 0x258
/* 电流转换公式 */
// IOUT/IIN: reg[8:0] * 50mA
/ 例: 2A → reg = 2000/50 = 40 = 0x28
MP4201 驱动核心代码 (mp4201.c)
/* I2C 底层读写 */
HAL_StatusTypeDef MP4201_ReadReg(uint8_t cmd, uint8_t *buf, uint16_t len)
{
return HAL_I2C_Mem_Read(&hi2c1, s_mp4201_i2c_addr, cmd,
I2C_MEMADD_SIZE_8BIT, buf, len, 100);
}
HAL_StatusTypeDef MP4201_WriteReg(uint8_t cmd, const uint8_t *buf, uint16_t len)
{
return HAL_I2C_Mem_Write(&hi2c1, s_mp4201_i2c_addr, cmd,
I2C_MEMADD_SIZE_8BIT, (uint8_t *)buf, len, 100);
}
/* 16位寄存器读写 (PMBus 小端序) */
HAL_StatusTypeDef MP4201_ReadReg16(uint8_t cmd, uint16_t *val)
{
uint8_t buf[2];
HAL_StatusTypeDef st = MP4201_ReadReg(cmd, buf, 2U);
if (st == HAL_OK)
*val = (uint16_t)buf[0] | ((uint16_t)buf[1] << 8); // 小端序
return st;
}
/* 输出电压设定 */
HAL_StatusTypeDef MP4201_SetVoutMillivolts(uint16_t millivolts)
{
uint16_t reg;
if (millivolts < 3200) millivolts = 3200; // 最小 3.2V
if (millivolts > 81900) millivolts = 81900; // 最大 81.9V
reg = (uint16_t)(millivolts / 20); // mV → reg
reg &= 0x0FFFU; // 12位有效
return MP4201_WriteReg16(MP4201_VOUT_COMMAND, reg);
}
/* 输出使能 */
HAL_StatusTypeDef MP4201_EnableOutput(uint8_t enable)
{
return MP4201_WriteReg8(MP4201_OPERATION,
enable ? 0x80U : 0x00U); // bit7=ON/OFF
}
/* 方向控制 */
HAL_StatusTypeDef MP4201_SetDirection(uint8_t forward)
{
// MFR_CTRL1[7]: 1=VIN->OUT(正向), 0=OUT->VIN(反向)
return MP4201_UpdateBits8(MP4201_MFR_CTRL1, 0x80U,
forward ? 0x80U : 0x00U);
}
关键寄存器映射
┌─────────────────────┬──────┬──────┬────────────────────┐
│ 寄存器 │ 地址 │ 读写 │ 说明 │
├─────────────────────┼──────┼──────┼────────────────────┤
│ OPERATION │ 0x01 │ R/W │ bit7: 开关控制 │
├─────────────────────┼──────┼──────┼────────────────────┤
│ VOUT_COMMAND │ 0x21 │ R/W │ 12位电压设定 │
├─────────────────────┼──────┼──────┼────────────────────┤
│ IOUT_OC_FAULT_LIMIT │ 0x46 │ R/W │ 9位输出电流限制 │
├─────────────────────┼──────┼──────┼────────────────────┤
│ IIN_OC_FAULT_LIMIT │ 0x5B │ R/W │ 9位输入电流限制 │
├─────────────────────┼──────┼──────┼────────────────────┤
│ STATUS_WORD │ 0x79 │ R │ 16位状态字 │
├─────────────────────┼──────┼──────┼────────────────────┤
│ READ_VIN │ 0x88 │ R │ 10位输入电压 │
├─────────────────────┼──────┼──────┼────────────────────┤
│ READ_VOUT │ 0x8B │ R │ 10位输出电压 │
├─────────────────────┼──────┼──────┼────────────────────┤
│ READ_IOUT │ 0x8C │ R │ 10位输出电流 │
├─────────────────────┼──────┼──────┼────────────────────┤
│ READ_TEMPERATURE │ 0x8D │ R │ 10位温度 │
├─────────────────────┼──────┼──────┼────────────────────┤
│ MFR_CTRL1 │ 0xD0 │ R/W │ 方向/UVLO/反馈模式 │
└─────────────────────┴──────┴──────┴────────────────────┘
主程序初始化流程 (main.c)
/* MP4201 初始化配置 */
static HAL_StatusTypeDef MP4201_BringUp(uint8_t addr7)
{
MP4201_SetI2cAddress(addr7); // 设置I2C地址
MP4201_ClearFaults(); // 清除故障
MP4201_SetDirection(1U); // VIN→OUT 正向模式
MP4201_SetFeedbackMode(1U); // 内部反馈 (ratio=32)
MP4201_SetVoutMillivolts(12000U); // 12V 输出
MP4201_SetOutputCurrentLimitMilliamps(2000U); // 2A 输出限流
MP4201_SetInputCurrentLimitMilliamps(3000U); // 3A 输入限流
MP4201_SetInputUvlo(MP4201_UVLO_8_5V); // 8.5V 欠压保护
MP4201_EnableOutput(1U); // 使能输出
return HAL_OK;
}
/* 主循环遥测读取 */
while (1)
{
MP4201_ReadStatusWord(&status); // 读状态
vin = MP4201_ReadVinMillivolts(); // 输入电压
vout = MP4201_ReadVoutMillivolts(); // 输出电压
iin = MP4201_ReadIinMilliamps(); // 输入电流
iout = MP4201_ReadIoutMilliamps(); // 输出电流
temp = MP4201_ReadTemperatureDeciC(); // 温度
}
I2C 地址自动探测
/* 4种ADDR配置对应的地址 */
ADDR = GND → 0x27 (默认)
ADDR = 1/3VCC → 0x2F
ADDR = 2/3VCC → 0x37
ADDR = VCC → 0x3F
/* 探测函数 */
static uint8_t MP4201_ProbeAddress(void)
{
uint8_t cand[4] = {0x27, 0x2F, 0x37, 0x3F};
for (int i = 0; i < 4; i++) {
if (HAL_I2C_IsDeviceReady(&hi2c1, cand[i]<<1, 3, 10) == HAL_OK)
return cand[i];
}
return 0; // 未找到
}
驱动MP4201函数
五、调试记录
BOM清单
主要元器件
| CH224Q | U2 | DFN-10_L2.0-W2.0-P0.40-BL-EP |
|---|---|---|
| 10uH | U4 | IND-TH_L28.0-W16.5_MPR2617-220K |
| MP4201 | U5 | QFN-32_L6.0-W5.0-P0.50-TL-EP4.2 |
| MP4583GQVE-Z | U6,U7 | QFN-19_L5.0-W3.0_CD4583GQVE |
| STM32C071GBU6 | U8 | UFQFPN-28_L4.0-W4.0-P0.50-TL |
| TPSPX3819M5-L-3-3 | U9 | SOT-23-5_L3.0-W1.6-P0.95-LS2.8-BR |
| 48MHz | X1 | OSC-SMD_4P-L2.0-W1.6-BL |
PD成功诱骗20V电压
MP4583输出5V电源轨
MP4583输出3V3电源轨
同时,STM32C071正常运行,LD1灯正常闪烁。
MP4201调试遇到了问题,I2C通讯没成功,因此12V并没有成功输出。
六、踩坑记录
6.1 BOOT0上下拉
BOOT0的默认上下拉设计错了,设计时直接复制的NRST按键,而NRST默认上拉的,因此移除电容电阻,不对BOOT0引脚进行操作。由于出厂情况下默认开启SWD接口,因此程序可下载进MCU,后续调试没问题。
6.2 TVS钳位电压
两个C口选择的USB TVS保护芯片都是钳位电压为12V的,因此当CH224Q诱骗20V时,因TVS达到钳位时开启保护,因此输入进来的电压是0V。因为手头没120K整的电阻,一开始没想到是TVS的锅,后面单电阻诱骗出9V,查看TVS的钳位电压才意识到这点,拆除TVS后可正常诱骗20V电压。
6.3 MOS管故障导致输入故障
第一次焊接完成后,发现输入侧电路,把电源芯片都拆了后发现还是短路,然后拆MOS管,后面发现MOS管有短路,拆下后即消除短路故障了。后面更换了新的MOS管,因为一开始的MOS是从旧板子上拆除的,没料到有短路。
6.4 诱骗电压可视化
在调试MP4201时,使用过充电宝供电,充电宝连接多个设备,因此没注意到,原来充电宝输出电压只有5V了,因此软件功能要做好增加诱骗电压可视化的功能。
6.5 MP4201 EP焊盘
焊接时发现MP4201的EP散热焊盘并没有打过孔,这是一个严重的失误。会影响散热和焊接,底部的EP焊接如果没有大过孔,锡膏放多后容易导致芯片翘起,产生虚焊的情况。
七、视频链接
由于采用4K30fps画质拍摄,成片较大,因此放置哔哩哔哩的链接
八、项目总结
MPS带通讯协议的电源芯片,还是十分有挑战性的,尤其是自带M0内核的MPF52002,还是相当有挑战性的,参考官方开发板绘制原理图十分重要。同时要考虑到不同电压情况下,整体电源板的工作情况。十分感谢活动工作人员、MPS和EEworld共同参与的活动,MPS的电源芯片技术是否优秀,值得信赖。












