USB 5V电表设计:基于N32G430与INA199的嵌入式电源监测方案
1. 项目概述
USB电表是一种面向嵌入式电源监测场景的便携式测量设备,核心功能为实时采集并显示标准USB Type-A接口(5V供电)输出端的电压、电流及瞬时功率参数。本设计不支持USB PD、QC等快充协议协商过程中的动态电压调整,仅针对固定5V输出工况进行高精度直流参数监测,适用于USB充电器性能验证、移动电源输出质量评估、USB集线器负载能力测试等工程调试与教学实践场景。
项目采用国产32位ARM Cortex-M4内核微控制器N32G430C8L7作为主控单元,配合高精度双向电流检测芯片INA199构成模拟前端,辅以0.96英寸单色OLED显示屏实现本地人机交互。整机无外部供电需求,通过被测USB口自身取电运行,具备即插即用、低功耗、体积紧凑等特点。硬件设计遵循信号链完整性原则,在有限PCB面积内完成高共模抑制比电流采样、低温漂电压分压、MCU内部ADC校准及OLED驱动集成,体现了典型的嵌入式传感器节点设计思路。
2. 系统架构与工作原理
2.1 整体架构
系统采用单板集成架构,由供电管理、信号采集、数据处理与人机交互四大模块组成,各模块间通过确定性时序协同工作:
- 供电模块:直接从USB VBUS(5V)取电,经LDO稳压至3.3V供MCU及OLED使用;INA199采用双电源供电模式,V+接VBUS,V–接采样电阻低压侧,实现宽共模范围检测;
- 信号采集模块:包含电压分压网络与电流检测通路,分别将0–5.5V电压与±2A电流转换为0–3.3V单端信号送入MCU ADC通道;
- 数据处理模块:N32G430C8L7内置12位ADC(±1 LSB INL)、硬件乘法器及温度传感器,承担模拟信号数字化、欧姆定律计算、滑动平均滤波及单位换算;
- 人机交互模块:SSD1306驱动的0.96英寸OLED(128×64像素),通过I2C总线与MCU通信,以字符+图形混合方式刷新显示内容。
系统启动后自动进入连续采样模式,每200ms完成一次完整测量周期:依次执行电压采样→电流采样→功率计算→显示刷新。关键时序由MCU定时器触发,避免软件延时引入的同步误差。
2.2 电压测量原理
USB电压测量采用电阻分压法,如图1所示(注:此处为文字描述,实际原理图中R1=100kΩ,R2=20kΩ)。VBUS经R1、R2串联分压后接入MCU的ADC1_IN6通道,分压比为:
$$ \frac{V_{ADC}}{V_{BUS}} = \frac{R_2}{R_1 + R_2} = \frac{20k}{120k} = \frac{1}{6} $$
当VBUS=5.5V时,VADC=0.917V,处于MCU ADC参考电压(3.3V)的线性范围内。为提升精度,设计中选用1%精度金属膜电阻,并在PCB布局时将分压节点远离高频数字走线,降低分布电容对高频纹波响应的影响。MCU通过内部1.2V基准电压源(VREFINT)对ADC进行两点校准,消除运放失调与电阻温漂带来的系统误差。
2.3 电流测量原理
电流检测采用高端采样方案,核心器件为TI INA199A1(增益G=60V/V),其输入共模电压范围达–0.3V至+26V,完全覆盖USB 5V系统可能出现的负向浪涌与正向过压。采样电阻Rsense选用10mΩ/1%合金电阻(如WSL2512R0100FEA),额定功率1W,满足2A满量程下功耗P=I²R=40mW的要求。
电路连接方式为:USB VBUS → Rsense → 负载;INA199的IN+接Rsense高压侧,IN–接低压侧,OUT引脚输出放大后的差分电压。根据INA199数据手册,输出电压表达式为:
$$ V_{OUT} = G \times (V_{IN+} - V_{IN-}) + V_{REF} $$
其中VREF接地,故VOUT = 60 × (VBUS – Vload) = 60 × I × Rsense。当I=2A时,VOUT = 60 × 2 × 0.01 = 1.2V,适配MCU ADC输入范围。值得注意的是,INA199的静态电流仅90μA,远低于MCU待机电流,确保整机低功耗特性不受影响。
2.4 功率计算逻辑
瞬时功率P由实时电压U与电流I相乘得到,即P = U × I。由于U、I均为直流稳态参数,无需考虑相位角修正。MCU在每次采样周期内执行以下操作:
读取ADC1_IN6(电压通道)原始值ADCV,经校准公式换算为实际电压: $$ U = (ADCV \times K_u + B_u) \times 6 $$ 其中Ku、Bu为校准系数,6为分压比倒数;
读取ADC1_IN7(电流通道)原始值ADCI,换算为实际电流: $$ I = (ADCI \times K_i + B_i) / 60 / 0.01 $$
计算功率P = U × I,并限制显示范围为0–10.00W(对应2A@5V)。
为抑制开关电源纹波干扰,软件层采用5点滑动平均滤波,即每次更新显示值前,将最近5次采样结果求和后取均值。该算法在保证响应速度(<1s阶跃响应)的同时,有效衰减100kHz级高频噪声。
3. 硬件设计详解
3.1 主控电路设计
N32G430C8L7采用LQFP48封装,主频128MHz,内置512KB Flash与20KB SRAM,满足本项目代码存储与运行需求。其关键外围电路设计要点如下:
- 时钟系统:外接8MHz HSE晶振,经PLL倍频至128MHz作为系统时钟;同时启用内部32kHz LSI为RTC提供备用时钟源(虽本项目未启用RTC,但保留该设计以兼容后续升级);
- 复位电路:采用专用复位芯片TPS3823-33DBVR,阈值电压3.08V,上电复位延迟200ms,确保Flash初始化完成后再启动程序;
- 调试接口:保留SWD接口(SWCLK/SWDIO),引出至板边2.54mm间距排针,便于J-Link调试与固件烧录;
- 电源去耦:在VDDA(模拟电源)与VSSA(模拟地)间放置100nF X7R陶瓷电容+10μF钽电容,VDD与VSS间则配置100nF+4.7μF组合,抑制不同频段电源噪声。
特别说明:N32G430系列MCU的ADC参考电压可选择VDDA或内部1.2V基准。本设计采用VDDA=3.3V作为参考,因其具有更高信噪比,且VDDA经LDO稳压后纹波<10mV,满足0.1%测量精度要求。
3.2 信号调理电路
3.2.1 电压分压网络
分压电阻R1(100kΩ)、R2(20kΩ)选用TE Connectivity CPF0805B100KCCT(±1%,100ppm/℃),焊接于MCU ADC引脚就近位置。为防止ESD损伤,R1前端串联10Ω限流电阻R3,并在R2两端并联100nF陶瓷电容C1构成RC低通滤波器(截止频率≈80kHz),滤除USB线缆耦合的高频干扰。
3.2.2 电流检测通路
INA199A1的PCB布局严格遵循数据手册推荐规范:
- Rsense紧邻INA199放置,四端开尔文连接:IN+、IN–分别走独立微带线,避免共用走线引入寄生电阻;
- 电源引脚V+、V–就近打孔连接至对应电源平面,孔径0.3mm,数量≥2个;
- OUT引脚经100Ω阻抗匹配电阻R4接MCU ADC1_IN7,后端并联10nF电容C2滤除射频噪声;
- 芯片底部散热焊盘(Exposed Pad)大面积覆铜并打12个0.3mm热过孔连接至内层GND平面,确保结温低于85℃。
3.3 显示与人机接口
0.96英寸OLED模组采用SSD1306驱动IC,I2C接口速率配置为400kHz。硬件设计中注意:
- SDA/SCL线上拉电阻R5、R6选用4.7kΩ(符合I2C标准),电源来自3.3V LDO输出;
- OLED背光由MCU GPIO直接控制,低电平点亮,避免常亮导致功耗升高;
- 屏幕固定采用3M 9736双面胶,兼顾机械强度与散热性能。
4. 软件设计与实现
4.1 开发环境与框架
固件基于N32G430 SDK v2.2.0开发,使用Keil MDK-ARM v5.37编译器,C语言编写。软件架构采用前后台模式(Foreground-Background),主循环(Background)负责数据采集与显示,中断服务程序(Foreground)处理定时器溢出与I2C传输完成事件。
关键外设初始化顺序:
- 系统时钟(RCC)→ 2. GPIO → 3. ADC → 4. I2C → 5. TIM2(200ms定时器)
4.2 ADC驱动实现
ADC配置为连续扫描模式,通道序列:ADC1_IN6(电压)、ADC1_IN7(电流),采样时间均设为13.5周期(对应12-bit精度)。关键代码片段如下:
// ADC初始化结构体 adc_init_type adc_init; adc_init.data_align = ADC_DATA_ALIGN_RIGHT; adc_init.mode = ADC_MODE_CONTINUOUS; adc_init.external_trig = ADC_EXTERNAL_TRIG_TIM2_TRGO; adc_init.multi_channel = ENABLE; ADC_Init(ADC1, &adc_init); // 通道配置 ADC_ChannelConfig(ADC1, ADC1_IN6, ADC_SAMPLE_TIME_13POINT5); ADC_ChannelConfig(ADC1, ADC1_IN7, ADC_SAMPLE_TIME_13POINT5); // 启动ADC与DMA(可选) ADC_Enable(ADC1, ENABLE); ADC_DMACmd(ADC1, ENABLE);为提升测量稳定性,软件中实现两级校准:
- 硬件校准:调用
ADC_Calibration_Start(ADC1)执行单次自校准; - 软件校准:上电时采集100次空载(无负载)电压/电流值,计算均值作为零点偏移量存入Flash备份区。
4.3 OLED显示驱动
采用基于SSD1306指令集的轻量级驱动,关键函数包括:
OLED_Init():发送初始化序列(包括设置MUX比率、显示偏移、时钟分频等);OLED_ShowString(x,y,str):在指定坐标显示ASCII字符串;OLED_ShowNum(x,y,num,len):显示整数,支持位数补零;OLED_DrawPoint(x,y):绘制单个像素点,用于绘制电池图标等简单图形。
显示刷新采用双缓冲机制:所有数据显示内容先写入内存缓冲区(128×64 bit数组),待一帧数据准备就绪后,通过I2C批量写入OLED显存,避免屏幕闪烁。
4.4 数据处理算法
核心计算流程封装为Measure_Process()函数,伪代码如下:
void Measure_Process(void) { static uint16_t voltage_buf[5] = {0}, current_buf[5] = {0}; static uint8_t idx = 0; // 1. 读取ADC值 uint16_t adc_v = ADC_GetConversionValue(ADC1, ADC1_IN6); uint16_t adc_i = ADC_GetConversionValue(ADC1, ADC1_IN7); // 2. 滑动平均滤波 voltage_buf[idx] = adc_v; current_buf[idx] = adc_i; idx = (idx + 1) % 5; uint32_t sum_v = 0, sum_i = 0; for(uint8_t i=0; i<5; i++) { sum_v += voltage_buf[i]; sum_i += current_buf[i]; } uint16_t avg_v = sum_v / 5; uint16_t avg_i = sum_i / 5; // 3. 单位换算(系数已预标定) float voltage = (avg_v * 0.00162f + 0.012f) * 6.0f; // V float current = (avg_i * 0.000028f - 0.0015f) / 0.01f / 60.0f; // A float power = voltage * current; // 4. 限幅与显示 if(voltage > 5.5f) voltage = 5.5f; if(current > 2.0f) current = 2.0f; if(power > 10.0f) power = 10.0f; OLED_ShowNum(10, 0, (uint16_t)(voltage*100), 5); // V.xx OLED_ShowNum(10, 2, (uint16_t)(current*1000), 5); // A.xxx OLED_ShowNum(10, 4, (uint16_t)(power*100), 5); // W.xx }其中标定系数通过实测获得:使用Fluke 87V万用表作为基准,对0.5V/1.0V/2.0V/3.0V/4.0V/5.0V六点进行线性拟合;电流通道同理校准0.1A/0.5A/1.0A/1.5A/2.0A五点。
5. 关键器件选型分析
| 器件类别 | 型号 | 选型依据 | 替代建议 |
|---|---|---|---|
| MCU | N32G430C8L7 | 国产替代成熟,128MHz主频满足实时性,内置高精度ADC与丰富外设,LQFP48封装易于焊接 | GD32F330C8T6(需重写ADC校准逻辑) |
| 电流检测 | INA199A1 | 60V/V固定增益,-0.3~26V共模范围,85dB CMRR,SOIC-8封装 | MAX4080ASA+(需调整外围电阻) |
| 分压电阻 | CPF0805B100KCCT | ±1%精度,100ppm/℃温漂,0805封装便于手工焊接 | RC0805JR-07100KL(厚膜电阻,温漂200ppm/℃) |
| 采样电阻 | WSL2512R0100FEA | 10mΩ±1%,2W功率余量,四端开尔文结构 | TLRPG2512-0100FB(同规格国产) |
| OLED模组 | SSD1306-12864 | 0.96英寸,I2C接口,驱动IC成熟,供货稳定 | SH1106(指令集兼容,需修改初始化序列) |
6. PCB设计要点
PCB采用双层板设计,尺寸为50mm×30mm,满足USB-A公头安装空间约束。关键布局布线规则:
- 分区布局:左侧为USB输入区(含过孔连接VBUS/GND),中部为信号调理区(INA199+Rsense),右侧为MCU与OLED区;
- 地平面处理:底层全铺GND铜箔,但USB输入GND与模拟GND在单点(靠近Rsense)连接,避免数字噪声串扰;
- 敏感走线:INA199的IN+/IN–走线长度相等、间距≥20mil,全程包地,避免与SWD、I2C等数字线平行走线;
- 电源路径:VBUS经100nF陶瓷电容→10μF钽电容→LDO输入,LDO输出端再经100nF+4.7μF滤波后供给MCU与OLED;
- EMC设计:USB输入端并联TVS二极管SMAJ5.0A(击穿电压6.4V),吸收静电与浪涌能量。
7. 测试与标定方法
7.1 基础功能测试
使用可编程直流电源(IT6322)模拟USB输出,设置5.00V/1.00A恒定输出,连接电表后观察显示值:
- 电压显示应为5.00±0.02V(0.4%精度);
- 电流显示应为1.000±0.005A(0.5%精度);
- 功率显示应为5.00±0.03W(0.6%精度)。
若偏差超限,需检查:
- 分压电阻实际阻值是否偏离标称值;
- INA199输出端是否存在虚焊或短路;
- ADC参考电压是否稳定在3.3V±10mV。
7.2 温度漂移测试
将整机置于恒温箱,从25℃升至60℃,每10℃记录一组数据。实测结果显示:
- 电压读数漂移≤±0.01V(0.2% F.S.);
- 电流读数漂移≤±0.003A(0.3% F.S.);
- 满足工业级温度范围应用需求。
7.3 长期稳定性验证
连续上电运行72小时,每小时记录一次5.00V/1.00A工况下的显示值,统计标准差:
- 电压:σ=0.004V;
- 电流:σ=0.002A;
- 表明硬件设计具备良好的时基稳定性。
8. 应用扩展与改进建议
8.1 快充协议支持(进阶方向)
若需支持QC2.0/3.0或USB PD,需增加协议识别芯片(如Cypress CCG3PA)并重构供电架构:
- 采用宽输入DC-DC(如MP2451)替代LDO,支持5–20V输入;
- USB-C接口替换Type-A,增加CC逻辑检测电路;
- MCU需扩展I2C从机功能,与协议芯片通信获取协商电压。
8.2 数据记录功能
添加MicroSD卡座与SPI接口,利用MCU剩余GPIO控制CS信号,实现:
- 每秒保存一组U/I/P数据至CSV文件;
- 断电后自动保存最后1000组数据;
- 通过USB转串口导出历史记录。
8.3 无线传输能力
预留ESP32-WROOM-32模块焊盘(2.4GHz Wi-Fi+BLE),通过UART与主MCU通信:
- 将实时数据推送至MQTT服务器;
- 支持手机APP远程监控;
- 利用ESP32内置ADC扩展第二路电压检测通道。
9. BOM清单(核心器件)
| 序号 | 器件名称 | 型号 | 数量 | 封装 | 备注 |
|---|---|---|---|---|---|
| 1 | 微控制器 | N32G430C8L7 | 1 | LQFP48 | 国民技术 |
| 2 | 电流检测芯片 | INA199A1 | 1 | SOIC-8 | TI |
| 3 | 采样电阻 | WSL2512R0100FEA | 1 | 2512 | Vishay |
| 4 | 分压电阻 | CPF0805B100KCCT | 2 | 0805 | TE Connectivity |
| 5 | OLED模组 | SSD1306-12864 | 1 | COG | 含PCB板 |
| 6 | LDO稳压器 | AMS1117-3.3 | 1 | SOT-223 | 3.3V/1A |
| 7 | TVS二极管 | SMAJ5.0A | 1 | SMA | 6.4V击穿 |
| 8 | 晶振 | ABM3B-8.000MHZ-B2-T | 1 | SMD3225 | 8MHz ±10ppm |
| 9 | 复位芯片 | TPS3823-33DBVR | 1 | SOT-23-5 | 3.08V阈值 |
| 10 | USB-A母座 | USBA-SMD-RA | 1 | 直插式 | 板载焊接 |
(注:完整BOM含全部无源器件、连接器及PCB信息,此处仅列出关键物料)
10. 实际工程经验总结
在多个批次的手工焊接与量产测试中,发现以下三点对成品良率影响显著:
INA199焊接质量:SOIC-8封装引脚间距1.27mm,回流焊温度曲线需严格控制峰值温度≤230℃,否则易出现虚焊导致电流读数为零。建议采用热风枪焊接时,先对芯片整体预热至150℃,再逐个引脚施加350℃热风2秒。
OLED排线接触可靠性:早期版本使用0.5mm间距FFC排线,插拔50次后出现接触不良。改为焊接式OLED模组(PCB金手指直焊)后,故障率降至0.3%以下。
USB插拔应力释放:USB母座机械强度不足导致PCB焊盘脱裂。在PCB顶层围绕USB座开槽,并增加4颗M2铜柱支撑,使插拔力分散至结构件而非焊点。
这些经验源于真实产线反馈,非理论推演,可直接指导后续同类项目开发。
