描述
<p>版权声明:本文档是micespring在“GD32杯第五届立创电子大赛”的参赛项目《数控直流电子负载》的详细介绍,禁止商用!转载请注明原始链接和作者ID。</p>
<hr>
<p>项目评选已经结束,评论区已经开放。
由于该项目被锁定无法更改,所以所有的变动都写在此处,<strong>请制作之前注意</strong></p>
<p><strong>需要注意的问题:</strong></p>
<ol>
<li><strong>目前提供的固件是基于8M晶振的</strong>,而不是原理图上的25M晶振。如果使用25M晶振,可以自行修改代码中的相关设置。</li>
<li>因为本项目是使用SPI驱动TFT屏,为保证流畅频率设定为50MHz。如果需要修改PCB,那么请注意LCD信号线的走线,与MCU的距离要尽量短,否则可能会白屏或者画屏</li>
<li><strong>目前风扇调速是为4线风扇设计的</strong>,如果使用2线,需要修改代码中的PWM频率</li>
<li>EEPROM请使用<strong>24C02</strong></li>
</ol>
<p>一些建议:</p>
<ul>
<li>
<p>LM324可以替换为OPA2274,经测试可以进一步减小负载电流设定值和实际值之间的误差</p>
</li>
<li>
<p>如果有自激,可根据实际情况调整LM324放大反馈电路周围预留的阻容元件</p>
</li>
<li>
<p>正常情况下,C23,C37,R23不需要焊接</p>
</li>
<li>
<ul>
<li>-</li>
</ul>
</li>
</ul>
<h1>一、项目详情</h1>
<p>电子负载是一种消耗电能的设备,主要的作用是对电源进行测试。比起使用大功率可调电阻或者电炉丝等传统的无源负载,电子负载具有参数可调,使用方便等诸多优势。无论是专业的电子工程项目开发还是业余的电子爱好者,电子负载仪都是必备的设备之一。比如本次大赛的定向主题“直流可调电源设计”,如果有一台电子负载,就可以更加方便对电源进行调试,加速项目的开发。</p>
<p>电子负载从测试电源的种类来分可以分为交流电子负载和直流电子负载。从功能上划分常见的有恒流、恒压、恒阻、恒功率四种类型。因为我们常见的大多数电源都是恒压直流电源。测试这类电源时,主要测试的是其电流输出能力。所以大多数的应用场景中,直流恒流电子负载是最为常见的类型。而电子负载从控制方式上划分则又可以分为数控和模拟两种类型。相较于使用纯模拟电路控制的电子负载,数控电子负载使用数字控制,在参数调节上更为直观,而且功能丰富、扩充简单,还可以方便的实现测试的自动化。</p>
<p>基于以上分析,我决定制作一台数控直流(恒流)电子负载。由于数控电子负载可以通过模拟的方式实现伪恒功率电子负载的功能,所以并未显式在名称中注明“恒流”字样,但本质上还是恒流电子负载。</p>
<p>在项目立项之时,我定下的关键技术参数为:</p>
<ol>
<li>最大测试电流:10A</li>
<li>最大测试输入电压:36V</li>
<li>最大功率:120W</li>
<li>电流控制范围:0.1~10A,控制精度:0.1A</li>
</ol>
<p>最终的成品以上目标参数和功能均已实现。</p>
<h1>二、项目所面临的挑战及所解决的问题</h1>
<p>市面上已经存在有不少专业或者非专业的电子负载,模拟的和数控的都有。专业的大多价格高昂,对于个人爱好者来说十分不划算。而非专业的大多又过于简陋:显示上主要都是LED数码管和单色LCD,而且功能上大多都比较简单,有些还缺乏一些关键的保护功能。除商业化产品外,网上也有不少公开的电子负载设计,但大多使用的都是非标准、非通用的器件和模块,最终成品的品质波动很大。基于此,本项目将主要解决以下问题</p>
<ol>
<li>成本高问题:尽量使用通用且经济的元件实现功能</li>
<li>功能简单问题:成品除基本的恒流负载功能外,还将实现更多有用的功能</li>
<li>显示、控制简陋问题:使用大屏TFT彩屏作为显示器件,旋转编码器作为输入器件,并使用主流的图形库来实现现代化的UI界面。</li>
<li>制作困难问题:减少制作所需的工具和步骤,提高制作成功率。</li>
</ol>
<h1>三、项目硬件、软件部分涉及到的关键点</h1>
<h2>硬件部分(模拟电路部分)</h2>
<h3>核心原理</h3>
<p>恒流电子负载的核心电路是一个由运放、功率MOS管、采样电阻、参考电压构成的负反馈控制电路:电流流经采样电阻会产生压降,当该压降VRS小于参考电压REF_VOL时,运放控制MOS管开启,此时流经RS的电流开始上升,直到RS上产生的压降高于参考电压时,运放关闭MOS管,流经RS的电流开始减小。如此循环往复,使得MOS管工作在线性区的某个位置以实现对负载电流的控制。最终负载的恒流值由采样电阻RS和参考电压REF_VOL共同决定。</p>
<p><img src="//image.lceda.cn/pullimage/TANruaDWPtgo4ENqEl52DCAdh8h5STg9ritFnTiu.png" alt="image.png"></p>
<h3>功率地、模拟地和数字地</h3>
<p>整个系统应该是共地的,这是电路工作的基础。但是,不同的逻辑电路的地平面之间是不能直接通过铺铜连接到一起的,否则高频工作的数字电路,大电流的功率电路和控制/采样用的模拟电路之间就会相互串扰。最好的方式就是三者的地之间进行单点连接。本项目中,输入电源功率地和模拟地之间采用0欧电阻连接。而数字地和模拟地因为本项目设计的原因,本来就是在两块不同的PCB上,然后通过排针连接,这本身就是很好的隔离措施。如此,实现了三个参考地平面之间的连结,并且最大限度的减少了三块逻辑电路之间的干扰。</p>
<p><img src="//image.lceda.cn/pullimage/AgV2hR9QepkKODreUW4doeJxAApt40y0Kntj3BjA.png" alt="image.png"></p>
<h3>电源</h3>
<p>本项目的整个系统需要3个不同的电压,12V用于散热系统的风扇供电。9V用于供给主运放,以获得较大的动态范围以良好的驱动功率MOSFET。3.3V用于精密运放,ADC/DAC,还有数字电路的供电。因为整个系统的功耗不大,再加上整个系统对电源纯净度要求比较高,所以这里设计使用12V电源输入,并使用了线性稳压器获得9V和3.3V的电压,另外还添加了较多的电容进行滤波。</p>
<p><img src="//image.lceda.cn/pullimage/uhqmMWBff4VxBE5jPVi6iI6KrLcMw9C3WvDRyxf1.png" alt="image.png"></p>
<h3>恒流控制和参考电压的获取</h3>
<p>由基本原理可知,可以调节参考电压和采样电阻的大小来控制负载电流的大小。但是控制电阻的大小显然比控制电压的高低困难的多。所以我们选择设置参考电压来控制负载电流大小。对于传统的模拟电子负载,此处的参考电压一般都是通过一个电位器接在电压基准和地之间来获得的。如果想实现数字控制,只需要将此电位器换成数字电位器即可。考虑到数字电位器的精度一般不高,所有,更好的选择是使用DAC,即数模转换电路来生成参考电压。</p>
<p>DAC有很多现成的IC可以使用,在这里,我选择了MCP4725这款DAC。这款DAC拥有12bit的分辨率,也就是说最终可以实现4095个电流档位。另外,MCP4725通过I2C接口与MCU实现通讯,可以简化PCB的布线难度。</p>
<p><img src="//image.lceda.cn/pullimage/FZ3FRvOx9ZkaU4fhU4BYcrlrg0OyQv5aznJpSbts.png" alt="image.png"></p>
<p>由于DAC直接输出的驱动能力较弱,输出电压容易受负载的影响。为了稳定输出电压, 此处,使用了一路运放作为<strong>电压跟随器</strong>来保证DAC的输出电压有足够的驱动能力。</p>
<p><img src="//image.lceda.cn/pullimage/uUEBstHzRYRHIOYkJkk5k7AD5rdy1VDfjJ06nRIE.png" alt="image.png"></p>
<p>经过运放后,为了方便反馈电阻的适配,在作为参考电压输入反馈系统之前,这里又添加了一个精密电位器R21,这样,MCP4725的输出电压范围就由0~VCC变成了0~任意值,可以方便我们选择合适的反馈电阻。另外,电位器的两边还预留了两个电阻的焊盘R15和R17,在最终调试结束,确定了电位器的值之后,可以将电位器替换为固定电阻,增加稳定性的同时可以进一步节省成本</p>
<p><img src="//image.lceda.cn/pullimage/IaqMmkkD1gibb5h6cdnT3NT9aaKFYbsdLzBRCXZu.png" alt="image.png"></p>
<h3>采样电阻的选择</h3>
<p>由于采样电阻最大的设计通过电流为10A。如果使用大阻值采样电阻,比如使用1欧姆的电阻时,电阻上的功率将达到100W,那么采样电阻就会因为发热而烧毁,或者因为发热引起的温漂导致电流的测量或控制出现偏差。但是如果直接使用小阻值的采样电阻,如1毫欧的电阻,那么最大电流时压降也不过10mV,这一方面使得整个电路对干扰及其敏感,另一方面由于运放的精度限制,电流将难以控制。综合考虑后,我使用了2个6毫欧2W的电阻(R8和R10)并联获得3毫欧的采样电阻阻值,同时,增加一路前置放大电路,将采样电阻上的电压经过放大后送入主反馈电路。这样一方面兼顾了采样电阻的功率,另一方面也解决了反馈系统信号太小导致容易干扰而且难以控制的问题。</p>
<p><img src="//image.lceda.cn/pullimage/GTuVkUnnHHmLUbZqlPr4ZtHMWn0Vo5iBCG71n51M.png" alt="image.png"></p>
<p>至此,我们可以通过MCU控制MCP4725来决定恒流电流的大小,也就实现了数控恒流负载的功能。</p>
<h3>电流的采样</h3>
<p>现在,我们可以控制负载电流的大小了,但是,我们还需要实时的测量电流的大小。测量电流的方法很简单,通过测量采样电阻上的压降,然后除以采样电阻的阻值即可得到电流的大小。因为要测量电压的大小,所以这时候我们就需要用到ADC,即模数转换电路了。与DAC相同,ADC有很多现成的IC可供选择。这里,经过综合评估后,我选择了ADS1115这款ADC。ADS1115拥有16bit的分辨率和4路模拟输入,且内置电压基准源,并同样使用I2C与MCU进行通讯。由于I2C总线的特性,ADS1115和MCP4725可以挂载在同一个I2C总线上。这就进一步降低了布线的难度。</p>
<p>因为ADC采样的精度很大程度上会受到电源的影响,所以ADS1115使用了LC滤波来保证ADS1115能有一个稳定的供电环境。</p>
<p><img src="//image.lceda.cn/pullimage/vLodvDhjxXpLIIyKYiNBFSzCRYQAsLxlxr7kUcNr.png" alt="image.png"></p>
<p>ADS1115的量程可配置,这里为了方便起见,使用了略高于供电电压3.3v的档位4.095V。因为使用的采样电阻很小,即使在最大电流时压降依然很低,无法充分利用ADS1115的量程,所以又增加一个INA199放大器来将采样电阻上的压降放大后采样。</p>
<p><img src="//image.lceda.cn/pullimage/7D54FWU6eJbuQM2yg1LtSs9s5OrwvgEww2yEueMQ.png" alt="image.png"></p>
<h3>输入电压采样和四线测量法</h3>
<p>电压的测试方法很简单,两个电阻连接在输入端子的正极和地上组成分压电路,分压后输入ADC(ADS1115)采样即可,如下图中的R4和R5即分压电阻,分压比约为1:0.09,这样在输入36V时,分压后的电压约为3.27V,正好可以最大化的利用ADC的量程。</p>
<p><img src="//image.lceda.cn/pullimage/VEtX5n0cAGjVjKrWlPLe85X9iQiQopNbhCsaG6xR.png" alt="image.png"></p>
<p>这里需要注意的时分压电阻的阻值,如果阻值太低,那么会带来额外的电流消耗,导致恒流控制不准。另一方面,这些电流消耗会导致分压电阻温度上升,带来温漂的同时还可能导致分压电阻烧毁!但是分压电阻太大也不好,太大的话一方面会导致系统抗干扰能力下降,因为环境中的微小干扰加在一个巨大阻值的电阻上时就能感应出很高的电压。另一方面,ADC是有输入阻抗的,如果分压电阻太大甚至接近了ADC的输入阻抗,那么分压电阻会和ADC的输入阻抗之间再次构成一个分压网络,导致ADC测得的电压比实际偏小。所以经过综合考虑,这里使用了100K的上臂电阻和10k的下臂电阻,可在两者之间取得平衡。</p>
<p>另一个需要注意的是电压的采样点,如果采样点距离输入端子比较远,那么由于PCB铜皮的电阻不为0,在电流较大时,PCB铜皮上也会产生可观的压降。这样,采样得到的电压就不是输入端子处的电压了。所以,这里电压的采样点一定是在靠近输入端子的地方,如下图:</p>
<p><img src="//image.lceda.cn/pullimage/5iQLCm6dLCL15V4mLzBoFseIMCroa1ZQFsXjuQYi.png" alt="image.png"></p>
<p>这样就能比较精确的采集输入端子处的电压了。已经可以应付大多数的测量需求。但是,这里我们无论多么努力,都只能尽可能准确的测量输入端子处的电压。而从电源到输入端子处肯定是要连接导线的,而只要有导线就会产生压降,所以我们无法在有电流的情况下准确的测量电源的实际输出电压。在只需要考虑电流大小的测试场景下,这是无伤大雅的。但是如果是需要考虑功率而且对功率精度要求比较高的场合,比如测试电池的容量和能量时。因为通过测得的电压和电流计算出的消耗功率并不是实际电源的输出功率,所以测试出来的结果就会不准。为了解决这个问题,我们就必须将电压测试点一步到位,直接连接到电源的输出点上。但是这里还有个问题,那就是简单的将电压采样点引出一根线放到电源输出点上还是不行的,因为我们整个系统的地平面参考点是连接在输入端子的负极上的。而输入端子的负极到电源的负极之间也有导线,也存在压降。这里我们绝对不能直接将接地参考点引出连接到电源的负极上,这会导致电路设计难度增高,抗干扰能力下降,而且可能会导致严重的故障(想象一下如果使用时忘了连接接地参考线会怎样)。为了解决这个问题,就必须使用四线测量法了。</p>
<p>四线测量法其实是额外引出了两根用于电压采样的线,这样与原来的两根连接线一起就组成了4线测试系统。额外引出的这两根电压测试线直接连接在电源的输出端子上,其中没有电流或者只有很微弱的电流,通过测量这两根线之间的电压,就可以得到准确的电源输出电压了。但是改如何实现这个功能呢,要知道电压测试线的负极对于这个系统来说,它的电位可是负的。而一般的ADC是无法测量负压的。所以我们要用到差分测量法,也就是对两根线上的电压做一个减法,来得到最终的电压。在电路的具体实现上,虽然ADS1115具有差分测量功能,但是使用这个功能会导致其模拟通道数量变为2,无法满足我们的需求(电流,电压,4线电压)。所以,这里采用了一个独立的运放组成一个差分放大电路,将电压测试线两端的电压差分、放大(衰减)后送入ADS1115采样。</p>
<p><img src="//image.lceda.cn/pullimage/hes8y4GYOmGxLoU7m1Jn4xv9OKmZalE5JEog8DNa.png" alt="image.png"></p>
<p>运放的选型上,考虑到使用4线的场合都是对电压精度要求比较高的。所以这里采用了<strong>润石科技</strong>的精密、轨到轨单运算放大器<strong>RS8557XF</strong>,它仅20uV的输入失调电压和低至0.03uV/℃的温漂可以完美的实现我们的需求。</p>
<p><img src="//image.lceda.cn/pullimage/NYvSBNkO4wBGvLAVHeOoa6MEFHclKNS1jrlswGzN.png" alt="image.png"></p>
<h3>保护系统</h3>
<p>除了软件上的保护外,硬件上为了安全起见是一定要增加保护的,具体实现为:</p>
<p>测试电源回路上的大功率防反接二极管</p>
<p><img src="//image.lceda.cn/pullimage/O04ImFQaVC90WHHEy4j6TItM1reURMPWUrW7edRd.png" alt="image.png"></p>
<p>测试电源回路上的保险丝</p>
<p><img src="//image.lceda.cn/pullimage/rYcGgWAcCIHRDV5aQJFMYpwjah9zD8HUtWkIiz0y.png" alt="image.png"></p>
<p>ADC采样端的限压二极管</p>
<p><img src="//image.lceda.cn/pullimage/6BPI3FFYlXiJMtAC9m65nHnNvBxvlouvmEdWljtP.png" alt="image.png"></p>
<p><img src="//image.lceda.cn/pullimage/E3AZ3vST0hmoK4fLli3DJkRTa8qixZdwqwiHih78.png" alt="image.png"></p>
<p><img src="//image.lceda.cn/pullimage/VCICI3C6yCB3FyCJRY6xX4MUPwkwh0zfY6k7E1Er.png" alt="image.png"></p>
<h3>散热系统的设计</h3>
<p>因为电子负载消耗的电能主要是转化为热能,所以必须要有一个稳定而且强大的散热系统,否则电子负载的功率就无法做大。这一方面要求散热片必须有足够的散热能力,可以将热量迅速散出;另一方面则要求功率管与电子负载有比较可靠的结合方式,否则热量如果无法及时从功率管上传输至散热片,那即使散热片散热效率再高,整个系统的功率也做不上去。</p>
<p>比较传统的做法都是直接使用预制铝制散热片配合风扇进行散热,然后功率管通过打孔的方式与散热片进行结合,此方法比较节省成本但是通用产品大多无法针对风扇进行针对性的风道调整,所以散热效率不佳,再者就是订制散热片,但是这样制作成本就太高了,对于非商业化的项目十分不划算。</p>
<p>经过考虑,最终选择了使用Intel 775规格的散热器,并使用类似CPU的压合方式与功率管进行结合。此为经过我考虑后的最佳解决方案,原因如下:</p>
<ol>
<li>775散热器是专业且成熟的标准,经过了市场的验证。</li>
<li>有大量在售(或二手)的商业化产品可以购买,可选规格多,价格便宜。</li>
<li>Intel 775散热器的扣具安装十分简单,只需要在PCB上打4个孔即可,</li>
<li>相较于最新的115X散热器扣具,775规格的安装孔孔距更小,可有效减少PCB板的变形</li>
<li>压合的方式相对与打孔螺丝的结合方式更加方便</li>
</ol>
<p>实际验证,表现超出预期,可以很轻松的处理功率管100W以上的发热。</p>
<p>另外,功率管附近我设计了一个热敏电阻来对功率管的温度进行采样,并根据采样获得的温度来对风扇的转速通过PWM调速进行控制,即节能静音,也可以在关键时刻如热失控时控制负载关闭来保护功率管防止烧毁。因为这套系统的作用,在整个制作过程中未发生一起MOS管烧毁事故:)</p>
<p><img src="//image.lceda.cn/pullimage/1pWUwmOuhMpTt0mykO64q4AK9c6GAVezRZadgbJG.png" alt="image.png"></p>
<h2>硬件部分(数字电路部分)</h2>
<h3>显示和控制部分</h3>
<p>显示部分采用了2.4寸的6.5K色QVGA分辨率的TFT显示屏,比起小尺寸的OLED或者单色STN显示屏,彩色的TFT显示屏可以同屏显示更多内容(或更加明显的显示内容),也可以提供更加优良的观感,并且为以后的功能扩充留下了更多的余地。并且,彩屏TFT并未明显增加成本。</p>
<p><img src="//image.lceda.cn/pullimage/k8ZoZ1btLXlqUvpXwbUGd7gtRb19JzWPYOVG877c.png" alt="image.png"></p>
<p>用户控制部分使用了一个带中心按键的旋转编码器和两个按键,旋转编码器用于快速选择选项或者设定数值,两个按键则一个实现控制另一个作为功能键使用。</p>
<p>这里还提供了两个指示灯,一个作为负载运行的指示灯,另一个则作为电源指示灯。</p>
<p><img src="//image.lceda.cn/pullimage/1DjQxAysbYplGcEas2QcufTaugMNlBweXHLSDCjM.png" alt="image.png"></p>
<h3>主控的选择</h3>
<p>主控选择上,因为使用了大屏TFT,所以小容量的单片机就无法满足要求了。而且大屏的内容绘制也更加复杂,仅使用底层的绘图法绘制内容将极大的增加编码的难度,所以需要专用的使用图形库来进行内容绘制。另外还有显示汉字需要存储的字库。这要求主控MCU的ROM容量和RAM大小都不能太小。而且因为TFT屏选择的是SPI接口的,所以选择的主控最好还能有高速的硬件SPI。</p>
<p>经过综合考量,最终选择的主控为意法半导体STM32系列的STM32F412RET6,这款MCU采用带单精度浮点运算器的Cortex-M4内核,工作在100MHz的频率。拥有512KB的ROM和256KB的大容量SRAM,后者是流畅运行图形库的基础。外设上,它拥有高达50MHz的硬件SPI,支持DMA,可以以极高的速度驱动TFT显示屏(实测最高刷新率可以达到40FPS以上)。并且与ADC、DAC等的通讯也可以使用纯硬件IIC进行,以达到最高的运行效率。</p>
<p><img src="//image.lceda.cn/pullimage/CyJ2WGoLjp73IzPtBuSnw9IHjDXmYMumZve1cBc2.png" alt="image.png">
<img src="//image.lceda.cn/pullimage/fxGBr4zD4EXZ5XAZLqp6SJI5u3gkXit2FacbiSQL.png" alt="image.png"></p>
<p>另外,虽然此MCU拥有内置的RC时钟电路,但是为了保证进行电池容量测试时数值累加的准确性,这里还是使用了外置的晶体振荡器来获得准确的时钟。</p>
<p><img src="//image.lceda.cn/pullimage/xtAqXyVrAEGaS32KKGfjZfIX7XletNjlIjZVs85N.png" alt="image.png"></p>
<h3>非易失型储存器</h3>
<p>整个系统需要对校准数据和用户设计以及测试数据进行存储。虽然可以使用MCU内部的Flash ROM来解决,但是考虑到以后的功能扩充,MCU内部的Flash容量其实不算宽裕。另外将数据保存在MCU中会导致MCU内部Flash的磨损,当出现坏块时MCU就报废了,这是难以接受的。所以我们需要外部的非易失型储存器来进行数据的持久化存储。常用的非易失型储存器有EEPROM, NOR Flash,NAND Flash等。NAND Flash虽然有容量(非常)大且价格便宜的特点,但是它的控制和数据的读取/写入都比较麻烦,而且需要磨损均衡算法来规避坏块,况且大多数情况下我们都不需要用到这么大的容量,所以NAND Flash用在这里是不合适的。剩下的EEPROM和NOR FLASH虽然在功能上都能较好的满足需求,但是EEPROM大容量的很贵,NOR Flash写入前需要擦除,无法随机写入。考虑到随机存储需求,比如测试数据的存储(防止意外掉电丢失),最终本项目选择了同时使用一片小容量EEPROM和一片大容量的NOR Flash, EEPROM作为数据快速的随机存储使用,NOR Flash用来存储不要经常变动的那些数据(如校准数据)。</p>
<p>EEPROM的选择上使用了<strong>台湾合泰的HT24LC64</strong>,IIC接口,拥有8KB的容量。足以满足随机数据存储满足要求:</p>
<p><img src="//image.lceda.cn/pullimage/vdeme0wGymF3S5t513OAGObVy1NGKH6vizhQVJeB.png" alt="image.png">
<img src="//image.lceda.cn/pullimage/AFUofxjYtb9ji2gNrYoKxh2N8saAcwyh90GeQA0S.png" alt="image.png"></p>
<p>NOR Flash选择了<strong>兆易创新(GD)的GD25Q64CSIGR</strong>,拥有高达8MB的容量和Quad-SPI接口,数据擦写次数10万次,20年的数据持久性。可以在最大程度上满足校准数据的稳定存储。</p>
<p><img src="//image.lceda.cn/pullimage/CwvZzuHYzvcRWjJJ4wbrwRGvf6PTsf2yStmzphAW.png" alt="image.png">
<img src="//image.lceda.cn/pullimage/dxKOp4ZM6654qcqMFe4yYw7bikEpRJcNLWCzl4Ni.png" alt="image.png"></p>
<h2>软件部分</h2>
<h3>开发环境</h3>
<p>项目使用Atollic TrueStudio 9.3.0 IDE进行开发,通过STM32 CubeMX生成初始化工程,开发语言为C语言,编译器为GCC。</p>
<p><img src="//image.lceda.cn/pullimage/3wHaR3DhsUjAx4UtscZZfbJnm5mcJLRdzqjg5tBW.png" alt="image.png">
<img src="//image.lceda.cn/pullimage/vH7MM0LfKiivlrNM077BaSqOIwaF4pums8GLulwG.png" alt="image.png"></p>
<h3>图形库</h3>
<p>图形库使用LittleVGL,一个开源、强大的嵌入式图形库。littlVGL提供了丰富的控件,还包括了一个软件任务系统和内置的内存管理器,这些都可以极大的降低开发的难度。</p>
<p>LittleVGL需要一个用于存储控件属性的堆空间,和一到二个图形缓冲区。本项目中,为LittleVGL分配了32KB的堆空间和50KB的图形缓冲区,并使用DMA进行屏幕数据的刷新。
LittleVGL主页:<a href="https://lvgl.io/" target="_blank">LittleVGL</a>< br>
< br>
<img src="//image.lceda.cn/pullimage/QJBaWkRf6ZIiWkQKRVn1jkOeqztyOYPZC9SqdB8V.png" alt="image.png"></p>
<h3>代码结构</h3>
<p>代码主要分为3层:硬件驱动层,硬件抽象层和用户交互层</p>
<p><img src="//image.lceda.cn/pullimage/Gk7WgSr1llCB6bjMtaBGOcbx3aae28sBYCr3uVEc.png" alt="image.png"></p>
<p>硬件驱动层用于底层硬件的沟通和交流,比如ADC数据的采集,DAC控制,负载开关等等。硬件抽象层则用来作为用户层代码和硬件层代码之间的桥梁,它屏蔽了底层硬件的细节,只向用户态代码提供加工好的数据或者提供硬件控制的高级接口。用户交互层则直接负责界面的绘制,功能逻辑的实现等等。</p>
<h3>系统功能层级</h3>
<p>系统功能层级如下图所示</p>
<p><img src="//image.lceda.cn/pullimage/95G1BoMN9BVXZrt5ExWtol9xM1I20Nu0JczJkJri.png" alt="image.png"></p>
<p>有关更详细的功能介绍,请参考项目视频。</p>
<h3>校准功能的实现</h3>
<p>为了消除硬件上的偏差导致的测量误差,本项目设计了软件校准功能。校准的基本思路是使用多段拟合的方法,在整个的电压/电流的量程上设置多个校准点,记录下各个采样点的电压/电流值和对应的实际ADC值。测量时将采样获得的ADC值与这些校准点进行比对,找到对应的区段。然后在区段内采用线性插值的计算方法获取最终的电压/电流值。校准点越多,最终的结果就会越精确,但校准所需要记录的数据就越大。
经过综合的考量,最终电压校准点步进为为0.2V,电流为0.1A
以下为获取电压值的关键代码:</p>
<pre><code>uint16_t GetTestInputVoltage(){
uint16_t value = GetTestInputVoltageRawValue();
// 校准数据不存在的情况
if(voltageCalData == NULL){
double volPerBit = 1.379282892314428;
return value*volPerBit;
}
// ADC采样值小于零点值的情况
if(value < = voltageCalData->data[0]){
return 0;
}
// 找到对应的区段,并进行线性插值,计算实际的电压值
uint16_t voltage = 0;
for(int i = 1; i < voltageCalData->stepCounts; i++){
if(value < = voltageCalData->data[i]){
voltage = (voltageCalData->stepVoltage) * (i - 1)
+ (value - voltageCalData->data[i - 1]) * (voltageCalData->stepVoltage) / (voltageCalData->data[i] - voltageCalData->data[i - 1]);
return voltage;
}
}
voltage = (voltageCalData->stepCounts - 1) * voltageCalData->stepVoltage * value / voltageCalData->data[voltageCalData->stepCounts - 1];
return voltage;
}</code></pre>
<h3>恒流控制</h3>
<p>因为DAC的输出值和最终的恒流值之间是存在一定的误差的,而且由于采样电阻的温漂原因,此误差会不停的变化。考虑到代码实现的复杂度和功能需求,此处使用软件校准法。即在使用前进行一次校准,通过记录下不同的恒流值对应的DAC设定值,然后在设定电流时,根据此校准表查找到对应的DAC值并设定。在实际验证时,恒流值误差在±2%以内,基本满足使用需求。</p>
<p>*** NOTE:如果需要更加精细的电流控制,此处可以使用PID控制。此功能可以作为本项目以后的改进点之一。</p>
<h3>其他功能的实现关键点</h3>
<h4>恒功率电子负载</h4>
<p>恒功率电子负载功能是通过纯软件实现的,通过不停的采样当前的电压,并根据设定的功率计算出应该设定的电流,然后通过恒流控制功能重新设定负载电流,以此来实现恒功率负载功能。可见,此功能无法应付电压高频变动的情况。</p>
<h4>电池容量测试</h4>
<p>电池的容量(I·t)和能量(p·t),通过定时器每隔100ms采样一次电流值和功率值,并进行累加计算得出。这些数据被实时的存储在EEPROM中,这样,即使意外断电测试数据也不会丢失。</p>
<h1>四、项目材料清单</h1>
<h2>控制板材料清单</h2>
<p><img src="//image.lceda.cn/pullimage/OfKgZdZE1kfLMB9FaCEq6VvTClyHpLKleQnth6oh.png" alt="image.png"></p>
<h2>模拟板材料清单</h2>
<p><img src="//image.lceda.cn/pullimage/nslZpjFxltbbJfjX6XoUSaUZcMSdXEmxkGbTAfdG.png" alt="image.png"></p>
<h1>五、项目图片</h1>
<h2>含有大赛LOGO特写图片</h2>
<p><img src="//image.lceda.cn/pullimage/7K4ZiIJTGkCuf5hlNO1sNmw2xWYaYExNrvwiOM6X.png" alt="image.png"></p>
<h2>其他图片</h2>
<h3>正面</h3>
<p><img src="//image.lceda.cn/pullimage/CrTs5GTIWGLyXEDtjxZQhT7SuAf4rFPukCo6jlcf.png" alt="image.png"></p>
<h3>侧面</h3>
<p><img src="//image.lceda.cn/pullimage/jm3wny7JIT9hY8yxuqSPVKrdKLaOSCiWVAWHZqoM.png" alt="image.png">
<img src="//image.lceda.cn/pullimage/K0F2SKvRevKviK7fwM9IYGBXLom28iSSDkVZviJj.png" alt="image.png"></p>
<h3>控制板和模拟板分离照</h3>
<p><img src="//image.lceda.cn/pullimage/sBD3hGVTtEmN43sc2MKK11Xsg40nXBpjWLjXJAON.png" alt="image.png"></p>
<h3>实际运行图1</h3>
<p><img src="//image.lceda.cn/pullimage/EqHmwxeXgl0oeufS1USrEucJ8muEWSiK9kHYq1U6.png" alt="image.png"></p>
<h3>实际运行图2</h3>
<p><img src="//image.lceda.cn/pullimage/VpaihNMXWD5DY4SZdF84Xb4v3YAXjMxGyMaoINGD.png" alt="image.png"></p>
<h3>性能展示——电压准确度</h3>
<p><img src="//image.lceda.cn/pullimage/HQn2eR2OFS1aDu9UlUfzDV7oGNA6oI2qhqhxOXOR.png" alt="image.png"></p>
<h3>性能展示——电流准确度</h3>
<p><img src="//image.lceda.cn/pullimage/TajvMKojJqkbZCHVqQ8cAqOk1508cKpQFjbgcPMf.png" alt="image.png"></p>
<h3>性能展示——最大负载功率和四线电压</h3>
<p><img src="//image.lceda.cn/pullimage/5Cbk2cbd1rDhuXuF4KChO3TJrTGSPhaUeiXTQ1MR.png" alt="image.png"></p>
<h1>六、演示视频链接</h1>
<h3>自我介绍</h3>
<p>90后男生,目前从事服务业工作。业余电子爱好者。</p>
<p>视频链接:<a href="https://www.bilibili.com/video/bv1Y5411Y7TS" target="_blank">https://www.bilibili.com/video/bv1Y5411Y7TS</a></p>
<h3>项目简介</h3>
<p>数控直流电子负载,可用于测试恒压型电源。带有能量统计和电池容量测试功能。</p>
<p>视频链接:<a href="https://www.bilibili.com/video/BV1Aa4y1a7RQ/" target="_blank">https://www.bilibili.com/video/BV1Aa4y1a7RQ/</a></p>
<h3>功能展示</h3>
<p>项目目前进度介绍和已完成的功能展示:</p>
<p>视频链接:<a href="https://www.bilibili.com/video/BV17f4y1Q7cg/" target="_blank">https://www.bilibili.com/video/BV17f4y1Q7cg/</a>< br>
< br>
通过实例对电子负载的功能进行演示:</p>
<p>视频链接:<a href="https://www.bilibili.com/video/BV15D4y1m7JF/" target="_blank">https://www.bilibili.com/video/BV15D4y1m7JF/</a></p>
<h1>七、项目其他说明</h1>
<p><strong>本项目为首次公开发布</strong></p>
<p><strong>本项目已开源全部代码,代码已经上传至附件</strong></p>
<p><strong>适用于STM32F412RE的二进制文件也已经上传至附件,可直接烧录后使用</strong></p>
评论(483)