
#第十届立创电赛#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
描述
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
说明:
- 输入电压过低时无法使能MPQ4263,系统无输出;电压过高时可能系统可能无法正常工作(高于辅助DC-DC电源有效输入);
- 测量精度可达小数点后3位,但受制于TFT尺寸、控制效果的原因,软件仅保留小数点后2位显示、小数点后1位输出控制。

与上一版本相比,本项目设计的电源在尺寸大大缩小。
4.2 机械结构

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

电源的所有构成组件如上图所示。除PCB上元器件外所有零件明细见下表:
| 零件名称 | 数量 | 获取方式 | 备注 |
|---|---|---|---|
| 上壳 | 1 | 3D打印 | 本项目中采用拓竹A1 Aliz PETG耗材打印,见附件。 |
| 下壳 | 1 | 3D打印 | 本项目中采用拓竹A1 Aliz PETG耗材打印,见附件。 |
| 散热块 | 1 | CNC | 本项目中采用嘉立创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数量 | 备注 |
|---|---|---|---|
| SPI | SCK / MOSI / D/C / RSE | 4 | 若要使用硬件SPI需要使用特定引脚 |
| I2C | SCL / SDA | 2 | - |
| USB | USB_D+ / USB_D- | 2 | 固定为IO19 / IO18 |
| VADC | - | 1 | 需要ADC1 |
| OCTRL | - | 1 | - |
| KEY1 | - | 1 | 为方便烧录选择IO9 BOOT |
| 编码器开关 | KEY2 / KEYA / KEYB | 3 | - |
| Reserve | - | 1 | 保留/未使用 |
最后分配IO表如下所示:
| 项目 | IO名 | IO号 | 备注 |
|---|---|---|---|
| SPI | SCK / MOSI / D/C / RSE | 6 / 7 / 4 / 5 | 使用软件SPI |
| I2C | SCL / SDA | 20 / 21 | 使用硬件I2C |
| USB | USB_D+ / USB_D- | 19 / 18 | 固定为IO19 / IO18 |
| VADC | - | 0 | ADC1_CH0 |
| OCTRL | - | 3 | - |
| KEY1 | - | 9 | 与BOOT功能共用引脚 |
| 编码器开关 | KEY2 / KEYA / KEYB | 2 / 8 / 10 | - |
| Reserve | - | 1 | 保留/未使用 |
IO的使用大体与上一版本一致。
5、软件部分
5.1 软件框架

先前版本在定时器中断服务函数中对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,有数学式如下:
输入PID参数、当前和前1-2时刻的误差值以及采样周期,即可得到控制量的变化量。
将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),可以推导得:
由此可以计算得到较为准确的设置值,之后再通过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章节关于数字接口通讯的描述。


- 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对照表如下:
| 对象 | Key | Value类型 | 单位 | 范围 |
|---|---|---|---|---|
| 恒压PID参数 | "VKpid_p" (i, d同) | float | - | 0 ~ 655.35 |
| 恒流PID参数 | "IKpid_p" (i, d同) | float | - | 0 ~ 655.35 |
| 目标输出电压 | "VSET" | float | 1.0V | 2.5 ~ (VIN-0.5) |
| 目标输出电流 | "ISET" | float | 1.0A | 0 ~ 4.5 |
| 输出状态 | "OUT" | bool | - | 0 / 1 |
例如要设置目标输出电压为12V、输出电流为1A、输出状态为1,则编码为:
{"VSET":12, "ISET":1, "OUT":1}\n
设备会在接收到上位机数据后返回相同的信息。
5.3.3 TFT显示逻辑

- 屏幕上部显示输入电压与输出状态。
输入电压保留1位小数。当电压低于有效输入时,判断输出处于异常状态;低于有效输入、高于4.5V时显示“LOW”;低于4.5V时显示“NONE”。
输出状态在无输出时显示“WAIT”,当输出模式为恒压时显示“CV”,若输出电流超过设置值时进入恒流模式,显示“CC”。 - 屏幕中部显示输出电压、输出电流和输出功率。显示保留2位小数。
- 屏幕下部显示设置电压和电流,设置精确到一位小数。当双击编码器KEY2时进入选择状态,在待设置数值下显示横线;单机编码器KEY2切换设置输出电压或输出电流。
6、BOM清单
| 零件名称 | 数量 | 获取方式 | 备注 |
|---|---|---|---|
| 机械零件 | 若干 | - | 见4.2 机械结构 |
| PCB_UP | 1 | 嘉立创免费打样 | 厚度1.6mm |
| PCB_DOWN | 1 | 嘉立创免费打样 | 厚度1.6mm 4层板 3313阻抗 |
PCB BOM清单请见页尾自动生成部分。注意电容选型的耐压!
6.1 机械装配

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

7、性能测试
时间关系暂未进行完整的性能测试,后续进行补充。
7.1 电压跟随测试

图中,I0为目标电压值,I1为输出电压值,上图电压采样曲线所示可见跟随性能较好。
8、现存的一些问题
目前问题主要集中在MPQ4263的I2C通讯上。之前没有用过I2C通讯的DC-DC控制器,项目设计中缺少经验,对PMBus协议的使用也较为生疏。后续还要进一步优化代码以改进对MPQ4263的控制。
请注意,由于当前存在的问题,电源使用还存在不确定性,若要进行复刻请确保自己有修改的能力!
- MPQ4263输出问题1:输出斜率过大会突然掉压,然后输出保持在约3.8V,猜测可能出现了某种错误并陷入保护状态,等待解决。
- MPQ4263输出问题2:输出电压最高只能达到约26.5V,当电压高于这一值时无法继续增加,猜测也是受到了某种保护。
- MPQ4263工作问题:OPERATION寄存器写入似乎存在问题,还未确定具体情况。
9、大赛LOGO验证

大赛LOGO如上图所示。
10、演示您的项目并录制成视频上传
详见附件内容。
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。










