基于 CH32V003 和 INA219 的 USB 电流表
简介
一个基于 CH32V003 和 INA219 的 USB 电流表,支持 5~20V 电压和 0~5A 电流检测。
简介:一个基于 CH32V003 和 INA219 的 USB 电流表,支持 5~20V 电压和 0~5A 电流检测。开源协议
:CERN Open Hardware License
(未经作者授权,禁止转载)描述
之前群里划水看到沁恒的廉价 RISC-V 单片机 CH32V003,单片只要 7 毛钱,之前一直在用 ESP32,亟需了解一下这种便宜的单机应用单片机,因此拿它做了一个电流表来练练手。
电压、电流、功率、容量界面:
功率历史图表界面:
USB 电流表需求
因为 CH32V003 资源有限,因此也没有设计过多的功能,主要用来验证这个 MCU 的能力和熟悉一下 SDK 的使用,因此电流表的主要功能确定为以下内容:
- USB Type-C 输入与输出
- PD 协议透传
- 支持 5~20V 电压检测
- 支持 0~5A 电流检测
- 支持功率计算、容量统计
- 支持功率历史图表显示
- 支持统计数据记录与清除
- 按键切换电压电流数据与功率历史图表
- 使用 INA219 采集电压、电流相关数据
- 使用 12864 OLED 显示相关数据
CH32V003 介绍
CH32V003系列是基于青稞RISC-V2A内核设计的工业级通用微控制器,支持48MHz系统主频,具有宽压、单线调试、低功耗、超小封装等特点。CH32V003系列内置1组DMA控制器、1组10位模数转换ADC、1组运放比较器、多组定时器以及标准通讯接口USART、IIC、SPI等。
官网:https://www.wch.cn/products/CH32V003.html
主要参数:
- 青稞32位RISC-V2A处理器,支持2级中断嵌套
- 最高48MHz系统主频
- 2KB SRAM,16KB Flash
- 供电电压:3.3/5V
- 多种低功耗模式:睡眠、待机
- 上/下电复位、可编程电压监测器
- 1组1路通用DMA控制器
- 1组运放比较器
- 1组10位ADC
- 1个16位高级定时器和1个16位通用定时器
- 2个看门狗定时器和1个32位系统时基定时器
- 1个USART接口、1组IIC接口、1组SPI接口
- 18个I/O口,映像一个外部中断
- 64位芯片唯一ID
- 串行单线调试接口
- 封装形式:TSSOP20、QFN20、SOP16、SOP8
对于本项目来说,使用 12864 OLED 以及 INA219 需要 I2C 接口,按键需要使用普通 GPIO,UART 用于调试信息输出,SDIO 用于烧录,对比之后发现,TSSOP20 封装的 CH32V003F4P6 更适合,它相比使用 SOP8 封装的 CH32V003J4M6 拥有更多 GPIO,并且 UART 和 SDIO 也没有复用,可以更好地满足本项目的需求。
MCU
MCU 部分没有什么特别需要介绍的,供电 3.3V,加上 100nF 去耦电容。注意 CH32V003 使用 I2C 时,需要在 SCL SDA 加上上拉电阻。
这里虽然给 SPI 接口也加了网络标识,但实际并未使用。
USB Type-C 输入输出
为了保持电流表体积小巧,因此没有添加 USB Type-A 接口,输入输出均使用了 USB Type-C 16P 接头。为了不影响 PD 协议协商,因此将输入输出的 CC1 CC2 引脚直接连通。虽然其它引脚在 PD 协议中并无实际使用场景,但是为了保障兼容还是直接全部直连了。
这样使用有两点需要注意:
- 因为 CC1 CC2 没有连接 5.1K 下拉电阻,因此在使用 C-C 线及 PD 充电头时,由于充电头无法协商 PD 协议,因此不会供电,电流表也无法启动。
- 因为 CC1 CC2 是直接连接,中间无 MUX 芯片,因此在两端充电线在接反的情况下,同样无法协商 PD 协议。
又因为两边的 USB Type-C 接头是直通的,因此其实不存在哪头用于输入哪头用于输出的情况,随便哪一边接充电器侧都可以。
DCDC 供电
因为电流表本身没有额外供电,因此需要从待测量电压中取电,同时因为待测量电压会比较高,PD 协议中最高可以到 20V,因此需要使用耐压比较高的取电方案。
传统使用 AMS1117 芯片并不支持耐压 20V,因此更好的方案是使用 DCDC,在立创商城找了一番之后,确定使用 LGS5145,这款 DCDC 芯片输入电压可以从 4.5V~55V,足矣应对 PD 高电压的降压需求。
原理图直接根据 LGS5145 数据手册绘制,其中 R6 R7 是因为手上有这两个规格的电阻,实际使用过程中可以使用一个 30K 的电阻代替。C6 为前馈补偿电容,可以不焊。
INA219 电压电流测量
本电流表使用的电压电流测量元件为德州仪器 INA219。选择它主要是因为之前使用过,比较熟悉,而且也有现成的库可以使用。
INA219 是一款具备 I2C 或 SMBUS 兼容接口的分流器和功率监测计。该器件监测分流器电压降和总线电源电压,转换次数和滤波选项可通过编程设定。
INA219 的电压最大量程为 26V,在 PD2.0 100W 中,最大 20V 是足够使用的,但是如果碰到支持 PD3.1 140W,使用 28V 供电时,就会超量程了。但是目前看支持 140W 的充电器和设备都比较少,暂时不纠结这个问题。后续可以考虑使用 INA226 来代替,它具备更高的量程。
为了能测量比较高的电压,并且避免较大的发热,这里使用 10mR 的采样电阻,这样即使在 100W 20V 5A 时,功耗也只有 0.25W,实测 100W 长时间运行也不发烫。
屏幕及按键
本电流表使用常见的 0.96 寸 12864 OLED 屏幕作为显示设备,该屏幕操作比较简单,功耗也比较少,比较适合这种场景。另外由于 0.96 OLED 祼屏需要比较复杂的配套电路,为了简化制作,这里直接采用成品屏幕模块,通过排针焊接在 PCB 上。
2.54mm 排针的高度,刚好可以让屏幕与 PCB 保持一定的距离且不会压到 MCU 等其他元件。注意 U8 和 H2 为同一个接口,放置 U8 主要是为了定位位置,方便对齐。
按键使用普通侧按,低电平触发。
下载及调试
需要注意 CH32V003 系列需要使用 WCH Link-E 编程器,实际使用时只需要连接 V3.3、GND、SWDIO 即可烧录程序,如果电流表 Type-C 输入有供电,也可以只接 GND、SWDIO 烧录程序。
外壳及面板
外壳使用 3D 打印,底部留孔透出电源状态,顶部设有两个按钮操作电流表。
电流表面板采用立创面板定制服务,通过背胶直接粘贴在外壳上。不得不说,有了立创面板定制服务,DIY 产品显得越来越正规了。
程序功能
电流表程序就是一个死循环,读取电压、电流后计算功率及容量,并统计显示。
I2C 及 12864 OELD 驱动相关代码参考了 https://github.com/wagiminator/CH32V003-GameConsole 的实现。
实际测试屏幕刷新率约 40FPS,即电压、电流每秒采样 40 次。
功率历史曲线采用每分钟平均值来显示,横向 128 个点,即总共可以显示 128 分钟的功率历史,在一般场景下可以满足使用需求。
后记
这个电流表整体还是比较简单的,CH32V003 在使用过程中没有太多麻烦,主要碰到的问题是资源相对 ESP32 严重不足,以及没有硬件浮点计算,因此实际编码过程中直接全部使用 mV mA 等作为单位,使用整形进行计算。
另外 DCDC 电路反而是整个方案中元件最多的部分,后续考虑替换为高耐压 LDO 来实际,例如 HT7533,输入电压可以最高 30V,这样可以使电路更加简单,并且 MCU + OLED 总体功耗只有几个毫安,应该也不太会有严重的发热问题。
评论