Introduction: Battery Capacity Tester Using Arduino [Lithium-NiMH-NiCd]
- Identify a fake Lithium-Ion/Lithium-Polymer/NiCd/NiMH battery
- Adjustable constant current load (can also be modified by the user)
- Capable of measuring the capacity of almost any kind of battery (below 5V)
- Easy to solder, build, and use, even for beginners (all components are Dip)
- An LCD user interface
- Board Supply: 7V to 9V(Max)
- Battery Input: 0-5V(max) – no reverse polarity Constant
- Current Load: 37mA to 540mA(max) – 16 Steps – can be modified by the user
The true measurement of a battery’s capacity is essential for many scenarios. A capacity measurement device can solve the problem of spotting fake batteries as well. Nowadays fake Lithium and NiMH batteries are everywhere which don’t handle their advertised capacities. Sometimes it is difficult to distinguish between a real and a fake battery. This problem exists in the spare batteries market, such as cell phone batteries. Furthermore, in many scenarios, it is essential to determine the capacity of a second-hand battery (for instance a laptop battery). In this article, we will learn to build a battery capacity measurement circuit using the famous Arduino-Nano board. I’ve designed the PCB board for dip components. So even beginners can solder and use the device.
1: Circuit Analysis
Figure 1 shows the schematic diagram of the device. The core of the circuit is an Arduino-Nano board.
Step 1: Figure 1, Schematic Diagram of the Battery Capacity Measurement Device
IC1 is an LM358  chip which contains two operational amplifiers. R5 and C7 build a low pass filter which converts the PWM pulse to a DC voltage. The frequency of the PWM is around 500Hz. I used a Siglent SDS1104X-E oscilloscope to examine the PWM and filter’s behavior. I connected the CH1 to the PWM output (Arduino-D10) and CH2 to the filter’s output (Figure 2). You can even examine the filter’s frequency response and its cut-off frequency “in practice” by the bode plot, which is one of the nice introduced features of the SDS1104X-E.
Step 2: Figure 2, the PWM Signal (CH1: 2V/div) and the Result After Passing Through the R5-C7 RC Filter (CH2: 50mV/div)
R5 is a 1M resistor which hugely limits the current, however, the output of the filter passes through an opamp (the second opamp of IC1), in a voltage follower configuration. The first opamp of the IC1, R7, and Q2 build a constant current load circuit. So far, we have built a PWM controllable constant current load.
A 2*16 LCD is used as a user interface which makes the controlling/adjustments easy. R4 potentiometer sets the LCD contrast. R6 limits the backlight current. P2 is a 2 pins Molex connector that is used to connect a 5V buzzer. R1 and R2 are pull-up resistors for the tactile switches. C3 and C4 are used to debounce the push-buttons. C1 and C1 are used to filter the circuit supply voltage. C5 and C6 are used to filter out the constant current load circuit noises to not to degrade the ADC conversion performance. R7 acts as a load for the Q2 MOSFET.
1-1: What is a constant current DC load?
A constant current load is a circuit that always draws a constant amount of current, even if the applied input voltage varies. For example, if we connect the constant current load to a power supply and set the current on 250mA, the current draw will not change even if the input voltage is 5V or 12V or whatever. This feature of the constant current load circuit allows us to build the battery capacity measurement device. If we use a simple resistor as a load to measure the battery capacity, as the battery voltage decrease, the current also decreases which make the calculations complex and inaccurate.
2: PCB Board
Figure 3 shows the designed PCB layout of the circuit. Both sides of the board are used to mount the components. When I intend to design a Schematic/PCB, I always use the SamacSys component libraries, because these libraries follow industrial IPC standards and all are free. I used these libraries for IC1 , Q2 , and even I could find the Arduino-Nano (AR1)  library which saved a lot from the designing time. I use the Altium Designer CAD software, so I used the Altium plugin to install the components libraries . Figure 4 shows the selected components.
Step 3: Figure 3, the PCB Board of the Battery Capacity Measurement Circuit
When I intend to design a Schematic/PCB, I always use the SamacSys component libraries, because these libraries follow industrial IPC standards and all are free. I used these libraries for IC1 , Q2 , and even I could find the Arduino-Nano (AR1)  library which saved a lot from the designing time. I use the Altium Designer CAD software, so I used the Altium plugin to install the components libraries . Figure 4 shows the selected components.
Step 4: Figure 4, Installed Components From the SamacSys Altium Plugin
The PCB board is slightly bigger than a 2*16 LCD to fit the three tactile push-buttons. Figures 5, 6, and 7 show 3D views of the board.
Step 5: Figure 5: a 3D View of the Assembled PCB Board (TOP), Figure 6: a 3D View of the Assembled PCB Board (Side), Figure 7: a 3D View of the Assembled PCB Board (Bottom)
3: Assembly and Test
I used a semi-homemade PCB board to build a fast prototype and test the circuit. Figure 8 shows a picture of the board. You don’t need to follow me, just order the PCB to a professional PCB fabrication company and build the device. You should use a standing potentiometer type for the R4 which allows you to adjust the LCD contrast from the side of the board.
Step 6: Figure 8: a Picture of the First Prototype, on a Semi-homemade PCB Board
After soldering the components and preparing the test conditions, we are ready to test our circuit. Don’t forget to mount a big heatsink on the MOSFET (Q2). I selected R7 to be a 3-ohm resistor. This allows us to generate constant currents up to 750mA, but in the code, I set the maximum current to somewhere around 500mA which is enough for our purpose. Lowering the resistor value (to for example 1.5-ohm) can make higher currents, however, you have to use a more powerful resistor and modify the Arduino code. Figure 9 shows the board and its external wirings.
Step 7: Figure 9: Wiring of the Battery Capacity Measurement Device
Prepare a voltage of something around 7V to 9V to the supply input. I have used the Arduino board’s regulator to make the +5V rail. Therefore, never apply a voltage higher than 9V to the supply input, otherwise, you might damage the regulator chip. The board will be powered-up and you should see a text on the LCD, the same as figure 10. If you use a blue backlight 2*16 LCD, the circuit will consume around 75mA.
Step 8: Figure 10: Correct Circuit Power-up Indication on the LCD
After around 3 seconds, the text will be cleared up and in the next screen, you can adjust the constant current value by the up/down push buttons (Figure 11).
Step 9: Figure 11: the Constant Current Load Adjustment by Up/Down Push-buttons
Before connecting a battery to the device and measuring its capacity, you can examine the circuit using a power supply. For this purpose, you should connect the P3 connector to the power supply.
Important: Never apply any voltage higher than 5V, or in reverse polarity, to the battery input, otherwise you will permanently damage the Arduino’s digital to converter pin.
Set your desired current limit (for instance 100mA) and play with your power supply voltage (stay below 5V). As you can see with any input voltage, the current flow remains intact. That’s exactly what we want! (Figure 12).
Step 10: Figure 12: the Current Flow Remains Constant Even in Front of Voltage Variations (tested With 4.3V and 2.4V Inputs)
The third push-button is Reset. It means it simply restarts the board. It is useful when you plan to re-initiate the procedure to test a different buttery.
Anyway, now you are sure that your device works flawlessly. You can disconnect the power supply and connect your battery to the battery input and set your desired current limit.
To start my own test, I selected a brand new 8,800mA rated lithium-ion battery (Figure 13). It looks like a fantastic rate, isn't it?! But I cannot believe this somehow :-), so let’s test it.
Step 11: Figure 13: an 8,800mA Rated Lithium-ion Battery, Real or Fake?!
Before connecting the lithium battery to the board, we must charge it, so please prepare a fixed 4.20V (500mA CC limit or lower) with your power supply (For instance, by using the variable switching power supply in the previous article) and charge the battery till the current flow reaches to a low level. Don’t charge an unknown battery with high currents, because we are not sure about its real capacity! High charging currents might explode the battery! Be careful. As a result, I followed this procedure and our 8,800mA battery is ready for capacity measurement.
I used a battery holder to connect the battery to the board. Make sure to use thick and short wires which introduce low resistance because power dissipation in wires causes voltage drop and inaccuracy.
Let’s set the current to 500mA and long-pressed the “UP” button. Then you should hear a beep and the procedure starts (Figure 14). I’ve set the cut-off voltage (low battery threshold) to 3.2V. You can modify this threshold in the code if you like.
Step 12: Figure 14: Battery Capacity Calculation Procedure
Basically, we should calculate the “life-time” of the battery before its voltage reaches the low-level threshold. Figure 15 shows the time when the device disconnects the DC load from the battery (3.2V) and calculations are made. The device also generates two long beeps to indicate the end of the procedure. As you can see in the LCD screen, the true battery capacity is 1,190mAh which is far from the claimed capacity! You can follow the same procedure to test any battery (lower than 5V).
Step 13: Figure 15: the True Calculated Capacity of the 8.800mA Rated Lithium-ion Battery
Figure 16 shows the bill of materials for this circuit.
Step 14: Figure 16: Bill of Materials
Step 15: References
Article Source: https://www.pcbway.com/blog/technology/Battery_capacity_measurement_using_Arduino.html
1 year ago
Love this project, It is carefully explained and in the video I perfectly understand your English (even though I am Argentine). I just wanted to ask you a question, if I want to change R7 with a highter value what I need to change in the code?, for example I have 4R7 and 8R2 5W resistors. Thanks in advance and greetings form the other corner of the world!
I already managed to understand it, I just needed to study the code, I understand that for various reasons it is difficult to obtain a precise calculation and it is better to rely on empirical tests measuring the current between the different levels of pwm.
Reply 1 year ago
Increasing the R7 value, will decrease the total current. by the way the only thing you need to do is to measure the current in each step (button pressing) and replace the values of the current array.
I don't receive any notification of the comments here, you are always welcome to comment on youtube as well
1 year ago
Can I ask you, where is the up/down connection? On Arduino
Reply 1 year ago
It's called a net_label in Altium Designer. I have named two separate points identically, so they are connected. check C3 and C4 wires
Question 1 year ago on Step 15
I made this project for testing NiMH batteries so I thought it best to replace R7 with a 1 ohm resistor and change the PWM_Value increment from 5 to 2. However, when I ran the tester with a freshly-charged battery and a PWM_Value = 32 it took ~36 hours to deplete the battery to a threshold of 1.1V. When I recharged the NiMH battery and re-ran , I measured the voltage across R7 as ~40 mV when I think it should be nearer 600mV. The implication is that the MOSFET is not turning on properly so I also measured its gate voltage which was ~3.5V (see below). I suspected my poor soldering so I built a second copy, but this behaved the same way. Any ideas?
PWM_value = 32
AR1-D10 = 631 mV
IC1-IN2+ = 602 mV
IC1-OUT2 = IC1-IN2- = 502 mV
IC1-IN1+ = 503 mV
IC1-IN1- = 42 mV
IC1-OUT1 = Q2-1 = 3540 mV
Reply 1 year ago
Andy, I saw your comment right now, because actually I receive no notification on the comments.
That's strange. This circuit has been tested by many people. I have some questions:
1) Everything was fine before changing the resistor value? Low resistor value allows you to achieve higher currents, however, just you have to re-calibrate the device as you said.
2) if you connect the supply to the battery input and by increasing the PWM, the current draw increases (and you can read your desired currents), then the circuit and your modifications are fine.
So to make sure, connect a 1.5V supply to the input and increase the PWM and see if you can read the current values.
2 years ago
hello, can you please make the code for arduino? sadly it's the only thing i have
Reply 2 years ago
The code is already for Arduino! Please check the references
2 years ago
Can i use this project for testing Ni-Cd batteries?
Thanks in advance,
Reply 2 years ago
Yes You can
3 years ago
This is one of the most comprehensive practical articles that I have ever seen, Schematic, PCB, Video, Test, everything ....
Reply 3 years ago
3 years ago
Thank You for sharing your kknowledge.
It is really useful.
Reply 3 years ago