描述
<h1>1.项目功能介绍</h1>
<p><img src="//image.lceda.cn/pullimage/F6bVJavwD7IQwZzVuoOhHKYUfIGp7fLhvqANRF6v.png" alt="image.png">
之前做了一个以电池供电的低功耗移动设备。为了评估电池寿命需要知道设备在一个休眠周期消耗的电量。因为设备的工作电流是不断变化的,一般的万用表难以胜任,所以需要一个能测量、记录、分析电流变化的精密功率计。但是这种仪器专业级的非常贵,为了一个练手的项目不划算,用示波器加放大电路又不够方便。于是就催生了此项目。</p>
<p>本项目是一个小型的便携的精密功率计,<strong>最高可以实现1uA的电流测量</strong>。带有一个2.4寸的QVGA屏幕,可以记录设备的电流消耗情况或电源的电压变化,并且以图形化的方式显示,方便进行供电或者功耗分析。机身自带电池,支持完全离线操作,无需上位机,同时也可以上传采样数据至PC进行更加详细的数据分析。支持触发采样功能,可以方便对偶发事件进行记录。最高100SPS的采样率,满足大多数场景下的需求。</p>
<p>特性:</p>
<ul>
<li>数字电压表和电流表功能</li>
<li>2.4寸彩色LCD显示屏</li>
<li>电压表量程:0~5.5V,分辨率0.01V,电流表量程:0 ~ 1A,分辨率0.1uA(有效值1uA)</li>
<li>采样率:最高100SPS, 最低0.01SPS</li>
<li>最高采样深度6kpts</li>
<li>数据记录、回放和图表显示功能</li>
<li>支持游标,可随时回看采样记录</li>
<li>支持触发采样,工作模式:自动、手动、条件</li>
<li>条件触发支持电压和电流触发</li>
<li>触发边沿:上升、下降</li>
<li>支持数据上传(通过USB通用串口协议)</li>
<li>内置700mA电池,可离线使用最高4个小时,充电方式:USB TYPE-C</li>
<li>更多特性演示可以参考视频</li>
</ul>
<p>本项目硬件部分100%使用立创EDA进行设计。</p>
<p>本项目软件、硬件完全开源,可以浏览、下载本项目资源,或在此基础上进行二次开发,但是禁止未授权的商用。</p>
<h1>2.项目属性</h1>
<p>本项目为首次公开,为本人原创项目。项目未曾在别的比赛中获奖。</p>
<h1>3.开源协议</h1>
<p>本项目完全开源,包括PC端的上位机代码和MCU端的代码。使用GPL3.0协议分发。</p>
<h1>4.硬件部分</h1>
<h2>基本工作原理</h2>
<p>设备的基本工作原理如图所示。这个项目本质上就是一个封装的电压表加上电流表,不过额外的增加了对测试结果的采样、存储、处理功能,这样可以用于观察电压或者电流随时间的变化情况,亦或者对指定时间段的数据进行分析。</p>
<p><img src="//image.lceda.cn/pullimage/CtoNr9k49x3SPkSNPnAn5HPxIw95XUXErcb3evYp.png" alt="image.png"></p>
<h2>PCB概览</h2>
<h3>背面</h3>
<p><img src="//image.lceda.cn/pullimage/xzXyKaWZBYTOErkTCT1fY6W2FXgHZdERBo8vxAFi.png" alt="image.png"></p>
<h3>正面</h3>
<p><img src="//image.lceda.cn/pullimage/YMRAL3Y8jt6Dntux1o7Xr8q4CzdItHAdJPI06Q0g.png" alt="image.png"></p>
<h2>硬件结构</h2>
<p>项目的硬件结构主要由以下部分构成:</p>
<ul>
<li>采样和放大电路</li>
<li>模数转换器(ADC)</li>
<li>电源管理模块</li>
<li>输入(用户按键)与输出模块(LCD和USB-UART)</li>
<li>MCU <img src="//image.lceda.cn/pullimage/0IvZCkC8nAkp8sMqk4jeJHzC8pgBHGjsUZ0vG0VN.png" alt="image.png"></li>
</ul>
<h2>采样和放大电路</h2>
<h3>电流采样和放大电路概览</h3>
<h4>原理图</h4>
<p><img src="//image.lceda.cn/pullimage/BqkvGjonyh5g7Hk1Gg4JDirV6RW2ZO57I7mGsSGH.png" alt="image.png"></p>
<h4>PCB图</h4>
<p><img src="//image.lceda.cn/pullimage/5LzvpeppXjVvjnhimutZJPUvcQ9rmbqSXBmqM4xM.png" alt="image.png"></p>
<p>电流的采样是本项目的重点。在本项目中,使用了采样电阻低边电流采样的方式来对电流进行采样。因为本项目设计时的最高电流分辨率达到了0.1uA,而电流的最大量程为1A,两者相差达一千万倍的,如果通过单采样电阻实现,那么不仅采样电阻要选择更高阻值的型号,而且需要使用运放对采样结果进行1000倍以上的放大,这样可能会在测量结果中引入大量的误差和噪音。所以,本项目使用了两个不同阻值的采样电阻。其中,低阻值(0.1Ω)的电阻用于大电流时的采样,高阻值(10Ω)的电阻用于微小电流时的采样。然后对于每个采样电阻上的采样结果分别通过运放进行二级放大,并且将每级放大的结果全部引出。这样一来,总共可以拥有四档量程,且每档量程的放大倍率都在正常范围内(10~100倍的数量级),在每个量程的范围内都可以充分发挥ADC的最大分辨率。最后经过对放大比例的调节,可以最终在硬件上实现最低0.1uA分辨率(有效值最低为1uA),最高999mA的高测量范围的设计目标。</p>
<h3>量程切换电路</h3>
<p><img src="//image.lceda.cn/pullimage/dprChC9zYUotmXlpK0fX5SMAaPiiIYsVVjczrzjf.png" alt="image.png">
因为使用了两个采样电阻,如果两个采样电阻始终接入电路,那么在电流较大时,大阻值采样电阻上的压降将变得十分可观(0.1A的电流时将会有1V的压降),这一方面会带来发热,另一方面会导致输出端的电压下降,可能影响输出端设备的正常使用。所以为了解决这个问题,本项目设计了一个量程切换电路,在电流较大(本项目中设定的阈值为10mA)时,通过一个MOSFET,将大阻值的采样电阻短路,然后在电流小于该阈值时再关闭此MOSFET,将采样电阻接入电路。这样,就完美解决了大电流下,高阻值采样电阻上的压降问题。</p>
<h3>电流放大电路</h3>
<p><img src="//image.lceda.cn/pullimage/MPwm7sAvkrq7I2P9A2aDxT2a1ZTkR6TFuqowGtdS.png" alt="image.png">
每个采样电阻对应的放大电路都由二级运放放大电路组成,其中初级放大电路使用差分放大方式,以进一步减小导线上的电阻带来的误差,二级放大电路则使用通用的正反馈放大。对于本项目而言,初级放大电路的放大倍率为33倍(10xADC测量范围),次级放大电路的放大倍率为9.2(约10)倍。两级的放大结果均引入ADC,加上另一个采样电阻的两级输入,总共有四级放大结果通过四个通道输入ADC。因为两个采样电阻间的阻值相差100倍,所以对于同一个电流信号,ADC将同时获得这个信号的x10,x100,x1000,x10000共四级输入(即四个档位),这样ADC就可以在自己的动态范围内,选择合适的档位来作为最终的输出结果。</p>
<h3>电压放大电路</h3>
<p>电压不是本项目的重点,因为通常情况下,我们使用过的电源都是恒压电源,电压不会产生较大的拨动,而且基本上也不会存在对超低电压(如小于1V)的测量需求。比起电压, 我们更关心的是电流的变化情况(市面上的有些同类仪器甚至不具备电压测量功能,就是单纯的高精度电流计)。所以,本项目设计的电压测量范围为0~5.5V,分辨率0.01V。</p>
<p><img src="//image.lceda.cn/pullimage/iTL6eYR4yGqqA64OreAlBmh4wmC6MDTpwHQQIosa.png" alt="image.png"></p>
<p>具体的电压采样使用一个差分放大(衰减)电路实现,将输入电压衰减2.13倍,这样在ADC的范围为0~3.3V的情况下,最高容许7V左右的电压输入,相对于0~5.5V的设计目标,既留足了余量,也可以充分发挥ADC的性能,实现0.01V的分辨率。</p>
<h3>运放选型</h3>
<p>电流信号放大部分,使用了两个高精度、零偏移的双路R2R运放COS8552,分别负责两个采样电阻上的信号的放大</p>
<p><img src="//image.lceda.cn/pullimage/tLGNSEhhsZ5jVob2axh5NqeksIcTOXUAcJcY1HiT.png" alt="image.png"></p>
<p>电压放大部分因为要求不高,所以使用了通用的单通道运放RS321</p>
<p><img src="//image.lceda.cn/pullimage/9ov8p6RCJjyjrS9CuQYXIuQ6pkwZjIwjEKZxywlP.png" alt="image.png"></p>
<h2>ADC</h2>
<p>由之前的介绍,我们可以看到ADC至少需要5个通道才能满足需求,即4个电流通道和一个电压通道。而且为了实现100SPS的采样率,ADC的采样速率也必须高于这个设计目标。而多通道、高分辨率、高采样率的ADC是非常昂贵的。因为我们对ADC各个采样通道的要求是不同的,我们希望更高的电流分辨率,但是对于电压的分辨率要求不高,所以出于最优化的选择,本项目选择使用独立的ADC对电流通道进行采样,而电压和其他模拟通道(如电池电量和摇杆输入)则使用MCU内置的ADC进行采样。</p>
<p>用于电流采样的独立ADC最终选择了ADS1115这个型号,具有4通道16bit的分辨率,使用IIC方式与MCU通讯,最高采样率为860SPS,满足本项目的需求。
<img src="//image.lceda.cn/pullimage/x7phMRzlj7jXWxM2patVbBx91z5syIcpm9vi0eRC.png" alt="image.png"></p>
<h2>电源管理</h2>
<h3>电池和充放电管理</h3>
<p>为了使用方便并且满足完全离线使用的设计需求,本项目选择了内置锂电池的方案。锂电池的充放电管理使用经典的TP4056来实现,设计锂电池容量为700mAh,尺寸编码为642745(64mmx27mm长宽,厚4.5mm)</p>
<p><img src="//image.lceda.cn/pullimage/WoNgRFeHSgMYd0o7qdqcEtfg7av83X6CUd4q5dUh.png" alt="image.png"></p>
<p>PCB版上对应的电池安装位置:</p>
<p><img src="//image.lceda.cn/pullimage/xrydVQZYC0ZYJJRy5nuX1vhGaTK5PuHCcvZH2PZC.png" alt="image.png"></p>
<p>充电管理使用了经典的TP4056充电管理IC:</p>
<p><img src="//image.lceda.cn/pullimage/74noqzCpPdq5HbDDwqbaUwGvDpP5U5A0hwjs781E.png" alt="image.png"></p>
<p>相关电路如下:</p>
<p><img src="//image.lceda.cn/pullimage/9ePCZPRz5LtQN43PI6VW0PrwlvpWMe9YbaOxrZOm.png" alt="image.png"></p>
<h3>供电方案</h3>
<p>因为本项目的工作电流需求不大,加上对电路的干扰比较敏感,所以在供电方案上,选择了LDO方案,使用的LDO是XC6206(即经典的662k)</p>
<p><img src="//image.lceda.cn/pullimage/cCvHDtFq8HdAK2PUG8Qzr1RXrPtk2x8QtlGmcmAk.png" alt="image.png"></p>
<p>为了实现供电上了数模隔离,再加上MCU的RTC部分需要的后备电源,所以总共使用了3颗XC6206,分别为数字电路、模拟电路和MCU RTC(后备电路)供电。需要注意的是,数字供电VCC和模拟供电VCC是由开关控制开启的,而后备电源供电则绕过了开关,直接连接在电池上。</p>
<p><img src="//image.lceda.cn/pullimage/bYtrrPKDcueHCpZzel6xiU4gTKNpcZgy7JfWIBnO.png" alt="image.png"></p>
<h3>电池电量和充电检测</h3>
<p>这部分电路是为了检测电池电量和充电状态,均使用电阻分压电路实现。为了减少对电池电量的消耗,电量检测电路位于开关之后。两者的输出信号均直连MCU的ADC通道:</p>
<p><img src="//image.lceda.cn/pullimage/lny6CR1wuMZeBcNoWKYvuM1mZlSAYGWwM5vL1XjA.png" alt="image.png"></p>
<h3>模拟地和数字地</h3>
<p>为了减少模拟电路和数字电路间的串扰,本项目使用了模拟地和数字地隔离的方式,两者之间通过0Ω电阻单点连接:</p>
<p><img src="//image.lceda.cn/pullimage/54SCEMpWbooaXLj72EsW093h7EbyJVmuQY8TwnBe.png" alt="image.png"></p>
<h2>用户输入和输出</h2>
<h3>LCD</h3>
<p>LCD是主要的用户输出通道,本机的绝大部分数据都通过LCD向用户展示。在平衡了显示内容的完整度、MCU的处理能力和项目成本之后,本项目选择了一块2.4英寸分辨率为QVGA(320X240)的彩色点阵TFT-LCD显示屏。LCD通过8bit 8080总线与MCU进行通讯,经过测试,最大刷新率可以达到60Hz。实际使用中,为了降低MCU的压力,这块屏幕最终工作在8位(LUT)色模式,30Hz的刷新率下</p>
<p>LCD的电路如下</p>
<p><img src="//image.lceda.cn/pullimage/fQPLThcjrXnEEIDqVJWb922YwtCTpwuw6oAKkyAn.png" alt="image.png"></p>
<p>LCD的背光电路则使用一颗MOSFET通过PWM控制,调光频率约1KHz,最大工作电流约40mA</p>
<p><img src="//image.lceda.cn/pullimage/mZl9Z9aZumuNriyNwjNs6EG4aJdf7qJeEe5vDmfd.png" alt="image.png"></p>
<h3>按键</h3>
<p>本项目的用户输入全部由按键完成,包括一个五向开关(摇杆)和两个轻触按键组成。</p>
<p>为了降低IO的消耗和PCB布线难度,摇杆使用了ADC按键的接法:</p>
<p><img src="//image.lceda.cn/pullimage/wiFBereRbBf45NLJAc3fzmmFn20OrLtJnzB5DDXx.png" alt="image.png"></p>
<p>其他两个按键则使用独立的IO。为了以后可能的MCU休眠功能,运行按键是高电平触发,连接在MCU的PA0休眠唤醒IO上,另一个选项/设置按键则使用通用的低电平触发,连接在MCU普通的GPIO上。</p>
<p><img src="//image.lceda.cn/pullimage/uxSjvWakCyMmeHQYXHYGVAY8DfCpVMlZRmIvPe1A.png" alt="image.png"></p>
<h3>USB串口</h3>
<p>为了实现采样数据的上传功能,本项目额外设计了USB-UART桥接电路,可以将数据通过USB串口上传至上位机。</p>
<p><img src="//image.lceda.cn/pullimage/VFvCZ9dZFzaLQqAMD322S9U7yGI7H4YP9wMOfu1o.png" alt="image.png"></p>
<p>其中USB串口IC选用的型号为CH340E:</p>
<p><img src="//image.lceda.cn/pullimage/cdU262RONDZnC9Mj1m3Qrjg3M2bkUgEM4Fb9H8an.png" alt="image.png"></p>
<p>在本项目中,串口的通讯参数为<strong>11500波特率,8数据位, 1停止位,无校验位</strong></p>
<h2>MCU</h2>
<p>本项目使用的MCU是STM32F407VE,拥有192KB的SRAM,最大168MHz的主频,带有ADC和8080总线接口,可以满足本项目对于信号采样和处理以及驱动LCD的需求</p>
<p><img src="//image.lceda.cn/pullimage/3sX0gtOujdsPsJAOViSt0O9XbPkT92x62LOCczxw.png" alt="image.png"></p>
<h1>5.软件部分</h1>
<h2>开发环境</h2>
<p>本项目使用基于Eclipse的STM32CubeIDE开发,编译器为GCC:
<img src="//image.lceda.cn/pullimage/Ijdiz3uokKW38JrObHsHgi7YvVGgSi70EwmpbL9p.png" alt="image.png"></p>
<h2>软件架构</h2>
<p>本项目的软件架构比较简单,使用了HAL库作为MCU的硬件驱动,使用FreeRTOS作为整个项目的软件基础。OS共分为两个线程,其中一个为ADC采样线程,为高优先级线程,另一个则为主线程。ADC采样线程只负责按照固定的频率进行ADC的采样。其他的信号处理,用户交互,数据展示,逻辑处理等均在主线程内完成。</p>
<p>图形处理部分使用了8位的整屏framebuffer以降低开发难度并提高刷屏效率,使用的图形库的字模处理部分使用了LVGL的部分代码,其他全部为自行编写。</p>
<p>使用的图形库部分代码截图</p>
<p><img src="//image.lceda.cn/pullimage/ufHBBfdqaOTsEXwotzBWmWC6s7t22sOXECoLBaxy.png" alt="image.png"></p>
<p>采样数据的结构使用了一个结构体进行定义,这样在每个采样点上均保存了采样时的电压、电流和时间戳数据。单个数据内存消耗为8byte,总共使用48KB的内存来实现最高6Kpts的存储深度</p>
<p><img src="//image.lceda.cn/pullimage/W59IqQHw3Oa2iVnyexaTPPHF4IvCCeWoJgc57jZX.png" alt="image.png"></p>
<h1>6.项目材料清单</h1>
<p><img src="//image.lceda.cn/pullimage/ai46Xcfe9BcIdZ7vclNWxqp6l9Nj9Qq5GPeGCpGr.png" alt="image.png"></p>
<p><img src="//image.lceda.cn/pullimage/P4EkCDpwhPlvIxnqQ6LeN7aRbjRAsHvN2S2OiVBT.png" alt="image.png"></p>
<h1>7.大赛LOGO验证</h1>
<p><img src="//image.lceda.cn/pullimage/IPz7N20unpnIPYUuGrpMftUbcdPb74G7hSLJyCoU.png" alt="image.png"></p>
<h1>8.其他图片</h1>
<h2>成品图</h2>
<p><img src="//image.lceda.cn/pullimage/F6bVJavwD7IQwZzVuoOhHKYUfIGp7fLhvqANRF6v.png" alt="image.png"></p>
<h2>正面(未开机)</h2>
<p><img src="//image.lceda.cn/pullimage/q0UBkhEcksmratf51Z1iJoiAKsGqaDMDADOj4LMH.png" alt="image.png"></p>
<h2>PCB背面</h2>
<p><img src="//image.lceda.cn/pullimage/yGoTazAhPi79fI2PnnHp4BwEgKyYQuaI0142BHPk.png" alt="image.png"></p>
评论(95)