站内搜索
发作品签到
#第十届立创电赛#ESP32-C3·MPQ4263 迷你可调电源
专业版

#第十届立创电赛#ESP32-C3·MPQ4263 迷你可调电源

简介

本项目设计了一款以ESP32-C3 MCU为控制器、采用MPQ4263 Buck-Boost拓扑进行电压变换的数控电源。主要面向12V/15V/20V PD诱骗 或 12-24V DC电源供电的情况。

简介:本项目设计了一款以ESP32-C3 MCU为控制器、采用MPQ4263 Buck-Boost拓扑进行电压变换的数控电源。主要面向12V/15V/20V PD诱骗 或 12-24V DC电源供电的情况。
第十届立创电子设计开源大赛

开源协议

CC BY-NC-SA 4.0

创建时间:2025-10-18 21:51:02更新时间:2025-10-24 09:44:09

描述

1、项目功能介绍

本项目设计了一款以ESP32-C3 MCU为控制器、采用MPQ4263 Buck-Boost拓扑进行电压变换的数控电源。主要面向12V/15V/20V PD诱骗 或 12-24V DC电源供电的情况。

首先感谢嘉立创、瑞萨以及其他赞助商对于本届立创电赛的支持,为选手提供学习与实践的平台。再次感谢!

2、项目属性

项目首次公开;项目为原创;项目未曾经在其他比赛中获奖;项目未在学校参加过答辩。

3、开源协议

开源协议为CC BY-NC-SA 4.0 若使用该开源项目,请遵守开源协议!

4、硬件部分

