来源:http://blog.sina.com.cn/s/blog_705d6e340102vtnc.html 点击阅读原文进入
之前一直想学习一下单片机的编程,但限于时间和环境,一直未能掌握要领。去年有些空余,又找了下单片机的资料来了解一下,无意中看到Microchip有个Ni-MH充电器的应用资料,里面包含了源代码,电路图,以及详解,加之手头上有对应的IC。于是有了依葫芦画瓢,照做一个的想法。中间遇到了不少问题,加上未有太多空余时间,一直拖到现在,才出来个像样的板子。
先列一下基本的参数:
1,
2,
3,
4,
5,
接下来,说一下我们需要用到的工具:
1,
2,
3,
4,
5,
原文档链接
大家可以在下面这两个链接里找到设计的文档:
http://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=cn555023
里面包含了:
1,
2,
3,
http://www.microchip.com/pagehandler/zh-cn/devtools/usb-aaa-battery-charger-demo.html
里面包含了:
1,
2,
3,
4,
5,
6,
7,
NI-MH电池
先来了解一下Ni-MH电池的基本特性,Microchip的应用笔记AN1384里面有详细的说明,我这里摘录一些要点。
1,
2,
图2显示了电池以5小时速率(C/5速率)放电时的典型放电曲线。开路电压最初非常快速地从约1.4V降至1.2V稳定状态。在电池电量接近耗尽时,呈现出急拐弯的“膝盖”形状,此时电压下降得非常快。
3,
为金属氢化物电池充电时,电压最初急升,之后缓慢升高,直到完全充电。当电池到达过充时,电压达到峰值,之后逐渐降低。由于金属氢化物电池的充电过程是放热的,因此整个充电过程都在释放热量。当电池到达过充时,大量传入能量转换为热量,使电池温度大幅升高。
压力在充电期间也会缓慢增大,但在过充时会大幅升高,因为产生的气体量超出了电池的重新组合能力。如果没有安全口,C 速率(或更高速率)下不受控制的充电会对电池造成物理损坏。
温度对充电效率的影响是镍氢电池与镍镉电池之间的另一个差异所在。镍氢电池的充电接受能力随着温度的升高而降低(从低于20°C的温度开始)。镍镉电池的充电接受能力在室温达到峰值。对于两种电池类型来说,高温下充电接受能力较低是一个严重问题。在靠近热源的位置或者通风有限的隔间中安装电池时,产品设计人员应多加小心。
镍氢电池的充电接受能力还会随着充电速率的加快而提高,因此快速充电器更加高效。
快速可靠地检测到进入过充至关重要,尤其在使用高充电速率的方案中。这是最大限度延长电池寿命的关键。主要的充电控制方案通常依赖于对电池温度快速上升或电压峰值的检测。
电路硬件
一、方框图:
这里画一张方框图,让大家理解一下整个电路。
充电器的原理比较简单,打个比方,如果你要装满一桶水,你要做的步骤是:
1,
2,
3,
框图中的单片机,是整个电路的核心,对电压、流量、温度等参数进行监控,并控制相对应的电路。
一、具体电路。
我把电路分为A-I,9个部分。基本和之前的方框图对应。
1,
2,
LED灯由单片机端口直接驱动。
3,
4,
R17为热敏电阻,其电阻随温度而变化,从而影响RC7端的电压,单片机靠检测该电压来判断温度。
5,
该电路可以用TL431代替,输出一个2.5V的基准电压即可。
6,
该电路的核心器件为:Q4、D5、L1以及后面的C14。单片机输出的PWM信号进入Q4的g极,让Q4产生开关的动作,斩断5V直流电。电感L1和Cout(电路里的C14)为储能器件,在Q4关断时释放能量。D5为释放的能量提供单向的导通路径。经过这一DC-DC变换后,5V电压被降为1.6-1.7V左右的直流电(在快速充电状态时)。
Q4用低压导通的型号即可,我用AP3401替代。
7,
单片机的RB4和RB6分别控制Q2和Q3的导通/关断。这一在共用一个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秒。A、B电池交替充电和休息。
8,
充电电流流过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(下载破解器)
2) Run C18FAKE.EXE(运行该破解器)
3) Download Microchip C18 Compiler V3.35 Upgrade from microchip website.(下载C18的V3.35升级版本)
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这个目录)
安装完MCC18后,还需要在MPLAB IDE中导入MCC18这个编译器。大家可以在网上搜索一下方法。
将源代码导入到IDE中,即把源代码文件中的项目文件打开。”USBCharger.mcp”。见下图。
点击“build all”,编译文件。编译成功的话,会显示“BUILD SUCCEEDED”。
编译后,会在文件原目录下,生成一个HEX文件。使用第三方烧录器时,可以用该文件烧录。大家可以在网上找一下烧录器或仿真器,只要能烧录18F14K50即可。
一、 源代码基本参数
a)
b)
l
l
1, #define TEMP_A_CHANNEL
/// Battery B temperature input ADC channel
#define TEMP_B_CHANNEL
上面是定义温度采集通道的,我这里设置了AN6作为A电池的温度采集通道,因此改为0x06。如果你2个电池都用它原来的通道测温度,则不需要改动。
2,#define
/// Shunt resistance value in mohms
#define
SHUNT_AMPLIFICATION为运放(U3)电流检测的放大倍数,原文档为10倍,这个可以依据你实际的放大倍数,来改变此参数。
SHUNT_RESISTANCE为电阻R14的阻值,单位为毫欧。我使用的电阻是50毫欧,因此改成50.
3,
#define NTC_0C
#define NTC_25C
#define NTC_45C
#define NTC_50C
这里定义了NTC温度电阻R17,在0/25/45/50度时的值。以25度为例说明,25度时,R17的电阻值应该为10K,它与R16(10K)分压,得到RC7点的电压为5/2=2.5V。该单片机的ADC精度为10位,即可以把5V分为1024份,每份能分辨的电压=5V/1024=0.00488V,那么2.5V的16进制就表示为:200,采用64次的值为8000.
如果你用的NTC电阻不是10K的,则需要做相应的调整。
4, /// Thermistor B constant
#define THERMISTOR_BETA
/// Thermistor 25 Celsius value
#define THERMISTOR_R0
l
1,
/// calculated maximum timer at full efficiency
#define FAST_CHARGE_TIME_NOLOSS
默认为AAA电池,如果是给AA充电,需要改为AA。MAX_BATTERY_CAPACITY_AAA的容量在另外 一条语句里定义了。
#define MAX_BATTERY_CAPACITY_AA
2,
//Battery impedance limit
/// Maximum allowed battery impedance in mohms
#define Z_TEST_LIMIT
/// instantaneous (not average) FAST/FINISH charge current
#define INSTANT_CHARGE_CURRENT
/// 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电压公式,来判定电池是否是一个正常的电池,否则会进入故障模式。可以依据实际情况,调整最大内阻或最大充电电流。
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >