电动汽车、无人机和物联网设备等其他移动电子产品的进步似乎对未来充满希望。所有这些中的一个共同点是它们都由电池供电。按照摩尔定律,电子设备趋于变得更小、更便携,这些便携式设备应该有自己的电源来运行。当今便携式电子产品最常见的电池选择是锂离子或锂聚合物电池。虽然这些电池具有非常好的电荷密度,但它们在恶劣条件下化学性质不稳定,因此在充电和使用时应小心。
在这个项目中,我们将构建一个两级电池充电器(CC 和 CV),可用于为锂离子或锂聚合物电池充电。电池充电器电路专为我在大多数机器人项目中常用的 7.4V 锂电池组(两个 18650 串联)而设计,但可以轻松修改电路以适应较低或稍高的电池组,例如构建3.7 锂电池充电器或12v锂离子电池充电器。正如您可能知道的那样,这些电池有现成的充电器,但便宜的充电器非常慢,而快速的充电器非常昂贵。所以在这个电路中,我决定用具有 CC 和 CV 模式的 LM317 IC 构建一个简单的粗充电器。 此外,还有什么比构建自己的小工具并在其过程中学习更有趣的事情。
电池充电器的 CC 和 CV 模式:
我们打算在这里构建的充电器是两步充电器,这意味着它将具有两种充电模式,即恒定充电 (CC) 和恒定电压 (CV)。通过结合这两种模式,我们将能够比平时更快地为电池充电。
恒定电荷 (CC):
第一个开始运行的模式将是 CC 模式。这里应该进入电池的充电电流量是固定的。为了保持该电流,电压将相应变化。
恒压(CV):
一旦 CC 模式完成,CV 模式将启动。这里的电压将保持固定,电流将根据电池的充电要求而变化。
在我们的例子中,我们有一个 7.4V 锂电池组,它只不过是两个 3.7V 的 18650 电池串联(3.7V + 3.7V = 7.4V)。此电池组应在电压降至 6.4V(每节 3.2V)时充电,最高可充电至 8.4V(每节 4.2V)。因此,这些值已经为我们的电池组固定。
接下来我们决定了CC模式下的充电电流,这通常可以在电池的数据表中找到,该值取决于电池的Ah额定值。在我们的例子中,我决定将800mA 的值作为恒定充电电流。因此,最初当连接电池进行充电时,充电器应进入 CC 模式并通过改变充电电压将 800mA 推入电池。这将为电池充电,电池电压将开始缓慢增加。
由于我们将大电流推入具有较高电压值的电池,因此在电池充满电之前,我们不能将其留在 CC 中。当电池电压达到相当大的值时,我们必须将充电器从 CC 模式切换到 CV 模式。我们的电池组在充满电后应该是 8.4V,因此我们可以将其从 CC 模式切换到 8.2V 的 CV 模式。
一旦充电器切换到 CV 模式,我们应该保持恒定电压,在我们的例子中,恒定电压的值为 8.6V。与 CC 模式相比,电池在 CV 模式下消耗的电流要少得多,因为电池本身在 CC 模式下几乎已充电。因此,在固定的 8.6V 下,电池将消耗更少的电流,并且随着电池充电,该电流将减少。因此,当电流达到非常低的值(例如小于 50mA)时,我们必须监控电流,我们假设电池已充满电,并使用继电器自动断开电池与充电器的连接。
总结一下,我们可以列出电池充电过程如下
进入 CC 模式并以固定的 800mA 稳压电流为电池充电。
监控电池电压,当它达到 8.2V 时切换到 CV 模式。
在 CV 模式下,使用固定的 8.6V 稳压电压为电池充电。
监控充电电流,因为它降低了。
当电流达到 50mA 时,自动断开电池与充电器的连接。
800mA、8.2V 和 8.6V 的值是固定的,因为我们有一个 7.4V 锂电池组。您可以根据电池组的要求轻松更改这些值。另请注意,存在许多阶段充电器。像这样的两级充电器是最常用的一种。在三阶段充电器中,阶段将是 CC、CV 和浮动。在四级或六级充电器中,将考虑内部电阻、温度等。现在,我们对两步充电器的实际工作方式有了一个简要的了解,让我们进入电路图。
电路原理图
这个锂离子电池充电器的完整电路图可以在下面找到。该电路是使用 EasyEDA 制作的,PCB 也将使用相同的制作。
如您所见,电路非常简单。我们使用了两个LM317 可变电压调节器 IC,一个用于调节电流,另一个用于调节电压。第一个继电器用于在 CC 和 CV 模式之间切换,第二个继电器用于连接或断开电池与充电器的连接。让我们将电路分成几段并了解其设计。
LM317 电流调节器
LM317 IC 可在单个电阻器的帮助下充当电流调节器。相同的电路如下所示
对于我们的充电器,我们需要如上所述调节 800mA 的电流。数据表中给出了计算所需电流的电阻值的公式:
电阻器(欧姆)= 1.25 / 电流(安培)
在我们的例子中,电流值为 0.8A,为此我们得到 1.56 欧姆的电阻值。但是我们可以使用的最接近的值是上面电路图中提到的 1.5 欧姆。
LM317 稳压器
对于锂电池充电器的 CV 模式,我们必须将电压调节到 8.6V,如前所述。同样,LM317 只需两个电阻即可做到这一点。相同的电路如下所示。
计算 LM317 稳压器输出电压的公式为
在我们的例子中,输出电压 (Vout) 应为 8.6V,R1(此处为 R2)的值应小于 1000 欧姆,因此我选择了 560 欧姆的值。有了这个,如果我们计算 R2 的值,我们得到它是 3.3k 欧姆。或者,您可以使用任何值的电阻器组合,只要您获得 8.6V 的输出电压。
用于在 CC 和 CV 模式之间切换的继电器布置
我们有两个 12V 继电器,每个都由 Arduino 通过BC547 NPN 晶体管驱动。两者的继电器布置如下图所示
第一个继电器用于在充电器的 CC 和 CV 模式之间切换,该继电器由标记为“模式”的 Arduino 引脚触发。默认情况下,继电器在触发时处于 CC 模式,它会从 CC 模式变为 CV 模式。
同样,第二个继电器用于连接或断开充电器与电池的连接;该继电器由标记为“充电”的 Arduino 引脚触发。默认情况下,继电器会断开电池与充电器的连接,当触发时,它会将充电器连接到电池。除此之外,两个二极管 D1 和 D2 用于保护电路免受反向电流的影响,而 1K 电阻器 R4 和 R5 用于限制流过晶体管基极的电流。
测量锂电池电压
为了监控充电过程,我们必须测量电池电压,然后我们才能在电池电压达到 8.2V 时将充电器从 CC 模式切换到 CV 模式,如上所述。使用 Arduino 等微控制器测量电压的最常用技术是使用分压器电路。这里使用的一个如下所示。
我们知道 Arduino 模拟引脚可以测量的最大电压为 5V,但我们的电池在 CV 模式下可能高达 8.6V,因此我们需要将其降压到较低的电压。这完全由分压器电路完成。您可以使用此在线分压器计算器计算电阻器的值并了解有关分压器的更多信息。在这里,我们将输出电压减去原始输入电压的一半,然后通过“ B_Voltage ”标签将该输出电压发送到 Arduino 模拟引脚。我们稍后可以在对 Arduino 进行编程时检索原始值。
测量充电电流
另一个要测量的重要参数是充电电流。在 CV 模式下,当充电电流低于 50mA 时,电池将与充电器断开连接,表示充电完成。测量电流的方法有很多,最常用的方法是使用分流电阻。相同的电路如下所示
它背后的概念是简单的欧姆定律。使流向电池的全部电流流过分流电阻器2.2R。然后根据欧姆定律(V = IR),我们知道该电阻器上的电压降将与流过它的电流成正比。由于我们知道可以使用 Arduino 模拟引脚测量电阻的值和其两端的电压,因此可以轻松计算出电流值。电阻上的电压降值通过标签“B_Current ”发送到 Arduino。我们知道最大充电电流为 800mA,因此通过使用公式 V=IR 和 P=I 2 R 我们可以计算电阻器的电阻值和功率值。
Arduino和液晶显示器
最后,在 Arduino 方面,我们必须将LCD 与 Arduino连接,以向用户显示充电过程,并通过测量电压、电流并相应地触发继电器来控制充电。
Arduino Nano 有一个板载电压调节器,因此电源电压提供给 Vin,调节后的 5V 用于运行 Arduino 和16x2 LCD 显示器。电压和电流可以通过模拟引脚 A0 和 A1 分别使用标签“B_Voltage”和“B_Current”测量。继电器可以通过切换通过标签“模式”和“充电”连接的 GPIO 引脚 D8 和 D9 来触发。一旦原理图准备好,我们就可以继续进行PCB制造。
为 Arduino 编程进行两步锂电池充电
硬件准备好后,我们可以继续为 Arduino Nano 编写代码。该项目的完整程序在页面底部提供,您可以将其直接上传到您的 Arduino。现在,让我们将程序分解成小片段并了解代码的实际作用。
与往常一样,我们通过初始化 I/O 引脚开始程序。从我们的硬件中我们知道,引脚 A0 和 A2 分别用于测量电压和电流,引脚 D8 和 D9 用于控制模式继电器和充电继电器。定义相同的代码如下所示
常量 int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7; //注明LCD连接的管脚号 LiquidCrystal lcd(rs, en, d4, d5, d6, d7); 整数电荷 = 9;//引脚连接或断开电池到电路 int Mode = 8; //引脚在 CC 模式和 CV 模式之间切换 int Voltage_divider = A0; //测量电池电压 int Shunt_resistor = A1; //测量充电电流 float Charge_Voltage; 浮动 Charge_current;
在setup函数中,我们初始化 LCD 函数并在屏幕上显示介绍消息。我们还将继电器引脚定义为输出引脚。然后触发充电继电器将电池连接到充电器,默认情况下充电器保持在 CC 模式。
无效 setup() { lcd.begin(16, 2); //初始化16*2 LCD lcd.print("7.4V Li+充电器"); //介绍消息行 1 lcd.setCursor(0, 1); lcd.print("-CircuitDigest"); //介绍消息行 2 lcd.clear(); pinMode(充电,输出); pinMode(模式,输出); 数字写入(充电,高);//开始充电 最初通过连接电池 digitalWrite(Mode,LOW); // CV 模式为 HIGH,CC 模式为 LOW,初始 CC 模式 延迟(1000); }
接下来,在无限循环函数中,我们通过测量电池电压和充电电流来开始程序。数值 0.0095 和 1.78 乘以模拟值,将 0 到 1024 转换为实际电压和电流值,您可以使用万用表和钳形表测量实际值,然后计算乘数值。理论上,它也是根据我们使用的电阻器计算乘数值,但它并不像我预期的那么准确。
//最初测量电压和电流 Charge_Voltage = analogRead(Voltage_divider) * 0.0092; //测量电池电压 Charge_current = analogRead(Shunt_resistor) * 1.78; //测量充电电流
如果充电电压低于 8.2V,我们进入 CC 模式,如果高于 8.2V,我们进入 CV 模式。每种模式都有自己的while循环。在 CC 模式循环内,我们将 Mode 引脚保持为低电平以保持 CC 模式,然后继续监控电压和电流。如果电压超过 8.2V 阈值电压,我们使用 break 语句断开 CC 回路。充电电压的状态也显示在 CC 回路内的 LCD 上。
//如果电池电压低于8.2V进入CC模式 while(Charge_Voltage<8.2) //CC MODE Loop { digitalWrite(Mode,LOW); //保持CC模式 //测量电压和电流 Charge_Voltage = analogRead(Voltage_divider) * 0.0095; //测量电池电压 Charge_current = analogRead(Shunt_resistor) * 1.78; //测量充电电流 //在 LCD 上打印细节lcd.print ("V="); lcd.print(Charge_Voltage); lcd.setCursor(0, 1); lcd.print("在抄送模式"); 延迟(1000); lcd.clear(); //检查我们是否必须退出 CC 模式 if(Charge_Voltage>=8.2) // 如果是 { digitalWrite(Mode,HIGH); //更改为CV模式 break; } }
CV 模式也可以采用相同的技术。如果电压超过 8.2V,充电器通过将 Mode 引脚设为高电平进入 CV 模式。这会在电池上施加一个恒定的 8.6V,并且允许充电电流根据电池要求而变化。然后监控这个充电电流,当它低于 50mA 时,我们可以通过断开电池与充电器的连接来终止充电过程。为此,我们只需关闭充电继电器,如下面的代码所示
//如果电池电压大于8.2V进入CV模式 while (Charge_Voltage>=8.2) //CV MODE Loop { digitalWrite(Mode,HIGH); //保持 CV 模式 //测量电压和电流 Charge_Voltage = analogRead(Voltage_divider) * 0.0092; //测量电池电压 Charge_current = analogRead(Shunt_resistor) * 1.78; //测量充电电流 //在 LCD 中向用户显示详细信息 lcd.print("V="); lcd.print(Charge_Voltage); lcd.print("我="); lcd.print(Charge_current); lcd.setCursor(0, 1); lcd.print("在 CV 模式下"); 延迟(1000); lcd.clear(); //通过监控充电电流检查电池是否充电 if(Charge_current<50) //如果是 { digitalWrite(Charge,LOW); //关闭充电 while(1) //保持充电器关闭直到重启 { lcd.setCursor(0, 1); lcd.print("充电完成。"); 延迟(1000); lcd.clear(); } } } }
7.4V两步锂电池充电器的工作原理
硬件准备好后,将代码上传到 Arduino 板。然后将电池连接到板子的充电端。确保以正确的极性连接它们,颠倒极性会对电池和电路板造成严重损坏。连接电池电源后,使用 12V 适配器连接充电器。您将收到介绍性文字,充电器将根据电池状态进入 CC 模式或 CV 模式。如果在充电时电池完全放电,它将进入 CC 模式,您的 LCD 将显示如下内容。
随着电池充电,电压将增加,如下面的视频所示。当此电压达到 8.2V 时,充电器将从 CC 模式进入 CV 模式,现在它将同时显示电压和电流,如下所示。
从这里开始,电池的电流消耗会随着充电而慢慢下降。当电流达到 50mA 或更低时,充电器假定电池已充满电,然后使用继电器断开电池与充电器的连接,并显示以下屏幕。之后,您可以断开电池与充电器的连接并在您的应用程序中使用它。
希望您了解该项目并喜欢构建它,这个完整的电路板可以用作方便的锂离子电池充电模块。
/*
* 7.4V 锂电池两步充电器代码
* 作者:Aswinth Raj
* 适用于:www.circuitdigest.com
* 日期:2019 年 11 月1 日
*/
#include
常量 int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7; //注明LCD连接的管脚号
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
整数电荷 = 9;//引脚连接或断开电池到电路
int Mode = 8; //引脚在 CC 模式和 CV 模式之间切换
int Voltage_divider = A0; //测量电池电压
int Shunt_resistor = A1; //测量充电电流
float Charge_Voltage;
浮动 Charge_current;
无效 setup() {
lcd.begin(16, 2); //初始化16*2 LCD
lcd.print("7.4V Li+充电器"); //介绍消息行 1
lcd.setCursor(0, 1);
lcd.print("-CircuitDigest"); //介绍消息行 2
lcd.clear();
pinMode(充电,输出);
pinMode(模式,输出);
数字写入(充电,高);//开始充电 最初通过连接电池
digitalWrite(Mode,LOW); // CV 模式为 HIGH,CC 模式为 LOW,初始为 CC 模式
延迟(1000);
}
无效循环(){
//最初测量电压和电流
Charge_Voltage = analogRead(Voltage_divider) * 0.0092; //测量电池电压
Charge_current = analogRead(Shunt_resistor) * 1.78; //测量充电电流
//如果电池电压低于8.2V进入CC模式
while(Charge_Voltage<8.2) //CC MODE Loop
{
digitalWrite(Mode,LOW); //保持CC模式
//测量电压和电流
Charge_Voltage = analogRead(Voltage_divider) * 0.0095; //测量电池电压
Charge_current = analogRead(Shunt_resistor) * 1.78; //测量充电电流
//在 LCD 上打印
细节 lcd.print("V="); lcd.print(Charge_Voltage);
lcd.setCursor(0, 1);
lcd.print("在抄送模式");
延迟(1000);
lcd.clear();
//检查我们是否必须退出 CC 模式
if(Charge_Voltage>=8.2) // 如果是
{
digitalWrite(Mode,HIGH); //更改为CV模式
break;
}
}
//如果电池电压大于8.2V进入CV模式
while (Charge_Voltage>=8.2) //CV MODE Loop
{
digitalWrite(Mode,HIGH); //保持CV模式
//测量电压和电流
Charge_Voltage = analogRead(Voltage_divider) * 0.0092; //测量电池电压
Charge_current = analogRead(Shunt_resistor) * 1.78; //测量充电电流
//在 LCD 中向用户显示详细信息
lcd.print("V="); lcd.print(Charge_Voltage);
lcd.print("我="); lcd.print(Charge_current);
lcd.setCursor(0, 1);
lcd.print("在 CV 模式下");
延迟(1000);
lcd.clear();
//通过监控充电电流检查电池是否充电
if(Charge_current<50) //如果是
{
digitalWrite(Charge,LOW); //关闭充电
while(1) //保持充电器关闭直到重启
{
lcd.setCursor(0, 1);
lcd.print("充电完成。");
延迟(1000);
lcd.clear();
}
}
}
}
//**快乐充电**//
评论
查看更多