随着科学技术的发展进步,我们的电子产品变得越来越小,具有更多功能和更复杂的应用。随着复杂性的增加,电路的功率要求也增加了,为了使设备尽可能小,以及方便携带,我们需要一种可以长时间提供大电流的电池,同时重量要轻得多,以便设备应该保持便携。
电池的种类有很多,铅酸电池、镍镉电池和镍氢电池不适合这种应用,因为它们要么更重,要么无法提供我们应用所需的电流,锂电池可以提供大电流,同时保持重量轻且尺寸紧凑。
为什么我们需要测量电池容量? 市场上有许多电池供应商出售廉价仿冒版的锂离子电池,声称其规格奇特且价格低廉,令人难以置信。当您购买这些电池时,它们要么根本不工作,要么如果它们可以工作,充电容量或电流太低以至于它们根本无法与应用程序一起工作。那么,如何测试锂电池是否假冒的呢?其中一种方法是在空载和负载情况下测量开路电压,但这并不可靠。
因此,我们将为18650锂离子电池制作一个电池容量测量仪,该测量仪将通过电阻对充满电的18650电池进行放电,同时测量流过电阻的电流以计算其容量。如果在电池电压处于指定限制范围内时未获得声称的电池容量,则该电池有故障,您不应使用该电池,因为电池的充电状态会在负载下以非常快的速度耗尽,从而产生如果在电池组中使用本地电流回路,会导致发热并可能起火。
所需的组件 ● Arduino Nano开发板 ● 1602液晶显示屏 ● LM741运算放大器 ● 2.2Ω、5W电阻 ● 7805正电压稳压 ● 12V电源 ● 0.47uF电容 ● 33kΩ电阻 ● IRF540N N沟道MOSFET
Arduino电池容量测量仪电路图 18650电池容量测量仪的完整电路图如下所示:
计算和显示单元 该电路由两部分组成,使用5V供电的Arduino Nano开发板和1602显示屏,实时显示电流和电压测量的结果。该电路由使用12V电源供电,Arduino和LCD显示屏所需的最大电流约为 60-70mA。
要将电压降低到 5V,我们将使用一个线性稳压器,它可以承受高达35V的电压,并且需要至少7.5V的输入电源来提供稳定的5V,并且多余的电压会以热量的形式消散,因此如果您的输入LM7805稳压IC电压大于12V,考虑加散热片,以免损坏。LCD由7805的5V电源供电,并连接到Arduino开发板。我们还添加了一个电位器来控制LCD显示屏的对比度。
恒定负载电流电路 其次是基于PWM的恒流负载电路,使流过电阻的负载电流可以由我们控制并保持恒定,从而不会随着电池电压的下降而因电流随时间的变化而产生误差。它由LM741运算放大器和IRF540N N 沟道MOSFET组成,通过根据我们设置的电压电平打开和关闭MOSFET来控制流过MOSFET的电流。
运算放大器工作在比较器模式,在这种模式下,只要运算放大器的非反相引脚的电压高于反相引脚的电压,运算放大器的输出就会为高电平。同样,如果运放反相引脚的电压高于同相引脚,运放的输出将被拉低。在给定的电路中,非反相引脚电压电平由Arduino NANO的D9 PWM引脚控制,该引脚以500Hz频率切换,然后通过电阻值为 33kΩ 的低通 RC 电路滤波器和电容为 0.47 的电容器uF,在同相引脚提供几乎恒定的直流信号。反相引脚连接到负载电阻,读取电阻和GND两端的电压。运算放大器的输出引脚连接到 MOSFET 的栅极端子以将其打开或关闭。运算放大器将尝试通过切换连接的MOSFET使其两端的电压相等,因此流过电阻的电流将与NANO的D9引脚上设置的 PWM 值成正比。在这个项目中,我将电路的最大电流限制为1.3A。
测量电压 典型充满电的锂离子电池的最大电压为 4.1V 至 4.3V,低于 Arduino Nano 的模拟输入引脚的 5V 电压限制,其内部电阻超过10kΩ,因此我们可以直接连接单元到任何模拟输入引脚,而不必担心流过它们的电流。所以,在这个项目中,我们需要测量电池的电压,以便可以确定电池是否在正确的电压工作范围内,以及是否完全放电。
我们还需要测量流过电阻的电流,因为我们不能使用分流器,因为电路的复杂性会增加,负载路径中的电阻增加会降低电池放电率。使用较小的分流电阻器将需要一个额外的放大器电路,以使来自它的电压读数对 Arduino 可读。
所以我们直接读取负载电阻两端的电压,然后使用欧姆定律将负载电阻值得到的电压除以得到流过它的电流。电阻的负极直接连接到 GND,因此我们可以放心地假设我们在电阻上读取的电压是电阻中的电压降。
测量电池容量的Arduino程序 现在完成硬件电路后,我们开始进行 Arduino 编程。我们使用Arduino驱动与其连接的1602液晶屏,并测量电池的电压和流过负载电阻的电流。首先在代码中声明头文件来驱动液晶屏。
现在已经定义了头文件,我们继续声明变量,用来计算电压和电流。此外,在本节中,我们必须定义用于驱动LCD的引脚以及将用于提供PWM输出并读取来自电池和电阻的模拟电压的引脚。 - #include <LiquidCrystal.h> //Default Arduino LCD Librarey is included
- const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; //Mention the pin number for LCD connection
- LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
- const float BAT_LOW = 3.0; //to define the low voltage limit of the Li Ion cell
- const float BAT_HIGH = 4.5; //to define the high voltage limit of the cell
- const int MOSFET_Pin=9;
- const int PWM_VALUE=150;
- unsigned long previousMillis = 0; // Previous time in ms
- unsigned long millisPassed = 0; // Current time in ms
- float Capacity=0; //Variable to define the battery Capacity
- float Resistor=2.2; // Load Resistor Value is 2.2ohms
- float mA;
复制代码
在setup()函数中,初始化串口以及LCD显示屏。代码将在屏幕上显示一条欢迎消息“Battery Capacity Tester Circuit”,并持续3秒钟。 - void setup()
- {
- Serial.begin(9600);
- lcd.begin(16, 2);
- lcd.setCursor(0, 0); // Set the cursor on the first column and first row.
- lcd.print("Battery Capacity");
- lcd.setCursor(0,1);
- lcd.print("Tester Circuit");
- delay(3000);
- lcd.clear();
- }
复制代码
现在我们不需要将Arduino的PWM引脚声明为输出,因为我们将在主循环中使用的AnalogWrite函数负责这部分。您确实需要在代码中定义要写入该引脚的 PWM 值。根据您的应用所需的放电电流仔细选择 PWM 值。PWM值太大会导致锂离子电池中的大电流和高电压降,而PWM值太低会导致电池的放电时间过长。在主循环函数中,我们将读取引脚A0和A1上的电压,因为Arduino板上有一个10位 ADC,因此我们应该得到范围为 0-1023的数字输出值,我们需要将其缩小到0-5V 范围乘以 5.0/1023.0。、
现在来解释一下代码的逻辑,我们不断测量电池的电压,如果电池电压超过我们在代码中指定的上限,那么液晶显示屏上会显示错误信息,让您知道电池是否正常。过充电或连接有问题,并且MOSFET栅极引脚的电源停止,因此没有电流流过负载电阻。在将电池连接到容量测试板之前,首先为电池充满电至关重要,这样您就可以计算其总充电容量。 - analogWrite(MOSFET_Pin, PWM_VALUE);
- // read the input on analog pin 0:
- int sensorValue_voltage_Cell = analogRead(A0);
- // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
- float voltage = sensorValue_voltage_Cell * (5.08 / 1023.0);
- Serial.print("VOLTAGE: ");
- Serial.println(voltage); // Here the voltage is being printed on Serial Monitor
- lcd.setCursor(0, 0); // Set the cursor on the first column and first row.
- lcd.print("Voltage: "); // Print the voltage reading on the screen
- lcd.print(voltage);
- delay(100);
- int sensorValue_Shunt_Resistor= analogRead(A1);
- float voltage1= sensorValue_Shunt_Resistor *(5.08 / 1023.0);
- float current= voltage1/Resistor;
- Serial.print("Current: ");
- Serial.println(current);
- lcd.setCursor(0, 1); //Set the cursor on the first column and the second row (counting starts at 0!).
- lcd.print("Current: ");
- lcd.print(current);
复制代码
现在,如果电池电压在我们指定的上限和下限电压范围内,那么Nano开发板将通过上面指定的方法读取当前值,并将其乘以测量期间经过的时间,并将其存储在我们之前定义的容量变量中以 mAh 为单位。在这整个过程中,实时电流和电压值显示在附带的液晶显示屏上,如果需要,您还可以在串口监视器上看到。电池的放电过程将一直持续到电池电压低于我们在程序中指定的下限,然后电池的总容量会显示在 LCD 屏幕上,并且通过拉动 MOSFET 栅极来停止流过电阻的电流引脚低。 - else if(voltage > BAT_LOW && voltage < BAT_HIGH )
- { // Check if the battery voltage is within the safe limit
- millisPassed = millis() - previousMillis;
- mA = current * 1000.0 ;
- Capacity = Capacity + (mA * (millisPassed / 3600000.0)); // 1 Hour = 3600000ms to convert it into mAh units
- previousMillis = millis();
- delay(1000);
- lcd.clear();
- }
复制代码
以下是本文的完整代码:
main.rar
(1.31 KB, 下载次数: 1)
搭建电路并测试 现在,当我们在面包板上设计和测试电路的不同部分并确保它们都按预期工作后,我们使用万能板将所有组件焊接在一起,因为这是一种更专业和可靠的电路测试方法。Arduino Nano、1602显示屏和LM741运算放大器安装在IC插座上,以便以后可以重复使用。
通过DC连接器为恒定负载电流电路提供12V电源,然后通过LM7805,为Nano和LCD提供了5V电源。现在给电路通电,并调节电位器来设置液晶屏的对比度,此时你应该在液晶屏上看到欢迎信息,然后如果电池的电压电平在工作范围内,那么将会显示电池的电压和电流。
这是计算电池容量的一个非常基本的测试方法,可以通过获取数据并将其存储在 Excel 文件中以通过图形方法进行后期数据处理和可视化来改进。在当今数据驱动的世界中,该电池放电曲线可用于构建电池的准确预测模型,通过使用 NI LabVIEW、MATLAB Simulink 等软件,无需实际测试即可模拟和查看电池在负载条件下的响应。如果您对此项目有任何疑问,请随时在本帖下面回复。
|