4.1 基本特征

  • 设备尺寸:L58 x W39.5 x H18 mm(不含编码开关、脚垫和香蕉母座 经典外面不算体积
  • 输入电压VIN:12V ~ 24V
  • 输出电压VOUT:1.6V ~ 34.352V(理想) / 1.8V ~ 32V(软件)
  • 输出电流IOUT:0 ~ 5.4A(硬件) / 0 ~ 4A(软件)
  • 控制精度:0.1V / 0.1A
  • 输出精度:0.01V / 0.01A

说明:

  1. 输入电压过低时无法使能MPQ4263,系统无输出;电压过高时可能系统可能无法正常工作(高于辅助DC-DC电源有效输入);
  2. 测量精度可达小数点后3位,但受制于TFT尺寸、控制效果的原因,软件仅保留小数点后2位显示、小数点后1位输出控制。

尺寸对比.jpg
与上一版本相比,本项目设计的电源在尺寸大大缩小。


4.2 机械结构

接口布局.jpg
设备的接口布局如上图所示。
其中,DC_IN与TYPE-C_IN用于电源输入,有效输入范围为11.5V ~ 24V。

零件图.jpg
电源的所有构成组件如上图所示。除PCB上元器件外所有零件明细见下表:

零件名称数量获取方式备注
上壳13D打印本项目中采用拓竹A1 Aliz PETG耗材打印,见附件。
下壳13D打印本项目中采用拓竹A1 Aliz PETG耗材打印,见附件。
散热块1CNC本项目中采用嘉立创CNC加工,见附件。孔径1.6mm能够自动识别为M2螺纹孔,若需要手动攻丝请选择为光孔。
1.54"TFT屏幕1-插接 0.5mm间距 12P。
M2x7+3mm铜柱4--
M2x10螺丝4--
M2x4x2土八螺母4-需要嵌入上壳中。
4mm香蕉母座2-颜色不同。

详细机械装配结构见下文。
嘉立创CNC每月免费打样:https://www.jlc-cnc.com/ac/ACUHiDI0/CP5SzoAs


4.3 硬件设计思路

4.3.1 电源主拓扑与选型

在上一版本的电源中,采用了Buck的拓扑结构,这一拓扑结构只能实现降压的控制,输出受到VIN的限制。为了获得更宽的输出范围,本次采用了Buck-Boost的升降压拓扑结构。在上一次的MPS征集令项目中,接触到了如MP4248、MPQ4263这样内置下管的Buck-Boost控制器,这样的结构能够大大减小DC-DC部分的footprint,与本次设计的迷你电源十分贴切。因此在本次的设计中,采用了MPQ4263作为控制器。除了内置下管外,MPQ4263还能够通过I2C进行通讯,能够减小FB电阻网络部分的设计。对于ESP32-C3此类没有内置DAC的MCU来说,这样的特征是极为有利的。

4.3.2 电源框架设计

本项目的电源框架设计大体与上一版本的电源保持一致,主要针对MPQ4263进行适配,并且解决了在上一版本电源设计中发现的硬件缺陷。详细的电源框架设计见:MP9928-ESP32C3 降压型便携数控电源 5.2 电源框架设计

MPQ4263的外围元件简单,除了Buck-Boost必要的电感、电容与MOSFET外,仅需少量的阻容即可构建系统,利于迷你电源设计。

在输入部分,本次增加P-MOS构建了防反接、缓启动电路,以对系统进行保护。另外,在输出部分,上一版本系统中采用N-MOS控制负端开关的方案,实测关断时输出不能完全被切断、正段对地仍有电压,算是一个设计缺陷。因此在本次设计中采用Pull-Push结构构建开关,用于控制正端的输出,而负端始终接地保持0电位。

输出采样部分,为了节省元件并减少Layout面积,本次输出采样INA226与MPQ4263共用采样电阻。


4.4 控制结构设计

本次项目的控制结构设计大体与上一版本保持一致。详见:MP9928-ESP32C3 降压型便携数控电源 5.3 控制结构设计

不同的是,本次对于DC-DC拓扑的控制并不是采用PWM实现的,而是通过I2C总线对MPQ4263寄存器写入。


4.5 MCU IO配置

本项目所需的IO如下表所示:

项目IO名IO数量备注
SPISCK / MOSI / D/C / RSE4若要使用硬件SPI需要使用特定引脚
I2CSCL / SDA2-
USBUSB_D+ / USB_D-2固定为IO19 / IO18
VADC-1需要ADC1
OCTRL-1-
KEY1-1为方便烧录选择IO9 BOOT
编码器开关KEY2 / KEYA / KEYB3-
Reserve-1保留/未使用

最后分配IO表如下所示:

项目IO名IO号备注
SPISCK / MOSI / D/C / RSE6 / 7 / 4 / 5使用软件SPI
I2CSCL / SDA20 / 21使用硬件I2C
USBUSB_D+ / USB_D-19 / 18固定为IO19 / IO18
VADC-0ADC1_CH0
OCTRL-3-
KEY1-9与BOOT功能共用引脚
编码器开关KEY2 / KEYA / KEYB2 / 8 / 10-
Reserve-1保留/未使用

IO的使用大体与上一版本一致。

5、软件部分

5.1 软件框架

软件框架.jpg

先前版本在定时器中断服务函数中对DC-DC控制量进行刷新,但是本次采用I2C总线进行通讯,无法在中断服务函数中完成(至少我碰到的是这样的情况),因此将MPQ4263的写入部分移入loop()中。


5.2 各模块设计介绍

本项目中大部分的模块设计沿用了上一版本设计。

5.2.1 TFT显示

本项目中,采用TFT_eSPI.h库进行显示驱动。使用方法较为简单,通过相应的函数绘制需要的文字、图形等即可实现。值得注意的是:

  • 需要根据设备情况在User_Setup.h中更新对应设置
    该库的正确调用需要在User_Setup.h设置对应的引脚、驱动型号、频率等参数,注意看注释说明。

  • 刷新采用缓冲区的形式刷新
    在之前的ESP32-S3数字电源项目中,同样使用了TFT_eSPI.h库。在之前的使用中发现刷新会出现频闪的情况,但没有找到解决方法(属于是学习不够到位)。在本次项目的设计过程中,发现了缓冲区的形式能够避免频闪情况。
    通过createSprite()函数能够创建Sprite对象(缓冲区)。在后续的刷新中,可以对缓冲区内容进行更新,更新后再一次性发送缓冲区中的内容,避免频闪情况的出现。较为简单的形式是将整个屏幕创建为一个缓冲区,只对这个缓冲区进行编辑-发送。

5.2.2 非易失性存储NVS

NVS是ESP32中的一种功能,其能够将Flash中的部分区域划分为NVS,可在其中存取数据,这些数据不像RAM中的数据一样,不会在掉电后丢失。能够用来存储一些运行中可能会更改的、需要永久保留的重要设置信息(例如本项目中的PID参数、电压电流设置)。
通过nvs_flash_init()能够在Flash中划分出一定区域作为NVS,nvs_set_xx系列函数进行写入、nvs_get_xx系列函数进行读取,即可实现非易失存取。
NVS的储存形式为键值对,与Json的形式类似,对“键”进行命名,并在对应“键”存入“值”。
需要注意的是,ESP32-C3的NVS中只能存储整数型、以\0结尾的字符串以及可变长度的二级制数据。因此,例如PID设置参数这样的浮点型数据,需要转换成整数类型进行存储。

5.2.3 PID控制

本项目中的电压与电流输出的控制采用了PID控制的形式。PID使用的是理想的增量型PID,有数学式如下:

Δu=Kp[ekek1+TsKiek+KdTs(ek2ek1+ek2)]Δu = K_p[ e_k - e_{k-1} + \frac{T_s}{K_i}e_k + \frac{K_d}{T_s}(e_k - 2e_{k-1} +e_{k-2}) ]

输入PID参数、当前和前1-2时刻的误差值以及采样周期TsT_s,即可得到控制量的变化量。
将PID封装为函数:

float PID_compute(float Vek, float Vek_1, float Vek_2, float Kp, float Ki, float Kd) {
  float delta_value;
  float Pterm = (Vek - Vek_1);
  float Itrem = Vek;
  float Dterm = ( Vek - 2*Vek_1 +Vek_2);
  delta_value = Kp*( Pterm + Ts/Ki*Itrem + Kd/Ts*Dterm );

  return delta_value;
}

值得一提的是,在本项目中输出电压VOUT的控制并不只是依赖PID控制(恒压模式)。当处于输出状态,并且VSET发生变化时,将根据设置值-输出电压关系计算一个设置值,再进行PID控制。设置值与输出电压存在有数学关系,参照MPQ4263 datasheet VOUT_COMMAND (21h),可以推导得:

Value=VSET/(0.0009765625FBratio)Value = V_{SET} / (0.0009765625 * {FB}_{ratio})

由此可以计算得到较为准确的设置值,之后再通过PID进行微调修正使输出更加准确。
要强调的是,这样的输出模式不宜叠加较大的PID控制效果,即Kp需要设置一个较小的值。

而恒流模式由于输出与负载有关,并不能通过单一的函数确定占空比与输出关系,因此仅采用PID控制调节输出。

5.2.4 MPQ4263、CH224Q、INA226写入/读取

以上三个对象通过I2C总线进行通讯。CH224Q设置请求电压值只需要通过I2C总线向其寄存器写入特定值;INA226需要向其寄存器中写入采样电阻值,并从寄存器中读取总线电压与差分电压值。
由于CH224Q只要向寄存器写入一位数据,因此只要使用Wire.h库进行简单操作;而INA226需要进行多次写入、读取操作,调用针对INA226封装好的库函数更加轻松,因此使用INA226.h库来完成被测量读取的任务。
需要注意的是MPQ4263较为特殊,需要采用PMBus的协议。简单来说,主机需要先发送从机地址,再发送从机寄存器地址(指令),然后才能进行传统意义的I2C读写。可以参照文章基于MPS的MPQ4263芯片I2C通讯可调电源,其中进行了相关描述。另外,需要仔细阅读MPQ4263 datasheet DIGITAL INTERFACE章节关于数字接口通讯的描述。

PMBus_I2C.jpg

PMBus.jpg

  • S = Start condition
  • Sr = Repeated start condition
  • P = Stop condition
  • R = Read bit
  • W# = Write bit
  • A = Acknowledge bit (0)
  • A# = Acknowledge bit (1)

这里详细说明下PMBus的通讯。很明显,都是基于I2C总线进行通讯的,相较于传统I2C通讯,从机寄存器地址被Command概念所代替。如上图所示,对于读取,需要发送从机地址、再发送Command Code对应传统I2C通讯的寄存器地址,接下来再向从机请求Command Code对应的数据;而对于写入,基本与传统I2C通讯无异,发送需要写入的从机地址、再发送Command Code接着发送要写入的内容。

开始帧内容由从机地址Address和读写位R/W#构成,需要注意的是,对于Arduino Wire.h库而言,读写位R/W#根据用户代码判断而不需要自行添加读写位,保持七位地址即可,对于MPQ4263,默认地址为0x67

另外PMBus的数据格式也值得注意。主要有两种数据格式:Byte - 8位;Word - 16位。对于Byte而言,与传统I2C没有太大的区别;但是对于Word,其高低位读写方式与I2C相反,PMBus采用的是先低位、后高位的顺序收发,在实际的使用中需要注意。

该项目目前尚未完全解决通讯问题,复刻请确保自己有能力解决相关问题! 详细情况会在下文存在的问题部分提及。

5.2.5 按键、编码器

按键与编码器是本系统进行人机交互的主要工具。其中,按键相关功能通过调用OneButton.h库实现;编码器数值调节功能通过调用AiEsp32RotaryEncoder.h库实现。
其中,AiEsp32RotaryEncoder.h库中可以实现滚轮编码器的变速控制,即滚轮滚的越快、数值变化越快,其通过setAcceleration()函数实现。这样能够使得大量程变化的调整速度更快。


5.3 交互逻辑

交互逻辑与上一项目保持一致。

5.3.1 按键交互逻辑

按键行为调整
KEY1单击输出开关
KEY2双击设置启用
KEY2单击对象切换
编码器顺时针数值增大
编码器逆时针数值减小

5.3.2 上位机逻辑

本项目中上位机使用串口通信,为进行多控制量的调整,使用标准Json格式进行编码。
Key与Value对照表如下:

对象KeyValue类型单位范围
恒压PID参数"VKpid_p" (i, d同)float-0 ~ 655.35
恒流PID参数"IKpid_p" (i, d同)float-0 ~ 655.35
目标输出电压"VSET"float1.0V2.5 ~ (VIN-0.5)
目标输出电流"ISET"float1.0A0 ~ 4.5
输出状态"OUT"bool-0 / 1

例如要设置目标输出电压为12V、输出电流为1A、输出状态为1,则编码为:
{"VSET":12, "ISET":1, "OUT":1}\n
设备会在接收到上位机数据后返回相同的信息。

5.3.3 TFT显示逻辑

显示逻辑.jpg

  • 屏幕上部显示输入电压与输出状态。
    输入电压保留1位小数。当电压低于有效输入时,判断输出处于异常状态;低于有效输入、高于4.5V时显示“LOW”;低于4.5V时显示“NONE”。
    输出状态在无输出时显示“WAIT”,当输出模式为恒压时显示“CV”,若输出电流超过设置值时进入恒流模式,显示“CC”。
  • 屏幕中部显示输出电压、输出电流和输出功率。显示保留2位小数。
  • 屏幕下部显示设置电压和电流,设置精确到一位小数。当双击编码器KEY2时进入选择状态,在待设置数值下显示横线;单机编码器KEY2切换设置输出电压或输出电流。

6、BOM清单

零件名称数量获取方式备注
机械零件若干-见4.2 机械结构
PCB_UP1嘉立创免费打样厚度1.6mm
PCB_DOWN1嘉立创免费打样厚度1.6mm 4层板 3313阻抗

PCB BOM清单请见页尾自动生成部分。注意电容选型的耐压!


6.1 机械装配

爆炸图.jpg
零件爆炸图如图所示,安装需自上向下安装。
首先使用M2x7+3mm铜柱将PCB_UP固定再上壳上,然后向下放入下壳当中。注意,需要对外壳进行适当的形变,并且由于编码器体积问题,安装时需要以一定角度置入下壳。
上壳与PCB_UP安装后翻转并安装PCB_DOWN,接着安装CNC铝板,最后使用M2x10mm螺丝固定。需要注意的是,CNC铝板安装前应当在铝板的凸台上涂抹硅脂/散热凝胶,在一些可能碰到的位置增加绝缘胶带;PCB_DOWN中固态电容也需要在可能与金属接触到的位置缠绕绝缘胶带。如4.2 机械结构图中所示。

铝板装配建议.jpg

7、性能测试

时间关系暂未进行完整的性能测试,后续进行补充。


7.1 电压跟随测试

电压跟随测试.jpg
图中,I0为目标电压值,I1为输出电压值,上图电压采样曲线所示可见跟随性能较好。

8、现存的一些问题

目前问题主要集中在MPQ4263的I2C通讯上。之前没有用过I2C通讯的DC-DC控制器,项目设计中缺少经验,对PMBus协议的使用也较为生疏。后续还要进一步优化代码以改进对MPQ4263的控制。
请注意,由于当前存在的问题,电源使用还存在不确定性,若要进行复刻请确保自己有修改的能力!

  • MPQ4263输出问题1:输出斜率过大会突然掉压,然后输出保持在约3.8V,猜测可能出现了某种错误并陷入保护状态,等待解决。
  • MPQ4263输出问题2:输出电压最高只能达到约26.5V,当电压高于这一值时无法继续增加,猜测也是受到了某种保护。
  • MPQ4263工作问题:OPERATION寄存器写入似乎存在问题,还未确定具体情况。

9、大赛LOGO验证

logo验证.jpg
大赛LOGO如上图所示。

10、演示您的项目并录制成视频上传

详见附件内容。

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
1
视频展示.mp4
2
2
CarelePowerBox_v2.zip
38
3
MPQ4263GQVE-0002-AEC1-Z.pdf
8
4
上盖.STL
5
5
下壳.STL
5
6
底板.STEP
4
7
底板.SLDPRT
6
8
上盖.SLDPRT
7
9
下壳.SLDPRT
7
10
模型文件.zip
15
11
脚垫.SLDPRT
4
12
脚垫.STL
5
克隆工程
添加到专辑
0
0
分享
侵权投诉
知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

底部导航