如何自己做一个Ni-MH充电器_rollei120_新浪博客

来源:http://blog.sina.com.cn/s/blog_705d6e340102vtnc.html  点击阅读原文进入

之前一直想学习一下单片机的编程,但限于时间和环境,一直未能掌握要领。去年有些空余,又找了下单片机的资料来了解一下,无意中看到Microchip有个Ni-MH充电器的应用资料,里面包含了源代码,电路图,以及详解,加之手头上有对应的IC。于是有了依葫芦画瓢,照做一个的想法。中间遇到了不少问题,加上未有太多空余时间,一直拖到现在,才出来个像样的板子。


先列一下基本的参数:

1,  主控IC为PIC 18F14K50,带USB通讯。输出PWM信号,驱动MOS管给电池进行脉冲式充电。

2,  USB 5V输入电流大概为450mA-500mA左右,到电池的充电电流为1A。有两个AA电池槽,充电模式为单节。给2200mAh的电池充电,大概需要4小时。

3,  输入接口为Micro-USB,电压5V。

4,  具备电池类型判断能力。

5,  带温度检测,温度低于0℃或高于45℃时,会关断充电。


接下来,说一下我们需要用到的工具:

1,  主要电子元器件:单片机ICPIC 18F14K50,N-MOS,P-MOS,电感,运放等。

2,  绘制电路图的软件,比如protel,PADS。

3,  Microchip的平台软件MPLAB,因为我手上的仿真器是ICD2,不兼容新版本,只能用旧版本的MPLAB IDE v8.92.

4,  C语言编译器:MPLAB C18。

5,  烧录器,或仿真器。我是用仿真器ICD2.如果用烧录器,需要找能支持18F14K50的。


原文档链接

大家可以在下面这两个链接里找到设计的文档:

http://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=cn555023

里面包含了:


1,   AN1384应用笔记 (AN1384)

2,   AN1384对应的软件代码 (AN1384source code)

3,   18F14K50的datasheet (PIC18F14K50)

http://www.microchip.com/pagehandler/zh-cn/devtools/usb-aaa-battery-charger-demo.html

里面包含了:


1,  AAA Battery Charger Windows GUI (Windows的充电检测软件,该软件能与充电板通讯,并收集充电过程的数据)

2,  AN1384 - Ni-MH Battery Charger Application Library(AN1384应用笔记,和上面那份是一样的。)      

3,  Battery Charger MAC GUI        (苹果电脑上用的检测软件)     

4,  USB AAA Battery Charger - Energizer DataSheet    (Energizer电池的规格书)         

5,  USB AAA Battery Charger Firmware         (AAA充电板的固化程序,建议用自己调试的软件来烧录程序。除非你的硬件和他的demo板完全一致。)     

6,  USB AAA Battery Charger Presentation  (AAA电池充电板介绍)     

7,  USB AAA Battery Charger Schematics(充电板完整电路)


NI-MH电池

先来了解一下Ni-MH电池的基本特性,Microchip的应用笔记AN1384里面有详细的说明,我这里摘录一些要点。


1,   镍氢电池与镍镉电池的比较。

                              

2,   放电性能。

2显示了电池以5小时速率(C/5速率)放电时的典型放电曲线。开路电压最初非常快速地从约1.4V降至1.2V稳定状态。在电池电量接近耗尽时,呈现出急拐弯的“膝盖”形状,此时电压下降得非常快。

3,   充电特性

为金属氢化物电池充电时,电压最初急升,之后缓慢升高,直到完全充电。当电池到达过充时,电压达到峰值,之后逐渐降低。由于金属氢化物电池的充电过程是放热的,因此整个充电过程都在释放热量。当电池到达过充时,大量传入能量转换为热量,使电池温度大幅升高。

压力在充电期间也会缓慢增大,但在过充时会大幅升高,因为产生的气体量超出了电池的重新组合能力。如果没有安全口,C 速率(或更高速率)下不受控制的充电会对电池造成物理损坏。

温度对充电效率的影响是镍氢电池与镍镉电池之间的另一个差异所在。镍氢电池的充电接受能力随着温度的升高而降低(从低于20°C的温度开始)。镍镉电池的充电接受能力在室温达到峰值。对于两种电池类型来说,高温下充电接受能力较低是一个严重问题。在靠近热源的位置或者通风有限的隔间中安装电池时,产品设计人员应多加小心。

镍氢电池的充电接受能力还会随着充电速率的加快而提高,因此快速充电器更加高效。

快速可靠地检测到进入过充至关重要,尤其在使用高充电速率的方案中。这是最大限度延长电池寿命的关键。主要的充电控制方案通常依赖于对电池温度快速上升或电压峰值的检测。


电路硬件

一、方框图:

这里画一张方框图,让大家理解一下整个电路。

