【2026 机器人模块大赛】DCTC系统项目展示03-作品提交

一、作品介绍

DCTC系统的全称是Dual-channel Type-C 机器人供电系统。使用type-c接口,解决中小型机器人的充电问题,桌面NUC、迷你主机的实时供电问题。在GaN技术和C口协议充分发展的今天,存量的C口输出充电器有很多,利用现存的充电器完成供电,降低用户的使用门槛和购入成本。避免专用设备给用户的使用成本带来提高。同时兼顾便携部署。

二、系统框图

2.1 设计思路

本项目基于MP4201和MP4583搭建一个电源转换板卡,输出标准ATX接口的线对板针座,同时板载一个带USB功能的MCU,对外提供5V电源方便调试,同时可快速使用上位机查看和控制逻辑,完成温度检测,控制逻辑的处理,对外输出两个GPIO接口可设置为UART或者软件I2C协议,以便多板互联,增加电流输出的功能。

2.2 系统框图

截屏2026-08-23 23.11.23

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的电源芯片技术是否优秀,值得信赖。

期待楼主大作展示