在线时间313 小时
UID150295
注册时间2008-5-29
NXP金币24
TA的每日心情 | 慵懒 2024-1-9 10:30 |
---|
签到天数: 325 天 [LV.8]以坛为家I
金牌会员
- 积分
- 2206
- 最后登录
- 2024-1-9
|
本帖最后由 xinchao 于 2016-12-13 16:37 编辑
基于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秒后显示电压电流。
短按按键S4,显示从电压电流切换到显示电量和时间,再次短按S4再切回显示电压电流。
长按按键S4两秒,电量和时间复位从0开始重新计算。
源代码:
XinChao_mbed_ELE_iar_lpc824.zip
(2.26 MB, 下载次数: 137)
项目调试都是在网页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());
|
|