当前位置: 首页 > news >正文

#第七届立创电赛# 基于国民技术N32G430与INA199的USB电流电压功率监测仪设计与实现

基于国民技术N32G430与INA199的USB电流电压功率监测仪设计与实现

最近在捣鼓一些USB小设备,比如充电宝、小风扇啥的,总想知道它们到底耗多少电。网上虽然有成品USB测试仪,但自己动手做一个,不仅能学到东西,还能完全按自己想法来,岂不是更有意思?正好借着立创电赛的机会,我把这个想法变成了现实。

今天要跟大家分享的,就是一个我自己设计制作的USB电流电压功率监测仪。它的核心是国民技术的N32G430单片机,搭配TI的INA199电流检测芯片,能把USB口的电压、电流和实时功率都测出来,并且显示在一块小巧的0.91英寸的OLED屏幕上。整个项目从电路设计、PCB打板到程序编写,都是自己一步步完成的。下面,我就把这个项目的完整过程,包括硬件怎么搭、软件怎么写、调试中踩了哪些坑,都详细地分享给大家。无论你是想复现这个项目,还是想学习N32G430或电流检测的知识,相信都能有所收获。

1. 项目整体思路与核心芯片选型

做这个监测仪,目标很明确:测量USB口的电压、电流,并计算出实时功率,最后直观地显示出来

要实现这个目标,我们需要解决几个关键问题:

  1. 电压怎么测?USB标准电压是5V,我们可以直接用单片机的ADC(模数转换器)去测量。
  2. 电流怎么测?电流不能直接测量,通常的做法是让电流流过一个已知阻值的小电阻(称为采样电阻),测量电阻两端的电压差,再根据欧姆定律(I = U/R)算出电流。这个电压差通常很小,需要专门的放大器来放大。
  3. 功率怎么算?功率(P)等于电压(U)乘以电流(I),所以测出电压和电流后,在单片机里做个乘法就行了。
  4. 结果怎么显示?用一块小屏幕最直观,OLED屏自发光、对比度高,在0.91英寸这个尺寸上显示效果很好。

基于以上思路,我选定了以下核心芯片:

  • 主控MCU:国民技术 N32G430C8L7这是一颗基于ARM Cortex-M4F内核的32位单片机,主频最高128MHz,性能足够。它内置了12位精度的ADC,正好用来测量电压。最关键的是,它性价比很高,资源也丰富,有48个引脚(LQFP48封装),完全能满足我们这个项目的需求。

  • 电流检测放大器:德州仪器 INA199A1这就是解决电流测量问题的“神器”。它是一个高侧电流检测放大器。简单来说,它可以测量串联在电源正极(高侧)的采样电阻两端的微小电压,并将其放大一个固定的倍数输出。我选用的是增益为50倍的A1版本。用它,我们就不需要自己搭复杂的运放电路了,非常方便可靠。

  • 电压转换芯片:AMS1117-3.3我们的单片机N32G430需要3.3V供电,而USB输入是5V,所以需要一个降压芯片。AMS1117-3.3是最常见、最经典的LDO(低压差线性稳压器)之一,电路简单,稳定可靠。

  • 显示模块:0.91英寸 OLED (I2C接口)这种屏幕很常见,通过I2C总线与单片机通信,只需要两根信号线(SCL, SDA),就能驱动显示,节省单片机IO口,编程也简单。

确定了核心芯片,整个项目的骨架就有了。接下来,咱们就看看电路具体怎么设计。

2. 硬件电路设计详解

硬件是整个项目的基础,设计好了,调试软件时事半功倍。我用的是立创EDA进行设计,下面分模块讲解。

2.1 电源与主控最小系统

首先得让单片机“活”起来。电源部分,USB口的5V电压(通过CN1或USB1接口输入)直接送到AMS1117-3.3的输入端,其输出端就是稳定的3.3V,给整个系统供电。记得在输入和输出端加上滤波电容,比如10uF和100nF的电容并联,可以滤除电源噪声,让系统更稳定。

注意:AMS1117是线性稳压器,工作时会发热。如果后续电流较大(比如屏幕、外设多了),要注意散热或考虑选用开关稳压方案。

