如何自制一款一键式5-20V USB-C PD电压选择器
过去我曾研究过电源传输(PD)IC,它们非常适合从GaN充电器获取即时电压。我曾制作过一个简单的独立电路板,通过设置寄存器来选择不同的PD电压。但为何不采用单键设计并搭配一个10美分的微控制器,让设备更实用呢?无需OLED显示屏、旋转编码器或过度复杂的设计,只需一个简单的开关按钮和几个LED灯即可。本项目正是基于此理念,使用WCH硬件平台制造的CH224K USB PD接收控制器与CH32V003F4P6芯片完成。
原理非常简单:插入USB-C PD充电器后,按下按钮即可在5V、9V、12V、15V和20V之间循环切换,对应LED灯会亮起,提示当前激活的电压。我使用EasyEDA设计了电路,并通过JLCPCB生产了PCB,以实现这一功能。在本次分享中,我将提供代码和硬件文件,方便大家轻松搭建自己的设备。让我们开始吧。
什么是USB供电?
传统USB接口提供5V电压,仅此而已。USB PD是一种协议,允许充电器和设备通过USB-C线缆协商更高的电压和电流。典型的USB PD充电器可输出5V、9V、12V、15V和20V,最大功率为100W。这一技术在手机快充普及后变得尤为重要:由于手机内部电路会降压,从而以更高的电流对电池进行本地充电,因此可以实现更高电压的快速充电。
这种电压协商过程发生在USB-C连接器的CC(配置通道)线上。受电设备向供电端告知所需电压,而供电端则根据情况选择最接近的可用电压。这使得PD受电板对于创客和电子爱好者来说极为实用。这里我使用了一款专用芯片来实现这一功能:CH224K。它基于三个配置引脚(CFG1、CFG2、CFG3),可自动与PD电源协商电压。你可以使用固定电阻值,也可以通过微控制器驱动CFG引脚实现动态电压选择,而这正是我在此应用的方式。
CH224K的主要特点:
•支持USB PD 2.0和3.0协议可选输出电压:5V、9V、12V、15V 和 20V
•三个配置引脚(CFG1、CFG2、CFG3)用于电压选择
•电源就绪(PG)输出,用于指示电压已准备就绪
•内置CC下拉电阻,用于检测USB-C接口
•提供紧凑型SOP-10封装
•工作供电电压:3.3V 至 5.5V
选择适合动作的微控制器
主要问题是设备成本;我无法选择一个控制器,其价格超过设备本身的实际功能成本。CH32V003F4P6 是 WCH 的超低成本 MCU,售价仅为 0.10 美元。尽管价格低廉,它在本项目这类简单的控制任务中却表现得相当出色。
CH32V003F4P6的关键规格:
•核心:清科32位RISC-V2A架构,最高可达48MHz
•闪存:16KB
•SRAM:2KB
•封装:TSSOP-20(20针)
•GPIO:18个I/O引脚
•外设:USART、I2C、SPI、ADC、定时器
•工作电压:3.3V 至 5V
•成本:约 0.10 美元
本项目共使用了 9 个 GPIO 引脚,其中 3 个用于驱动 CH224K 的配置引脚,5 个用于指示 LED,1 个用于读取按钮状态。
所需元件
以下是本项目所用元件的完整清单:
•USB Type-C 连接器
•CH224K
•CH32V003F4P6
•LM317DCYR
•LED 灯
•1 kΩ 电阻
•10 kΩ 电阻
•分压电阻
•100 nF 电容
•1 µF 电容
•16 pF 电容
•按钮开关
•螺丝端子块
•JLCPCB 定制 PCB
电路图
USB Type-C 连接器为标准的 16 芯连接器。VBUS 引脚提供充电器的 PD 电压,CC1/CC2 线直接连接至 CH224K,用于 PD 通信。三个配置引脚 CFG1、CFG2 和 CFG3 分别连接到 MCU 的 PD2、PD3 和 PD4 引脚上。
VDD 线路上设有一个 10 kΩ 下拉电阻和去耦电容,以确保为 IC 提供干净的电源。CH224K 的 PG(电源良好)引脚通过一个 1 kΩ 电阻直接驱动 LED2,当输出电压达到对应值时,LED 就会亮起。我选择LM317是因为它能够处理较宽的输入电压范围,这一点在本设计中尤为重要,因为VDD电源轨的电压会随所选的PD电压而变化。无论输入端是5V还是20V,LM317都能将MCU的供电维持在稳定的3.3V。
注意:在将LM317电位器配置为3.3V后,请先焊接MCU;否则可能会烧坏MCU。
固件使用以下精确的表格来设置每个按键按下时的正确电压:
CFG1、CFG2、CFG3 和 电压值
1 - - 5V
0 0 0 9V
0 0 1 12V
0 1 1 15V
0 1 0 20V
PCB设计
我在EasyEDA中设计了紧凑的双层PCB板。布局结构如下:左侧为USB-C接口,中间为CH224K及其辅助元件,右侧为指示LED、按钮和输出端子。每根指示LED旁边都标有对应的电压等级(5V、9V、12V、15V、20V)的丝印标签。
电源正常指示LED和“PD ON”标签均位于CH224K区域附近。为了承载VBUS电流,我采用了更宽的走线,以应对USB PD所能提供的较高电流(最高可达20V下的5A,即100W)。LM317稳压器被放置在电路中央,并预留了足够的铜面积以实现良好的散热效果。我选择从JLCPCB定制了5块电路板,因为他们的性价比最高。我从未在使用JLC PCB时遇到过任何问题。请从这里获取您的制造文件(Gerber/BOM/CPL),然后立即开始制作。
固件说明
CH32V003的固件使用C语言编写,基于WCH的MounRiver Studio IDE及其标准外设库开发。代码简洁高效,仅完成三项任务:读取按钮状态、更新CH224K配置引脚,并点亮对应的LED灯。接下来我将逐一为您讲解各个部分。
GPIO配置:`GPIO_Config()`函数用于配置所有必要的引脚。首先,我们启用Port C和Port D的外设时钟:
接着,我们将PC0至PC4设置为LED的推挽输出,PC5设置为按钮的浮空输入(由于通过R2连接了外部10kΩ下拉电阻),同时将PD2至PD4设置为CH224K CFG引脚的推挽输出。最后,我们将所有LED引脚设置为高电平以关闭它们(请记住,这是低电平激活的配置)。
配置查找表:这部分非常巧妙。为了避免使用复杂的switch-case语句,我创建了三个查找表,直接将模式索引(0到4)映射到CFG引脚的状态:模式0为5V(CFG1=1,忽略CFG2/CFG3),模式1为9V(所有位为0),模式2为12V(CFG3=1),模式3为15V(CFG2=1且CFG3=1),模式4为20V(CFG2=1,CFG3=0)。`led_table`将每个模式映射到对应的LED引脚。这种方法比switch-case更简洁,且便于添加或重新排列模式。
设置CFG引脚:`setCFG()`函数接受三个参数(每个CFG引脚一个),并驱动相应的GPIO引脚为高电平或低电平:
这是使用WCH外设库函数进行的简单GPIO操作。`GPIO_SetBits`将引脚置为高电平,`GPIO_ResetBits`将其置为低电平。
应用当前模式:`applyMode()`函数将所有步骤整合在一起。它首先通过将LED引脚置为高电平来关闭所有LED,然后调用`setCFG()`函数,传入对应模式索引的查找表中的值,最后通过拉低相应引脚来开启正确的LED:
该功能在启动时(用于设置初始的5V模式)以及每次按钮被按下时都会被调用。
带去抖的按钮读取:`readButton()` 函数通过上升沿检测和去抖来处理按钮:
其工作原理如下:函数首先读取当前按钮状态,并与上一次状态进行比较。如果按钮刚刚从低电平变为高电平(即出现上升沿),则等待20毫秒进行去抖,然后再次读取按钮状态。如果去抖延迟后按钮仍保持为高电平,则说明确实发生了按键操作。此时模式索引会递增,当达到4时,自动回滚至0,并依次循环切换5V、9V、12V、15V和20V。
主循环:`main()` 函数较为简单,它初始化系统时钟、延时计时器和GPIO引脚,然后将默认模式设置为5V(模式索引0),并进入一个无限循环,持续轮询按钮状态。
我特意选择5V作为默认启动电压,因为这是最安全的选择。所有USB PD充电器都支持5V,不会对连接的设备造成损害。之后,用户可按按钮根据需要逐步提升电压。
电源正常指示灯
这个设计中一个我很喜欢的细节是电源正常指示灯(LED2)。该LED完全不受微控制器控制,而是通过一个1K电阻(R11)直接连接到CH224K的PG(电源良好)输出引脚。
当CH224K成功与PD协商出所需电压时,PG引脚变为高电平,LED2亮起。如果协商失败,PG引脚保持低电平,LED2则不亮。这为输出电压是否正确且稳定提供了独立的硬件级确认,尤其在开发和调试过程中非常有用。如果电压指示LED显示20V,但电源良好指示灯未亮,则可以立即判断充电器无法提供所需的电压。
测试与操作:
组装其中一台后,我将其打开!使用USB万用表串联在充电器上,以便监测电流并提供过流保护。因此,一旦发生异常,电路将自动关机。
在确认电路正常工作并测量空载电流后,我直接切换至充电器。
然后连接多用途表进行电压测量,以下是结果。
结语
这个USB PD电压选择器项目结合了两款出色的WCH芯片。只需按一次按钮,即可在5V、9V、12V、15V和20V之间切换,通过清晰的LED指示灯显示所选电压,并由硬件驱动完成电源状态确认。由于CH224K和CH32V003是各自类别中最经济实惠的芯片之一,该电路板的总成本非常低。固件简单、开源,若想添加如基于EEPROM的上次模式记忆或长按直接跳转至特定电压等功能,也易于修改。硬件设计简洁,所有元器件均容易获取。本项目可帮助您亲手制作自己的USB PD电压选择器。
本文编译自hackster.io