充电器的原理比较简单,打个比方,如果你要装满一桶水,你要做的步骤是:


1,  打开水龙头,让水桶接水。

2,  控制水龙头的大小,即流量的大小。

3,  留意水桶的情况,差不多满的时候,关闭水龙头。

框图中的单片机,是整个电路的核心,对电压、流量、温度等参数进行监控,并控制相对应的电路。


一、具体电路。

我把电路分为A-I9个部分。基本和之前的方框图对应。

1,   电路A:输入、输出以及软件烧录接口。

                              

2,   电路B:LED指示灯。

LED灯由单片机端口直接驱动。

3,   电路C:单片机,每个端口的具体作用,请参考其规格书

4,   电路D:温度检测。

R17为热敏电阻,其电阻随温度而变化,从而影响RC7端的电压,单片机靠检测该电压来判断温度。

5,   电路E:2.5V参考电压。

该电路可以用TL431代替,输出一个2.5V的基准电压即可。

6,   电路F:DC-DC电压变换

该电路的核心器件为:Q4D5L1以及后面的C14。单片机输出的PWM信号进入Q4g极,让Q4产生开关的动作,斩断5V直流电。电感L1Cout(电路里的C14)为储能器件,在Q4关断时释放能量。D5为释放的能量提供单向的导通路径。经过这一DC-DC变换后,5V电压被降为1.6-1.7V左右的直流电(在快速充电状态时)。


Q4用低压导通的型号即可,我用AP3401替代。

7,   电路G&H:MOS管开关电路 & Ni-MH电池。

单片机的RB4RB6分别控制Q2Q3的导通/关断。这一在共用一个DC-DC电源的情况下,实现2路电池的单独充电,互不影响。

51单片机作为最早传入国内的一个系列的单片机,应用有超过30多年的历史,甚至第一代接触51单片机的工程师还奋斗在岗位上,所以51单片机积累了太多的学习资料、例程、设计实例等。大学里的课程设计题目甚至毕业设计题目,在网上都能找到实际可用的资料,这也让很多学生有了参考,更愿意在此基础上去实现自己的设计,所以51单片机成了学生们的首选。由此也形成了一个非常庞大的灰色产业链,单片机课程设计、毕业设计代做,只要有需求就有供应,这些制作在网购平台上非常多,甚至有很多初创公司都是以51单片机开发板或者是代做设计起家的。


MOS管用低压导通的型号即可,比如我用的AP3400A替代。

这里再说一下,充电的模式。

当放入1节电池时:


下图是IC输出的PWM信号,从波形可以看出,这是一种断续充电模式,充1秒,暂停1秒。

下图是电池端的波形,也是对应为充1秒,暂停1秒。

当放入2节电池时:


下图是2节电池时,IC输出的PWM信号,可以看到,之前空闲的1秒,被用来给第二节电池充电,模式也是一样的,充1秒,停1秒。AB电池交替充电和休息。

8,   电路I:电流采样

充电电流流过R14时,会产生一个压降,R14的值很小,0.056欧姆。需要用运用进行放大,电路中的放大倍数为10倍。我手头没有MCP6V01,我用LM258替代。


软件

一、软件平台:MPLAB IDE v8.92

因为我的仿真器是ICD2,用不了MPLAB最新的版本,只能用8.92的旧版本。(使用ICD2仿真器,需要在winxp中安装MPLAB,否则ICD2会有通讯问题。)


MPLAB 8.92官方下载地址如下:

http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_IDE_8_92.zip

同时还需要安装编译器MPLAB-C18,这里有破解版,方法如下:

1) Download C18FAKE.EXE from addressbelow(下载破解器)
    http://math.haifa.ac.il/robotics/SWdevEnv/2007/MICROC~1.40_/?C=N;O=D

2) Run C18FAKE.EXE(运行该破解器)

3) Download Microchip C18 Compiler V3.35 Upgrade from microchip website.(下载C18的V3.35升级版本)
     http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB-C18-Upgrade-v3_35.exe

4) Installed 3.35 Upgrade (Selected C:\MCC18 as the directory to install to)(安装3.35升级版,选择C:\MCC18为安装目录)

5) Download & Installed 3.38 Upgrade or later (Selected C:\MCC18 as thedirectory to install to)(下载并安装3.38升级版,同样用C:\MCC18这个目录)
   http://ww1.microchip.com/downloads/en/DeviceDoc/mplabc18-v3_38-windows-upgrade-installer.exe

安装完MCC18后,还需要在MPLAB IDE中导入MCC18这个编译器。大家可以在网上搜索一下方法。

将源代码导入到IDE中,即把源代码文件中的项目文件打开。”USBCharger.mcp”。见下图。

 

点击“build all”,编译文件。编译成功的话,会显示“BUILD SUCCEEDED”。

 