对于N32G430的最小系统,有几点需要注意:

  • 复位电路:虽然芯片有内部复位,但为了可靠,我通常还是会加一个外部复位按键(SW2)和上拉电阻(R3)。
  • 启动模式:通过BOOT0引脚(我这里通过电阻R6下拉到地)选择从主Flash启动,这是最常用的模式。
  • 时钟:N32G430内部有高速RC振荡器(HSI),可以直接用。为了省事和节省空间,我这个项目没有使用外部晶振。原文里也提到了,因为手头没有风枪焊接金属外壳的晶振,所以直接用了内部时钟。对于这个监测应用,内部时钟的精度完全足够。如果你想用外部晶振,可以参考BOM里的8MHz晶振(X2)和负载电容(C11, C12)的电路进行连接。
  • 调试接口:我留出了一个6Pin的排针(H4),这是标准的SWD调试接口,用来下载程序和在线调试,必不可少。

2.2 电流检测电路(核心)

这是本项目最核心、也最需要仔细计算的部分。核心就是INA199芯片和采样电阻R4。

1. 采样电阻(R4)我选用的是一个0.01Ω(10毫欧)的精密贴片电阻,封装是2512,功率余量更足。它的作用就是让被测电流流过,产生一个微小的压降。为什么选这个阻值?我们来算算:假设最大测量电流为3A(对于大多数USB设备足够了),那么在R4上的压降 V_sense = I * R = 3A * 0.01Ω = 0.03V,也就是30mV。这个电压很小,功耗 P = I² * R = 3A * 3A * 0.01Ω = 0.09W,电阻也能承受。

2. INA199A1配置INA199的增益是固定的,我用的A1版本增益是50倍(V/V)。那么,当采样电阻上有30mV压降时,INA199的输出电压 V_out = V_sense * Gain = 0.03V * 50 = 1.5V。 INA199的供电电压(V+)我直接接USB的5V输入。它的输出(OUT引脚)连接到了单片机N32G430的某个ADC输入引脚(比如PA0)。同时,需要在输出端到地之间加一个滤波电容(如C10, 100nF)。

3. 计算关系最终,单片机ADC读到的电压值(V_adc)和实际电流(I)的关系如下:

  • V_sense = V_adc / Gain(Gain=50)
  • I = V_sense / R_shunt = V_adc / (Gain * R_shunt) = V_adc / (50 * 0.01) = V_adc / 0.5

所以,电流 I = ADC测量值 (单位:伏特) * 2。这个公式后面写程序时会用到。

2.3 电压测量与OLED接口

电压测量相对简单。USB的5V电压经过简单的电阻分压后,送入单片机的另一个ADC通道。比如,我用R1和R2组成分压电路,将5V分压到单片机ADC可安全测量的3.3V范围内。计算一下分压比,就能反推出实际的输入电压。

OLED显示模块通过I2C总线连接。只需要将模块的SCL、SDA引脚分别连接到N32G430的I2C引脚(如PB6, PB7),再接上电源和地即可。通常模块本身已带上拉电阻,如果通信不稳定,可以在总线上(SCL和SDA到3.3V)各加一个4.7kΩ - 10kΩ的上拉电阻。

主要的硬件连接关系,可以看下面这个简表:

功能模块关键元器件连接到MCU引脚作用与说明
电流检测INA199A1 (U3), 0.01Ω (R4)ADC引脚 (如 PA0)放大采样电阻压降,输出电流信号
电压检测分压电阻 (R1, R2)ADC引脚 (如 PA1)将5V分压至ADC量程内
系统供电AMS1117-3.3 (U4)VDD (3.3V), GND提供3.3V稳定电源
OLED显示0.91‘ OLED (I2C)I2C_SCL (如 PB6), I2C_SDA (如 PB7)显示电压、电流、功率值
程序调试6Pin SWD排针 (H4)SWDIO, SWCLK下载程序与调试

3. 软件程序设计思路

硬件搭好了,接下来就是让单片机“聪明”起来。软件部分主要围绕ADC采样OLED驱动展开。这里我先给出核心的逻辑流程和代码思路,具体的代码可以在项目开源仓库中找到。

3.1 程序主流程

整个单片机程序就像一个不停循环的小任务系统,主循环里主要做以下几件事:

  1. 初始化:一上电,先初始化系统时钟(使用内部HSI)、GPIO、ADC、I2C等外设。
  2. ADC采样:启动ADC,依次对连接电压分压和INA199输出的两个通道进行采样。为了读数稳定,通常需要连续采样多次然后取平均值。
  3. 数据计算
    • 电压值:根据ADC原始值、参考电压(3.3V)和分压电阻的比例,计算出实际的USB输入电压。
    • 电流值:根据ADC原始值、参考电压、INA199的增益(50)和采样电阻(0.01Ω),套用前面推导的公式计算出电流。电流 = (ADC值 / 4096 * 3.3V) * 2
    • 功率值:功率 = 电压 * 电流。计算时注意单位。
  4. OLED显示:将计算好的电压、电流、功率数值,格式化成字符串,通过I2C发送给OLED屏幕显示出来。
  5. 延时与循环:完成一次显示后,延时一段时间(比如200ms),然后回到第2步,开始新一轮的采样和显示。

