描述
<h2>一、项目功能介绍</h2>
<p>在我平时的开发过程中,偶尔遇到需要测量低功耗设备的待机电流。可手头的万用表没有 μA 档,即使找来一块勉强能测的,也只能盯着跳动的数字脑补平均值,看不到电流曲线,也抓不住瞬态波动。市面上能记录 uA 电流波形的分析仪至少也需要 50 元甚至更高,大量运放和精密电阻复刻门槛也比较高。</p>
<p>这个项目的目的在于:用最低的成本,覆盖绝大多数开发者最基础的低功耗测量需求——能看数字、能看曲线、能接上位机分析。</p>
<ul>
<li>基于 CH32V003 与 INA226 搭建</li>
<li>双档自动量程:10Ω(μA 级小电流)/ 10mΩ(A 级大电流)</li>
<li>分辨率:0.1μA(10Ω)</li>
<li>电流量程:1μA – 8A(max)</li>
<li>电压量程:3.3V – 36V</li>
<li>采样率:7kHz+</li>
</ul>
<p>本地功能:</p>
<ul>
<li>标准数值:同屏显示电压、电流、功率</li>
<li>实时曲线:三档时基缩放,峰值/实时/均值统计</li>
<li>容量积分:0.01mAh / 0.01mWh 分辨率电量能量累计</li>
</ul>
<p>上位机:</p>
<ul>
<li>适配VOFA+开源上位机,界面流畅,但不支持数据统计,用于观察。</li>
<li>适配基于PyQt5开发的自制上位机,可手动选取统计平均电流与电量消耗等功能。</li>
<li>配套 Python 校准脚本,分段零点补偿与增益标定等。</li>
</ul>
<p>相对精度:</p>
<ul>
<li>A 档:实测相对偏差 ≤ 0.5%</li>
<li>μA 档:100μA 以上实测相对偏差 </li>
</ul>
<h2>二、项目属性</h2>
<p>本项目为原创设计,当前版本(v0.4)为首次公开。早期版本曾在开源广场发布。</p>
<p>未参与过任何比赛或学校答辩,未获得过相关奖项。</p>
<p>项目设计受开源社区 YQ-PCS、PowerPico 等优秀工程启发,但核心电路、固件代码及校准方法均为独立实现,未复用上述项目的电路或源码。</p>
<h2>三、开源协议</h2>
<p>本项目 <strong>100% 开源</strong>,采用 <strong>CC BY-SA 4.0</strong> 协议。</p>
<p>开源范围包括:</p>
<ul>
<li>固件源代码(CH32V003 全部源码)</li>
<li>原理图与 PCB 设计文件</li>
<li>PyQt5 自制上位机完整源码</li>
<li>Python 自动校准脚本</li>
<li>外壳 3D 打印文件</li>
</ul>
<p>协议要点:</p>
<ul>
<li><strong>署名</strong>:衍生项目须注明原作者</li>
<li><strong>相同方式共享</strong>:修改后的项目须以相同协议开源</li>
<li><strong>商业使用</strong>:无限制</li>
</ul>
<h2>四、硬件部分</h2>
<h3>1.信号架构</h3>
<p>主控采用 <strong>CH32V003J4M6 (SOP8)</strong>,在仅有的 <strong>6个可用I/O</strong> 空间内完成了复杂的闭环控制</p>
<h4>等效信号架构图</h4>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/b8c68127651242699c048ebb4fc18780.png" alt="image.png"></p>
<ul>
<li><strong>人机交互</strong>:PD1 兼具 SWD 下载与 SW1 输入功能;PD6 兼具 SW2 输入与串口发送功能。</li>
<li><strong>硬件保护</strong>:PA2 引脚通过外部中断监听 INA226 的 <code>ALERT</code> 信号,实现微秒级硬件强行切档。</li>
<li><strong>物理切换</strong>:PC4 引脚驱动 PMOS 网络,完成 10Ω 与 15mR 采样电阻的量程切换。</li>
<li><strong>数据总线</strong>:PC1/PC2 硬件 I2C 引擎同时驱动 OLED 显示与 INA226 高速采样(EEPROM没有使用)。</li>
</ul>
<h3>2.功率架构</h3>
<p>系统支持最高 <strong>36V</strong> 宽压输入,通过 MOS 网络实现量程的无缝切换,并配备了独立的硬件级防反接保护。</p>
<h4>等效功率路径流程图</h4>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/0733d0868f4b4240b01cf221f3d84da8.png" alt="image.png"></p>
<h5>(1)防护与防反接</h5>
<ul>
<li>
<p><strong>过压保护</strong>:入口处配置 TVS 管,吸收插拔瞬间的高压浪涌。</p>
</li>
<li>
<p><strong>反压保护</strong>:相比传统二极管,使用低内阻 PMOS 实现电源反接保护,极大降低了大电流下的压降与发热。</p>
</li>
<li>
<p><strong>G 极安全</strong>:所有功率 PMOS 的栅极(Gate)均配有分压与泄放电路,确保在高电压(>20V)输入时 $V_{GS}$ 不会超过击穿阈值。电路经过特殊设计,上拉或泄放都在电阻前取电,不会对电流测量精度产生额外干扰。</p>
<h5>(2)双路采样切换网络</h5>
</li>
<li>
<p><strong>采样点分配</strong>:电流进入主路后,首先固定连接至 INA226 的 <strong>IN+</strong> 采样点。</p>
</li>
<li>
<p><strong>并联支路</strong>:系统通过一组由 <code>CTRL</code> 引脚控制的复合 MOS 网络进行档位切换:</p>
<ul>
<li><strong>A 档</strong>:电流流经 <strong>10mR</strong> 采样电阻,支持大电流通过。</li>
<li><strong>uA 档</strong>:电流切换至 <strong>10Ω</strong> 采样电阻,实现微安级分辨率。</li>
</ul>
</li>
<li>
<p><strong>驱动级隔离</strong>:使用独立的 <strong>NMOS</strong> 作为底层驱动,将 MCU 的 3.3V 逻辑信号与 36V 功率级安全隔离,实现可靠的栅极拉低。</p>
<h5>(3)逻辑供电</h5>
</li>
<li>
<p><strong>高压宽幅</strong>:采用 40V 高耐压 LDO,封装选用 <strong>SOT-223</strong> 以获得更大的散热面积,保证在高压差工况下不会热保护触发。</p>
</li>
<li>
<p><strong>隔离二极管</strong>:LDO 前端设有专门的隔离二极管。当后端接有大电容负载且瞬间拉低电压时,该二极管能防止 LDO 输入端电压产生倒流,确保单片机不断电。</p>
</li>
</ul>
<h2>五、软件部分</h2>
<h3>1.本地功能演示</h3>
<h4>(1)标准视图</h4>
<p><strong>实时数值</strong>:同屏显示电压、电流、功率。
<strong>手动去皮</strong>:长按左键触发,左侧进度条动态显示进度,完成后标志闪烁。
<strong>档位指示</strong>:右侧滑块实时反馈当前硬件处于 <strong>10R(uA)</strong> 还是 <strong>20mR(A)</strong> 档位。
<strong>PC 模式入口</strong>:双键按下切换至上位机模式,屏幕进入静默状态以节省 I2C 带宽。</p>
<p><img src="//image.lceda.cn/pullimage/Mp80k1g8aA3rWsJjsqrVhtv2j1lJ4t6n7qGhpOWw.gif" alt="video_20260429_.gif"></p>
<h4>(2)实时曲线</h4>
<p><strong>统计指标</strong>:实时显示 <strong>PEEK (峰值)</strong>、<strong>NOW (实时)</strong>、<strong>AVG (均值)</strong>。
<strong>手动清零</strong>:长按左键触发,清除统计与曲线缓冲区。
<strong>速度调节</strong>:长按右键调节 S 档位,支持三档时间轴缩放。
<strong>模式切换</strong>:双键按下切换显示 <strong>A (电流)</strong>、<strong>W (功率)</strong>、<strong>V (电压)</strong>。 </p>
<p><img src="//image.lceda.cn/pullimage/6VxHYAgOiap5PYo1tdIsGfTzawrTA35IDYGY0Oet.gif" alt="video_20260429_.gif"></p>
<p>> 相信你已经发现,机内的曲线由于屏幕画幅大小,只能进行降采样显示,也许你注意到了一个200-300的PEEK值,但想要看清到底发生了什么,还得是靠上位机。</p>
<h4>(3)容量统计</h4>
<p><strong>高精积分</strong>:支持 0.01mAh / 0.01mWh 分辨率的电量与能量累计。
<strong>运行控制</strong>:长按右键手动暂停/开启统计任务,右侧 RUN/STOP 拨杆指示。
<strong>数据重置</strong>:长按左键执行清零,C 字符闪烁反馈操作成功。 </p>
<p><img src="//image.lceda.cn/pullimage/hZ0fK8orY1UCwRNZ2edS4qg4RJap6RYHEbjKs2T8.gif" alt="video_20260429_.gif"></p>
<h3>2.上位机功能演示</h3>
<ul>
<li><strong>1.5 Mbps 串口上报</strong>:通过 UART DMA 链路,将机内校准过的<strong>净值</strong>组包输出。</li>
<li><strong>VOFA+ 完美适配</strong>:通过 <code>JustFloat</code> 协议,原生适配。</li>
<li><strong>Python Bridge</strong>:配套 Python 脚本实现“数据防洪”与“对齐重组”,引入一个带过滤的缓冲区,避免信号差导致<strong>错帧</strong>将VOFA卡死。</li>
</ul>
<p><img src="//image.lceda.cn/pullimage/QOYZnCUu2SwJiEuKl9yERpIqXLTHSDMmNm1qilNU.gif" alt="video_20260429_.gif"></p>
<hr>
<h3>3.校准与精度</h3>
<p>受限于作者本人的实验条件,所提及的精度默认为<strong>相对精度</strong>
由于元器件寄生参数的影响以及个体差异,此项目的最高精度只能<strong>接近于基准设备</strong>。</p>
<p>优于存储限制与操作考虑,没有设计机内校准,用户需要刷入 <strong>校准专用固件</strong>,通过串口连接 <strong>Python 自动化脚本</strong> 进行标定后,直接修改源码进行编译烧录。</p>
<h5>(1) 电压比例校准</h5>
<p>电压校准是所有后续计算的基准,必须首先完成。</p>
<ul>
<li><strong>操作流程</strong>:将设备接入可调电源,使用万用表测量输出端电压,将实测值填入 Python 脚本。脚本会自动计算出 <code>cal_v_lsb_nv</code>(每 LSB 对应的纳伏数)。</li>
<li><strong>线性度表现</strong>:经过实测,在 <strong>3V - 36V</strong> 全量程范围内,单点 LSB 的最大极差在<strong>2300nV</strong>,但事实上这个数值远超我的万用表极限精度,所以<strong>图像无参考意义</strong>,一般仅需测量 1-3 个点即可获得不错的线性回归结果。</li>
</ul>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/23def22df39c4b02880f0368444fcb76.png" alt="image.png"></p>
<ul>
<li>
<p><strong>真伪判定</strong>:作者测试了多块 INA226 芯片,发现有概率买到地址是与原厂规格不同的 <code>0x44</code> ,其内部基准源偏差巨大,实测 LSB 甚至可能出现在 <strong>$1,182,000$</strong> ,差值高达 <strong>$68,000\text{ nV}$</strong>(误差近 <strong>5.4%</strong>),而地址相同的<code>0x40</code>情况较好,但也不能完全确定为正品。</p>
<ul>
<li>
<p><strong>TI 官方标称值</strong>:$1,250,000\text{ nV}$ ($1.25\text{ mV}$)。</p>
</li>
<li>
<p><strong>假货典型值</strong>:约 <strong>$1,189,000\text{ nV}$</strong> 左右。</p>
</li>
</ul>
</li>
<li>如果你的校准值大幅偏离 $1.25\text{ mV}$,说明该芯片大概率并非 TI 原装正品。但即便如此,<strong>通过自动化标定修正后依然不影响日常高精度使用</strong>,这正是校准系统的核心价值所在。</li>
</ul>
<hr>
<h5>(2) 零点地图校准</h5>
<p>在实际测试中,我发现底数呈现出<strong>非线性、非单调</strong>的特征,且在 <strong>3V - 4V</strong> 的区间抖动剧烈。</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/fc26c1ffadb14f41b309b4c5ca8f71ee.png" alt="image.png"></p>
<h6>a.可能的猜测</h6>
<ul>
<li><strong>uA 档位</strong>:其底数随总线电压(VBUS)的变化产生剧烈波动(偏置可达数百 LSB)。
<ul>
<li>源于电路中并联的 <strong>“旁路保护二极管”</strong>。该二极管的作用是作为“缓冲桥梁”,防止系统在从 uA 档偶遇动态负载,由于切档不及时压降导致后级掉线。然而,二极管的结电容与正向漏电会随共模电压升高而增加,干扰采样。</li>
<li>源于 INA226 自身的偏置及 PCB 寄生参数</li>
<li>当输入小于3.6v时,由于LDO前防倒灌二极管的存在,VCC将从3.3V跌落至约3V附近,VCC的变动可能加剧了上一条带来的影响。</li>
</ul></li>
<li><strong>A 档位</strong>:偏置一般较小(通常在 $\pm 3$ LSB 以内)。</li>
</ul>
<h6>b.解决方案:多段线性补偿</h6>
<p>为了修正这些没有规律的物理偏置,我设计了一个<strong>动态零点补偿引擎</strong>。它不再使用单一的固定值去皮,而是通过记录关键拐点,拟合出一条随电压变化的补偿曲线。</p>
<h6>c.操作步骤</h6>
<ol>
<li><strong>输入基准</strong>:启动 Python 脚本,填入上一步校准得到的 <code>cal_v_lsb_nv</code>。</li>
<li><strong>空载扫描(档位 A)</strong>:确保设备<strong>未接入任何负载</strong>。缓慢调节可调电源,将电压从 <strong>3V 连续提升至 36V</strong>。脚本会实时记录每个电压点对应的 $S_RAW$ 原始底数。</li>
<li><strong>空载扫描(档位 B)</strong>:按下设备<strong>左键</strong>切换电阻档位。将电压从 <strong>36V 再次缓慢调节回 3V</strong>。</li>
<li><strong>智能压缩与生成</strong>:停止脚本。Python 内部的 <strong>RDP 特征提取算法</strong> 会自动剔除冗余数据,将数百个采样点压缩为十余个关键“拐点”,并直接生成标准的 C 语言结构体代码。(压缩率可调)</li>
<li><strong>固件更新</strong>:将生成的 <code>table_10mr</code> 和 <code>table_100r</code> 数组复制并替换到 <code>power_app.c</code> 中。</li>
</ol>
<hr>
<h5>(3) 分段线性增益校准</h5>
<p>即便解决了零点漂移,由于功率路径上 <strong>MOSFET 的导通压降、保护二极管的非线性特征</strong>,整体电流曲线依然不是一条完美的直线,我们用相同的方法进行校准。</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/d3a522948cf941ec8d7b729d6efd1269.png" alt="image.png"></p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/f08d84c19631454f81e32b5ef923c77b.png" alt="image.png"></p>
<h6>a.测量策略:如何获得“真值”?</h6>
<ul>
<li><strong>uA 档位 (微电流)</strong>:大多数手持万用表的电流档在 $300\mu A$ 以下的分辨率和内阻表现都不尽如人意,但电阻档一般还算可以接受,所以我们可以用一颗电阻作为负载,测量杜邦线两断的准确电阻,配合上一步校准准的电压值,利用<strong>欧姆定律 ($I = V/R$)</strong> 倒推出真实电流。</li>
<li><strong>A 档位 (大电流)</strong>:此档位下采样电阻功率较大,且负载阻值会随温度剧烈跳变。所以建议直接使用万用表的 <strong>10A 档</strong>串联在回路中,以万用表的实时读数作为校准基准。</li>
</ul>
<h6>b.操作流程</h6>
<ol>
<li><strong>准备任务单</strong>:在 Python 脚本目录下编辑 <code>resistors.txt</code>,或是也可以在脚本运行时手动输入。按从小到大的顺序填入你准备好的电阻阻值或电流点( 如 <code>100KR</code>, <code>10R</code>, <code>1.5A</code> )。</li>
<li><strong>启动脚本</strong>:运行校准向导,脚本会引导你先输入电压补偿值,然后进行双档位的空载去皮。</li>
<li><strong>循环采样</strong>:按照脚本提示依次接入负载。每接入一个,按回车确认。
<ul>
<li>脚本会根据当前实测的 VBUS 电压和你的负载阻值,实时计算出物理世界的<strong>真实电流值</strong>。</li>
</ul></li>
<li><strong>随时中止</strong>:如果你不需要跑完整个列表,可以随时输入 <code>Y</code> 提前结束并进入计算阶段。</li>
<li><strong>生成增益表</strong>:Python 脚本会分析每一个采样点的表现阻值,自动计算出对应的比例因子,并生成一组 <code>GainPoint_t</code> 结构体代码。</li>
</ol>
<h6>c.结果应用</h6>
<p>将脚本最后生成的 <code>gain_table_10mr</code> 和 <code>gain_table_10r</code> 完整复制并粘贴到固件源码中。</p>
<hr>
<h5>(4) 校准后精度实测对比</h5>
<p>为了直观展示校准后的实测效果,我拿出了仅有的万用表 <strong>众仪 ZT-A6</strong> 作为参考基准(其直流电流档标称精度为 $\pm(1.0\% + 4)$。</p>
<h6>A 档位电流对比表</h6>
<table>
<tr>
<th style="text-align:left;">测试点</th>
<th style="text-align:left;">万用表参考值 (Ref)</th>
<th style="text-align:left;">本设备读数 (Device)</th>
<th style="text-align:left;">绝对误差</th>
<th style="text-align:left;">相对偏差 (%)</th>
</tr>
<tr>
<td style="text-align:left;">1</td>
<td style="text-align:left;">99.0 mA</td>
<td style="text-align:left;">99.1 mA</td>
<td style="text-align:left;">+0.1 mA</td>
<td style="text-align:left;">+0.10%</td>
</tr>
<tr>
<td style="text-align:left;">2</td>
<td style="text-align:left;">198.0 mA</td>
<td style="text-align:left;">198.2 mA</td>
<td style="text-align:left;">+0.2 mA</td>
<td style="text-align:left;">+0.10%</td>
</tr>
<tr>
<td style="text-align:left;">3</td>
<td style="text-align:left;">297.7 mA</td>
<td style="text-align:left;">298.1 mA</td>
<td style="text-align:left;">+0.4 mA</td>
<td style="text-align:left;">+0.13%</td>
</tr>
<tr>
<td style="text-align:left;">4</td>
<td style="text-align:left;">595.2 mA</td>
<td style="text-align:left;">592.2 mA</td>
<td style="text-align:left;">-3.0 mA</td>
<td style="text-align:left;">-0.50%</td>
</tr>
<tr>
<td style="text-align:left;">5</td>
<td style="text-align:left;">992.8 mA</td>
<td style="text-align:left;">992.5 mA</td>
<td style="text-align:left;">-0.3 mA</td>
<td style="text-align:left;">-0.03%</td>
</tr>
<tr>
<td style="text-align:left;">6</td>
<td style="text-align:left;">1.489 A</td>
<td style="text-align:left;">1.488 A</td>
<td style="text-align:left;">-0.001 A</td>
<td style="text-align:left;">-0.07%</td>
</tr>
<tr>
<td style="text-align:left;">7</td>
<td style="text-align:left;">1.788 A</td>
<td style="text-align:left;">1.785 A</td>
<td style="text-align:left;">-0.003 A</td>
<td style="text-align:left;">-0.17%</td>
</tr>
<tr>
<td style="text-align:left;">8</td>
<td style="text-align:left;">2.087 A</td>
<td style="text-align:left;">2.084 A</td>
<td style="text-align:left;">-0.003 A</td>
<td style="text-align:left;">-0.14%</td>
</tr>
<tr>
<td style="text-align:left;">9</td>
<td style="text-align:left;">2.483 A</td>
<td style="text-align:left;">2.483 A</td>
<td style="text-align:left;">0.000 A</td>
<td style="text-align:left;"><strong>0.00%</strong></td>
</tr>
<tr>
<td style="text-align:left;">10</td>
<td style="text-align:left;">2.990 A</td>
<td style="text-align:left;">2.978 A</td>
<td style="text-align:left;">-0.012 A</td>
<td style="text-align:left;">-0.40%</td>
</tr>
<tr>
<td style="text-align:left;">11</td>
<td style="text-align:left;">3.478 A</td>
<td style="text-align:left;">3.479 A</td>
<td style="text-align:left;">+0.001 A</td>
<td style="text-align:left;">+0.03%</td>
</tr>
<tr>
<td style="text-align:left;">12</td>
<td style="text-align:left;">3.978 A</td>
<td style="text-align:left;">3.975 A</td>
<td style="text-align:left;">-0.003 A</td>
<td style="text-align:left;">-0.08%</td>
</tr>
<tr>
<td style="text-align:left;">13</td>
<td style="text-align:left;">4.975 A</td>
<td style="text-align:left;">4.972 A</td>
<td style="text-align:left;">-0.003 A</td>
<td style="text-align:left;">-0.06%</td>
</tr>
<tr>
<td style="text-align:left;">14</td>
<td style="text-align:left;">5.975 A</td>
<td style="text-align:left;">5.973 A</td>
<td style="text-align:left;">-0.002 A</td>
<td style="text-align:left;">-0.03%</td>
</tr>
<tr>
<td style="text-align:left;">15</td>
<td style="text-align:left;">6.975 A</td>
<td style="text-align:left;">6.974 A</td>
<td style="text-align:left;">-0.001 A</td>
<td style="text-align:left;">-0.01%</td>
</tr>
<tr>
<td style="text-align:left;">16</td>
<td style="text-align:left;">7.98 A</td>
<td style="text-align:left;">7.98 A</td>
<td style="text-align:left;">0.00 A</td>
<td style="text-align:left;"><strong>0.00%</strong></td>
</tr>
</table>
<p><img src="//image.lceda.cn/pullimage/YVg3sEa2yQFy5ynSUsX0F0nWO82Mr73Z2JOMbV5f.gif" alt="video_20260429_011800_.gif"></p>
<hr>
<h4>uA 档位电流对比表</h4>
<p>针对 <strong>uA(微电流)</strong>,市面上的入门级万用表,在低量程段几乎无法提供参考价值。</p>
<p>我采用了前文提到过的 <strong>“精密电阻 + 欧姆定律回算”</strong> 的方式,使用 <strong>QPLCR3S 电桥镊子</strong>(精度 0.6%)对负载电阻进行标定,并根据实测电压得出理论电流基准。
在下表中,<strong>参考电流 ($I_{Ref}$)</strong> 的计算公式为:$I<em>{Ref} = V</em>{实测} / R_{电阻}$。</p>
<table>
<tr>
<th style="text-align:left;">测试负载 (R)</th>
<th style="text-align:left;">实测电压 (V)</th>
<th style="text-align:left;">参考电流 ($I_{Ref}$)</th>
<th style="text-align:left;">本设备读数</th>
<th style="text-align:left;">ZT-A6 万用表</th>
<th style="text-align:left;">相对偏差</th>
</tr>
<tr>
<td style="text-align:left;"><strong>330 Ω</strong></td>
<td style="text-align:left;">3.210 V</td>
<td style="text-align:left;"><strong>9.727 mA</strong></td>
<td style="text-align:left;"><strong>9.718 mA</strong></td>
<td style="text-align:left;">9.6 mA</td>
<td style="text-align:left;">-0.09%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>428.3 Ω</strong></td>
<td style="text-align:left;">3.231 V</td>
<td style="text-align:left;"><strong>7.544 mA</strong></td>
<td style="text-align:left;"><strong>7.539 mA</strong></td>
<td style="text-align:left;">7.5 mA</td>
<td style="text-align:left;">-0.06%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>559.4 Ω</strong></td>
<td style="text-align:left;">3.249 V</td>
<td style="text-align:left;"><strong>5.808 mA</strong></td>
<td style="text-align:left;"><strong>5.806 mA</strong></td>
<td style="text-align:left;">5.8 mA</td>
<td style="text-align:left;">-0.03%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>815.6 Ω</strong></td>
<td style="text-align:left;">3.267 V</td>
<td style="text-align:left;"><strong>4.006 mA</strong></td>
<td style="text-align:left;"><strong>4.004 mA</strong></td>
<td style="text-align:left;">4.1 mA</td>
<td style="text-align:left;">-0.05%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>1.591 kΩ</strong></td>
<td style="text-align:left;">3.287 V</td>
<td style="text-align:left;"><strong>2.066 mA</strong></td>
<td style="text-align:left;"><strong>2.065 mA</strong></td>
<td style="text-align:left;">2.0 mA</td>
<td style="text-align:left;">-0.04%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>3.274 kΩ</strong></td>
<td style="text-align:left;">3.297 V</td>
<td style="text-align:left;"><strong>1.007 mA</strong></td>
<td style="text-align:left;"><strong>1.007 mA</strong></td>
<td style="text-align:left;">1.1 mA</td>
<td style="text-align:left;">-0.00%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>4.281 kΩ</strong></td>
<td style="text-align:left;">3.300 V</td>
<td style="text-align:left;"><strong>770.8 $\mu$A</strong></td>
<td style="text-align:left;"><strong>770.6 $\mu$A</strong></td>
<td style="text-align:left;">0.8 mA</td>
<td style="text-align:left;">-0.02%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>6.766 kΩ</strong></td>
<td style="text-align:left;">3.302 V</td>
<td style="text-align:left;"><strong>488.2 $\mu$A</strong></td>
<td style="text-align:left;"><strong>488.0 $\mu$A</strong></td>
<td style="text-align:left;">0.5 mA</td>
<td style="text-align:left;">-0.04%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>10.98 kΩ</strong></td>
<td style="text-align:left;">3.304 V</td>
<td style="text-align:left;"><strong>300.9 $\mu$A</strong></td>
<td style="text-align:left;"><strong>301.0 $\mu$A</strong></td>
<td style="text-align:left;">-0.0 mA (下限)</td>
<td style="text-align:left;">+0.03%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>15.92 kΩ</strong></td>
<td style="text-align:left;">3.305 V</td>
<td style="text-align:left;"><strong>207.6 $\mu$A</strong></td>
<td style="text-align:left;"><strong>207.6 $\mu$A</strong></td>
<td style="text-align:left;"></td>
<td style="text-align:left;">-0.00%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>33.06 kΩ</strong></td>
<td style="text-align:left;">3.306 V</td>
<td style="text-align:left;"><strong>100.0 $\mu$A</strong></td>
<td style="text-align:left;"><strong>100.0 $\mu$A</strong></td>
<td style="text-align:left;"></td>
<td style="text-align:left;">-0.00%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>68.1 kΩ</strong></td>
<td style="text-align:left;">3.306 V</td>
<td style="text-align:left;"><strong>48.54 $\mu$A</strong></td>
<td style="text-align:left;"><strong>48.3 $\mu$A</strong></td>
<td style="text-align:left;"></td>
<td style="text-align:left;">-0.49%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>159.4 kΩ</strong></td>
<td style="text-align:left;">3.307 V</td>
<td style="text-align:left;"><strong>20.74 $\mu$A</strong></td>
<td style="text-align:left;"><strong>20.5 $\mu$A</strong></td>
<td style="text-align:left;"></td>
<td style="text-align:left;">-1.15%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>331.2 kΩ</strong></td>
<td style="text-align:left;">3.307 V</td>
<td style="text-align:left;"><strong>9.98 $\mu$A</strong></td>
<td style="text-align:left;"><strong>9.6 $\mu$A</strong></td>
<td style="text-align:left;"></td>
<td style="text-align:left;">-3.80%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>675.5 kΩ</strong></td>
<td style="text-align:left;">3.307 V</td>
<td style="text-align:left;"><strong>4.89 $\mu$A</strong></td>
<td style="text-align:left;"><strong>4.8 $\mu$A</strong></td>
<td style="text-align:left;"></td>
<td style="text-align:left;">-1.84%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>1.585 MΩ</strong></td>
<td style="text-align:left;">3.307 V</td>
<td style="text-align:left;"><strong>2.08 $\mu$A</strong></td>
<td style="text-align:left;"><strong>2.0 $\mu$A</strong></td>
<td style="text-align:left;"></td>
<td style="text-align:left;">-3.84%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>3.284 MΩ</strong></td>
<td style="text-align:left;">3.307 V</td>
<td style="text-align:left;"><strong>1.00 $\mu$A</strong></td>
<td style="text-align:left;"><strong>0.9 $\mu$A</strong></td>
<td style="text-align:left;"></td>
<td style="text-align:left;">-10.0%</td>
</tr>
</table>
<p><img src="//image.lceda.cn/pullimage/mBAOrtBpjPy6c7POuvcH14FVqki4pzzmQmB508lg.gif" alt="video_20260429_.gif"></p>
<hr>
<h3>4.采样率档位</h3>
<h4>(1)同步采样</h4>
<p>在本设备的主程序循环频率突破了 <strong>10.5 kHz</strong>。这带来了一个小问题:</p>
<ul>
<li><strong>性能过剩</strong>:单片机跑一圈仅需约 95μs,而 INA226 的物理采样周期最快也要 140μs。</li>
<li><strong>时序冲突</strong>:如果不加控制,串口会发回约 <strong>40% 的重复包</strong>。</li>
</ul>
<p>但我们唯一的Alert引脚被用来切档,所以只能采用固定发送间隔,尽量让单片机的对齐 ADC 的更新节奏,但此方法比较吃226的体制,值得一提的是反而假货在此处性能更强。</p>
<ul>
<li>0x44地址的假货:130us间隔,重复率<0.8%。</li>
<li>0x40疑似正品:148us间隔,重复率<2.2%; 140us间隔,重复率<3.3%。</li>
</ul>
<h4>(2)采样率与精度</h4>
<p>由于有人询问我是否可以使用TPA626来代替假货泛滥的INA226,所以我重新测试了大概率正品的INA226,与绝对是正品的TPA626,得出了下列数据与结论。</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/292e30854f76465e87cbfb7824fad8dd.png" alt="image.png">
从RMS噪声来看,我甚至怀疑是我的测试有问题,但两款芯片用的完全相同的代码,高情商的说,TPA626不适合复刻此设备,尤其是多次平均对626的RMS噪声起到的作用很小。</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/07cfb4c915644809be769351f6c9e164.png" alt="image.png"></p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/44176dbbeaea418c8e50b147f1eec40d.png" alt="image.png"></p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/be729d405a7f42aeaeeb6f29e32a8988.png" alt="image.png">
值得注意的是,虽然626的规格书写的ADC conversion time最低档位只有66us,但经过测试实际<strong>约为142us</strong>,但巧合的是,他反而和INA226规格书的值几乎一模一样。</p>
<hr>
<h4>(3)使用建议</h4>
<ul>
<li><strong>PC 上位机模式</strong>:建议 <strong>0档 (VeryFast)</strong>,获取最高动态响应,虽然从VOFA中看抖动剧烈,但使用我们自己的上位机,对区域进行平均后高度可用。</li>
<li><strong>本地 GUI 模式</strong>:可以根据需求选择 std 档或 slow 档,平衡显示的稳定性与灵敏度。</li>
<li><strong>开发者提示</strong>:代码中已预留了四种预设档位的 <code>DeltaT</code> 定义,你可以根据效率脚本的分析结果,通过修改宏定义实现精准同步。</li>
</ul>
<hr>
<h4>(4) 深度配置与逻辑微调</h4>
<h5>a.上位机模式:带宽策略</h5>
<p>在 PC 模式下,串口带宽和 I2C 总线带宽是极其宝贵的资源。</p>
<ul>
<li><strong><code>PC_LINK_WITH_VOLT</code></strong>:
<ul>
<li><code>0</code> (默认):仅采集并上报电流数据。</li>
<li><code>1</code>:同时采集电压和电流。采样率会减半。</li>
</ul></li>
</ul>
<h5>b. GUI 模式:自适应数字滤波</h5>
<p>本项目针对非 PC 模式下的本地显示设计了二级滤波系统,确保在高频采样下数值依然平稳。</p>
<ul>
<li><strong>滤波逻辑</strong>:系统以 <code>INA226_RATE_STANDARD</code> 为分界线。
<ul>
<li>当采样率高于此值时,由于底噪大,自动应用 <strong><code>FILTER_DEPTH_FAST</code></strong>(深层滤波)。</li>
<li>当采样率较低时,硬件本身已自带积分滤波,故应用 <strong><code>FILTER_DEPTH_STD</code></strong>(浅层滤波)以保持响应速度。</li>
</ul></li>
</ul>
<h5>c. 智能量程切换:自动降档算法</h5>
<p>为了防止档位在临界点频繁跳变(震荡),系统引入了带有阈值和计数器的降档逻辑。</p>
<ul>
<li><strong>降档原理</strong>:只有当电流处于 <strong>10mR 档</strong> 且同时满足以下两个条件时,才会切回 <strong>uA 档</strong>。
<ul>
<li><strong>条件 1:压值阈值</strong>。补偿后的 <code>raw_diff</code> 需低于满量程的 <strong><code>BACK_TO_UA_PERCENT</code></strong></li>
<li><strong>条件 2:持续时间</strong>。需连续 <strong><code>BACK_TO_UA</code></strong> 次检测均满足阈值,以滤除瞬时毛刺,防止误触发。</li>
</ul></li>
<li><strong>注</strong>:升档(uA -> A)由硬件 <code>ALERT</code> 中断瞬间完成(优先级最高),而降档由本逻辑控制,但不建议设置的过于保守,尤其是面对射频。</li>
</ul>
<h2>六、BOM清单</h2>
<p>请输入内容…</p>
<p>> 注:项目涉及的BOM清单。在嘉立创EDA 生成/上传设计文件后,BOM将自动生成至项目详情;建议包括型号、品牌、名称、封装、采购渠道、用途等内容。具体内容和形式应以表达清楚项目构成为准。</p>
<h2>七、大赛LOGO验证</h2>
<p>请上传包含大赛logo的项目图片,logo以丝印形式印刷在PCB上面。</p>
<p>点击zip下载大赛logo标识! (大赛标识).zip</p>
<h2>八、演示您的项目并录制成视频上传</h2>
<p>视频要求:请横屏拍摄,分辨率不低于1280×720,格式Mp4/Mov,单个视频大小限100M内;</p>
<p>视频标题:立创电赛:{项目名称}-{视频模块名称};如立创电赛:《自动驾驶》-团队介绍。</p>
<p>视频冲榜:项目制作过程中,可随时录制视频上传至B站、小红书、视频号、抖音号,冲榜人气奖励 >,优秀项目可获得立创官方全域曝光机会;</p>
<p>前往查看更多详情 ></p>
评论(0)