编译后,会在文件原目录下,生成一个HEX文件。使用第三方烧录器时,可以用该文件烧录。大家可以在网上找一下烧录器或仿真器,只要能烧录18F14K50即可。

 

 


一、 源代码基本参数


a)         软件流程,下图为充电条件的判定流程。主要是以电池电压为条件来判定的,电池类型,电池充电状态,以定时器,温度、阻抗检测等判定电池故障。具体细节,请参考AN1384的笔记。

 

b)         主要参数的调整。我们只需要改动库文件里面的参数,即*.h文件。

l  库结构,见下图。我们主要改Hardware.hNiMh.h这两个文件的参数。

 

l  Hardware.h参数的改动:


1, #define TEMP_A_CHANNEL         0x06

/// Battery B temperature input ADC channel

#define TEMP_B_CHANNEL    0x09

上面是定义温度采集通道的,我这里设置了AN6作为A电池的温度采集通道,因此改为0x06。如果你2个电池都用它原来的通道测温度,则不需要改动。

 

2,#define        SHUNT_AMPLIFICATION         10

/// Shunt resistance value in mohms

#define          SHUNT_RESISTANCE        56 //in mohms

SHUNT_AMPLIFICATION为运放(U3)电流检测的放大倍数,原文档为10倍,这个可以依据你实际的放大倍数,来改变此参数。

SHUNT_RESISTANCE为电阻R14的阻值,单位为毫欧。我使用的电阻是50毫欧,因此改成50.

 

3,

#define NTC_0C                          0xBD06

#define NTC_25C                       0x8000    

#define NTC_45C                       0x543A    

#define NTC_50C                       0x4B36   


这里定义了NTC温度电阻R17,在0/25/45/50度时的值。以25度为例说明,25度时,R17的电阻值应该为10K,它与R1610K)分压,得到RC7点的电压为5/2=2.5V。该单片机的ADC精度为10位,即可以把5V分为1024份,每份能分辨的电压=5V/1024=0.00488V,那么2.5V16进制就表示为:200,采用64次的值为8000.

如果你用的NTC电阻不是10K的,则需要做相应的调整。

 

4, /// Thermistor B constant

#define THERMISTOR_BETA             3380  NTC电阻的Beta参数,这个要看NTC的规格书)

/// Thermistor 25 Celsius value

#define THERMISTOR_R0                 10000 25度时,NTC电阻的欧姆值,默认为10K

 

l  Ni-MH.h参数的改动:

1,

/// calculated maximum timer at full efficiency

#define FAST_CHARGE_TIME_NOLOSS                               (unsigned long) MAX_BATTERY_CAPACITY_AAA* 60 * 60 / INSTANT_CHARGE_CURRENT   

默认为AAA电池,如果是给AA充电,需要改为AAMAX_BATTERY_CAPACITY_AAA的容量在另外 一条语句里定义了。

#define MAX_BATTERY_CAPACITY_AA                               3000         //mAh

 

2

//Battery impedance limit

/// Maximum allowed battery impedance in mohms

#define Z_TEST_LIMIT                                 150

/// instantaneous (not average) FAST/FINISH charge current                                    

#define INSTANT_CHARGE_CURRENT             850

/// calculated maximum allowed voltage difference between charging and floating voltage                                 

#define CHARGE_MINUS_FLOAT_LIMIT (unsigned long) INSTANT_CHARGE_CURRENT * Z_TEST_LIMIT / 1000 // maximum diference in mV between charge and float voltage

 

这段语句,定义了电池的最大内阻,最大充电电流,以及Float电压公式。程序会采用Float电压公式,来判定电池是否是一个正常的电池,否则会进入故障模式。可以依据实际情况,调整最大内阻或最大充电电流。


> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >

中断程序执行完毕后回返回继续执行主程序,这样就要求中断不改变主程序的运行状态,所以中断响应时需要将程序当前运行的状态信息保存起来,比如程序运行到什么位置、当前CPU状态寄存器的状态等信息。当中断程序执行完毕,可以通过这些信息将CPU状态寄存器恢复原来状态,并能返回原程序继续执行。不同的单片机对此的处理方式也会有不同,一种是完全由硬件来完成,并不需要程序来进行管理;另外一种是将状态信息用相应指令保存在特定位置,返回时再用相应指令恢复原来状态。

生成海报
点赞 0

thePro

我还没有学会写个人说明!

相关推荐

基于8051单片机实现电子时钟+数字秒表设计

概述 电子时钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许

MDK5(keil5)编译按钮不见?

1.大部分是第一种情况 整个组件工具栏都不见了 解决办法: 2.小部分是组件工具栏没有编译按钮 解决办法: 参考: KEIL4 上面那个编译的工具栏怎么不见了 Keil工具栏详细说明