3.2 关键代码片段解析

这里以国民技术N32 SDK为例,展示几个核心环节的代码逻辑。注意,实际代码需要包含完整的头文件和初始化配置。

ADC采样与读取(示例)

// 假设已经初始化好ADC1,通道0(PA0)测电流,通道1(PA1)测电压 uint16_t adc_read_channel(ADC_Module* ADCx, uint8_t channel) { ADC_ChannelConfig(ADCx, channel, ADC_SampleTime_239_5Cycles); // 配置采样通道和时间 ADC_StartOfConversion(ADCx); // 启动转换 while(!ADC_GetFlagStatus(ADCx, ADC_FLAG_EOC)); // 等待转换完成 return ADC_GetConversionValue(ADCx); // 读取转换值 } // 在主循环中采样并计算 float read_voltage(void) { uint32_t sum = 0; for(int i=0; i<10; i++) { // 采样10次取平均 sum += adc_read_channel(ADC1, ADC_CHANNEL_1); // 电压ADC通道 } float adc_avg = (float)sum / 10.0f; // 假设分压比为 R2/(R1+R2) = 0.66 (即5V->3.3V) // 参考电压Vref = 3.3V, ADC分辨率12位=4096 float voltage_adc = (adc_avg / 4096.0f) * 3.3f; // ADC引脚上的电压 float real_voltage = voltage_adc / 0.66f; // 反推回USB输入电压 return real_voltage; } float read_current(void) { uint32_t sum = 0; for(int i=0; i<10; i++) { // 采样10次取平均 sum += adc_read_channel(ADC1, ADC_CHANNEL_0); // 电流ADC通道 } float adc_avg = (float)sum / 10.0f; // INA199增益50,采样电阻0.01欧姆 // Vout = I * Rshunt * Gain // 所以 I = (Vout / Gain) / Rshunt = Vout / (50 * 0.01) = Vout / 0.5 float vout = (adc_avg / 4096.0f) * 3.3f; // INA199的输出电压 float current = vout / 0.5f; // 计算得到电流值,单位安培(A) return current; }

OLED显示数据(示例,基于某OLED驱动库)

// 假设已有OLED_ShowString等显示函数 void display_values(float voltage, float current, float power) { char buffer[20]; OLED_Clear(); // 清屏 sprintf(buffer, "V: %.2f V", voltage); OLED_ShowString(0, 0, (uint8_t*)buffer); // 第0行显示电压 sprintf(buffer, "I: %.3f A", current); OLED_ShowString(0, 2, (uint8_t*)buffer); // 第2行显示电流 sprintf(buffer, "P: %.2f W", power); OLED_ShowString(0, 4, (uint8_t*)buffer); // 第4行显示功率 OLED_Refresh(); // 更新到屏幕 }

4. 调试心得与常见问题

做完硬件和软件,第一次上电很可能不成功,调试是必经之路。这里分享几个我调试时遇到的问题和解决办法:

  1. INA199无输出或输出不准

    • 检查供电:首先用万用表测量INA199的V+引脚是否为5V,GND是否连接良好。
    • 检查输入:测量采样电阻R4两端是否有电压(接上负载时)。如果为0,可能是采样电阻虚焊或负载未接通。
    • 计算验证:根据采样电阻压降和增益,估算INA199的输出电压,再用万用表测量OUT引脚,看是否匹配。如果不匹配,检查INA199型号(增益是否正确)及外围电路。
  2. ADC采样值跳动大

    • 软件滤波:像上面代码那样,采用多次采样取平均的方法,能有效平滑数据。
    • 硬件滤波:在ADC输入引脚(即INA199输出和电压分压点)对地增加一个0.1uF的电容(如原理图中的C10),可以滤除高频噪声。
    • 电源稳定:确保给单片机的3.3V电源干净,模拟部分(ADC参考电压)的滤波电容要靠近MCU引脚。
  3. OLED不显示

    • 检查接线:确认I2C的SCL、SDA线是否接反,电源和地是否接对。
    • 检查地址:常用的OLED模块I2C地址是0x78或0x7A。用逻辑分析仪或单片机扫描I2C总线,确认地址是否正确。
    • 上拉电阻:如果I2C总线没有上拉电阻(模块内部可能没有),需要在SCL和SDA线上各接一个4.7kΩ电阻到3.3V。
  4. 测量值整体偏差

    • 校准:这是提高精度的关键。找一个已知准确的电压表(如万用表)和负载,测量实际的电压和电流。记录下此时你单片机读出的ADC原始值,计算出一个校准系数,在程序里进行修正。例如,真实值 = 测量值 * 校准系数

