fei

#中国用户论坛#分享一个基于LPC824的USB电量计

Discussion created by fei on Feb 3, 2017
基于LPC824 mbed的USB电量计

 


项目介绍
1、方案主题
  基于LPC824 mbed的USB电量计,可以用来测试手机、充电宝等USB设备的充放电电压、电流、电量。

2、方案功能
  使用LPC824lite开发板,在mbed开发平台上实现电压、电流和电量检测的功能。

3、关键词

  LPC824   电量计   mbed

工作原理介绍
1、硬件组成与介绍
  一块LPC824lite开发板,一块LCD的段码屏,自制的USB电压电流检测模块,和测试用的放电模块。

整机电路
  如下图,USB电源输入直接用LPC824lite开发板USB接口。LCD显示屏插在开发板数字接口上,自制的USB电压电流检测模块插在电源接口和模拟接口上。


USB电压电流检测模块
  如下图,原理很简单,5V的电源用两个100K的电阻分压到一半送A0口检测,负极串了一个0.39欧姆的采样电阻,接到A1口检测。用洞洞板做的模块,USB座输出5V电源。

  PS:别问我为什么用0.39的电阻,我是不会告诉你我只有0.39电阻的。。。

 


测试用的放电模块
  二十多个510的电阻并联组成,大约200mA的放电电流。


2、此项目中LPC824lite的功能
  LPC824lite为整个项目的核心。

  用到的LPC824芯片的资源:ADC、GPIO、IIC、外部中断、UART等。
  用到的LPC824lite开发板上的资源有LED、按键、AT24C02、接口等。

  ADC:用了两路A0和A1,A0用于检测输出电压,A1检测采样电阻电压,计算电流。
  GPIO:显示屏用了5路GPIO输出口来控制显示。
  按键:只用了开发板上S4一个按键,程序中使用中断方式检测,分短按和长按两种模式。
  AT24C02:开发板上存储芯片,共256个字节,IIC控制,用来存储数据。
  UART:向电脑发送测试信息
  LED:用了开发板上的5个LED1-5来显示运行状态。板上其它3个LED接口和显示屏冲突没用。

3、软件流程介绍
  这次项目用的是mbed平台,所有代码调试都是在网页上完成,第一次用,感觉很简单,上手很快。
  软件的流程比较简单,就不画流程图了:复位后完成各种初始化(串口、按键、显示屏等),读取保存的参数,然后进入主循环,主循环中每50ms做一次ADC检测,到达1秒时计算ADC的平均值,计算电压、电流和电量,并更新显示,保存数据。


  按键:按键用中断方式检测,进入中断后延时50ms后再检测一次,以防抖,然后循环检测按键的弹起,若在2秒内按键弹起,则认为是按键[短按],如超过2秒按键才弹起,则认为是按键[长按]。



  显示:开机后显示电压电流,如图,上排显示的是电压4492mV,下排显示的是电流214mA。


  不要说后边显示的是乱码,那是mV和mA,用7段显示屏只能这样表示了。
  [短按]按键后切换到电量显示画面,如图,ELE 17表示电量是17mAh,下排显示的是时间,分别为时分秒。



  计时器:使用mbed的Timer来计时(测试时发现个问题,详见后面)。

  断电数据保存:每秒数据更新后都会保存电量和时间两个参数,防止测量中断时再复位后可以读出参数继续测量。比如在测试充电宝放电电量时,当充电宝电放完之后系统就会断电,这样的话重新上电时就能看到充电宝放电的电量和放电时间。



实物与演示
1、实物图片与说明
电压检测

  如下图所示,检测到的电压为4231mA,和用万用表测得值4.228V相比还算可以,误差不算太大。
  测试时是插到电脑USB供电的,再加上开发板5V输出电路上串了个二极管,所以输出电压只有4.2V了。。。



电流检测

  测得84mA时万用表读数79.28mA,129mA时万用表读数123.18mA,误差大约5%,还可以接受,我的采样电阻是普通电阻,换成高精度低温漂的电阻会更精确。

 



测试充电宝放电电量



断电数据保存

在测试中如果824复位,或者电路断开,重新上电时会读取保存的已测试时间和电量的数据。



2、演示视频和源码
演示1:上电复位
  上电显示开机提示“LPC824”,1秒后显示电压电流。

 
演示2:显示模式切换
  短按按键S4,显示从电压电流切换到显示电量和时间,再次短按S4再切回显示电压电流。
 
演示3:复位电量和时间
  长按按键S4两秒,电量和时间复位从0开始重新计算。

 

  项目调试都是在网页mbed环境下进行的,源代码导出为IAR格式,导出Keil时出错,不知道什么原因...


发现的问题
  在计时部分刚开始做的比较简单,50ms的延时用变量计数,时间长了误差太大。后来用了mbed的Timer模块,用起来比较简单,但是发现一个问题,当Timer计时到2148秒时会出现错误,Timer返回的数会变为负数。

pc.printf("Timer: read()=%f    read_ms()=%d  read_us()=%d\r\n", mytimer.read(), mytimer.read_ms(), mytimer.read_us());

 

 

 【LPC824lite项目】基于LPC824 mbed的USB电量计 - 活动专区 - 恩智浦技术社区 - 手机版 - Powered by Discuz! 

Outcomes