这个项目做下来,最深的体会就是:细节决定成败。一个电阻的虚焊、一个电容的缺失,都可能导致整个系统工作异常。调试时,耐心地、模块化地排查问题,从电源开始,到信号,再到软件逻辑,一步步来,最终一定能看到OLED屏上跳出正确的数字。希望这篇详细的分享能帮你少走弯路,成功做出属于自己的USB功耗监测仪。

http://www.jsqmd.com/news/476194/

相关文章:

  • CLIP-GmP-ViT-L-14图文匹配测试工具结合ComfyUI:构建可视化AI工作流
  • 3个核心价值:Navicat试用期重置工具的创新解决方案
  • 赋能内容创作:Nunchaku-flux-1-dev集成微信公众号小程序开发
  • 2026年诚信的大连散杂船品牌推荐:散杂船代理/大连散杂船出口/大连散杂船运输服务推荐榜 - 行业平台推荐
  • 2026年优秀的DCMM条件公司推荐:DCMM奖励政策/DCMM两化融合供应商怎么选 - 行业平台推荐
  • ACE-Step实战案例分享:如何用AI生成忧郁大提琴独奏+雨声环境音
  • CodeQL实战:如何用5分钟快速搭建你的第一个代码安全查询(附常见错误排查)
  • .NET Core微服务调用SmallThinker-3B-Preview模型实战
  • Gemma-3-12b-it多模态微调指南:LoRA适配图文任务的轻量训练流程
  • 2026年靠谱的管状带式输送机工厂推荐:圆管带式输送机/固定带式输送机/曲线带式输送机优质供应商推荐 - 行业平台推荐
  • Z-Image-Turbo_Sugar脸部Lora生成图像超分辨率对比:细节放大后的品质审视
  • 计算机组成原理启发:CasRel模型推理的GPU算力优化策略
  • DamoFD在智慧社区门禁系统落地:0.5G模型支撑多终端低延迟识别
  • 2026年深度解析与推荐:云智科技营销全智能体的效率革命和潜在挑战 - 品牌推荐
  • m4s-converter:B站缓存视频永久保存的技术密码
  • Qwen1.5-1.8B GPTQ与Dify集成:打造可视化AI工作流
  • 止痒去屑洗发水怎么挑?2026年这几款市场反馈不错,国内评价好的止痒去屑洗发水机构有哪些黛熙梦专注产品质量 - 品牌推荐师
  • Qwen2.5-1.5B开源模型教程:HuggingFace模型格式校验+tokenizer加载异常修复
  • 家事法律服务需求升级:2026年杭州主流离婚律师竞争力格局解析 - 品牌推荐
  • GD32VW553开发板光敏电阻传感器模块移植实战:ADC与GPIO双模式光照检测
  • OFA图像描述系统功能体验:支持上传图片和URL,生成描述超简单
  • DeEAR语音情感识别效果展示:电话信道压缩语音(8kHz)下的三维度识别准确率实测
  • 2026年深度解析与推荐:云智科技营销全智能体效率革命与潜在挑战 - 品牌推荐
  • 2026年评价高的切削液厂家推荐:金属切削液/镁合金切削液制造厂家哪家靠谱 - 行业平台推荐
  • Qwen3-VL-4B Pro保姆级教程:5分钟搭建你的AI看图说话助手
  • Qwen3-0.6B-FP8模型知识蒸馏:用思考模式指导小模型学习大模型思维
  • 2026年比较好的无缝三型瓶四型瓶检测设备厂家推荐:焊接三型瓶四型瓶检测设备/呼吸三型瓶四型瓶检测设备实力工厂推荐 - 行业平台推荐
  • Gemma-3-12b-it可持续AI实践:低功耗运行+绿色计算能效比优化
  • 影墨·今颜生成技术解析:从扩散模型原理到工程实现
  • 亚洲美女-造相Z-Turbo图文对话增强:结合CLIP引导提升亚洲特征语义对齐精度