From rev0wiki
Jump to: navigation, search

This is a project to create a regenerative capable dual slot 18650 Li-* battery tester, which when used in conjunction with computer software or an additional ESP8266 module (yet to be implemented) can also graph the data in real time to Thingspeak or InfluxDB/Grafana for analysis.

File:CCR v2p4 Assembled.jpg
Latest model of the CCR (v2.4) fully assembled without 3D printed case.


List of Features

Version 1 - Regenerative Only

  • Voltage Range (Charge): 0-4.35V
  • Max Current (Charge): 1.5A
  • Max Current (Discharge): 1.5A
  • Sample Rate: 1 Hz (Reporting rate), 2 kHz (Loop/Integration rate)
  • Efficiency: 84% (Buck/charge mode, average, 1.5A output), 82.2% (Boost/discharge mode, average, 1.5A output)
  • Modes: Charge, Discharge (CC with voltage cutoff, CC-CV with current threshold cutoff), Power Supply (no cutoff below current threshold), Cycle (N times), IR measurement

Version 2 - Regenerative Mode

High Power Variant

  • Charge: Up to 3.5A (tbc)
  • Discharge: Up to 4A (tbd)

Low Power Variant

  • Charge: Up to 1.5A
  • Discharge: Up to 1.5A

Version 2 - Non-regenerative Mode

High Power Variant

  • Charge: Up to 3.5A (from 5V, 3A from 12V)
  • Discharge: Up to 5A (single channel), 3A (dual channel)

Low Power Variant

  • Charge: Up to 1.5A
  • Discharge: Up to 3A

Version 2.3 - Non-regenerative Mode

  • Charge: Up to 4A (With low power inductor, 6A with high power inductor)
  • Discharge: Up to 5A (single channel), 3A (dual channel)

Version 2.4/su - Regenerative Mode

  • Charge: Up to 4A (With low power inductor, 6A with high power inductor)
  • Discharge: Up to 4A (With low power inductor, 6A with high power inductor)
  • Energy Recovery: Up to 53.8% energy conserved (discharged 2 cells at 6A into 3s buffer pack, charged 1 cell at 0.5-4A from 3s buffer pack)

Alpha Firmware Feature List


  • Add auto test mode
    • Cell polling/auto test feature: every 1s, check C1R and C1V. If C1V != 0, cell present, if C1V > 3.0V, check IR, goto test with auto params if auto test mode enabled. Else if C1R != 0, cell reverse, print voltage and light LED red.
    • Determines cycle test current based on IR - <100 2.5/3A, 100-150 2.0A, 150-200 1.5A, 200+ 1.0A
  • Add auto precondition phase during charging for low voltage cells
  • Add cycle to storage/final voltage setting (e.g. charge to 4.2, discharge, charge to 3.8)


  • Add advanced IR functions - R0 w/ short pulse duration <0.1s, RCT w/ 2s pulse duration - R0, RP w/10s pulse duration - RCT - R0 (source table below):


  • Add mode preferences storage:
    • Auto test mode enabled/disabled
    • Regenerative mode enabled/disabled
    • Default cell type NiMH/Li-Ion
  • OLED status display [Done, but only for voltage for slot1/2, need to optimize, currently stops 7 interrupts every second to run] Removed due to limits
  • 8x WS2812 charge voltage indicator
  • Regen pack management (reduce charge current when pack voltage low or reduce discharge current when pack voltage high) [Added overvoltage test stop when pack exceeds 12.6V]] Superseded by v2.4su version with HW 12.5V clamp, overvoltage limit retained.


  • NiMH battery charge profile enhancement (add dT/dT)
  • Rebase code to use OOP/classes/multiple files

Comparison to Other Cell Testers

The CCR v2.0 can exceed the discharging current of all currently available 18650/cylindrical specific cell testers currently on the market, and is on par with or better than most chargers for charging current. It beats the popular Opus BT-C3100 for number of cells per day it is able to cycle test (assuming a 2.6 AH cell, charging at 1C and discharging at 3A, more is possible with higher charge current though few cells can accept >1C charge rate). It is nearly able to meet the number of cells per day of the SkyRC MC3000 4-slot charger, despite only having 2 slots and a lower cost.

Cells per day possible to test and tester cost of the CCR vs. other common 4-bay cylindrical cell testers.

The CCR also produces a more accurate CC-CV Li-Ion charge curve vs. other testers, which are limited in their design by either PWM output (not true constant current) or power/voltage limited (in the case of the Opus), which causes early current taper. This also improves the charging time of the CCR vs. other testers.

Discharge/Charge curves for the CCR vs. Opus BT-C3100 and Zanflare C4, showing smoother CC/CV profile and faster cycle time.

A table comparing the features of some of these common testers is below:

Feature CCR v2.5 Opus BT-C3100 Liitokala Lii-500 Zanflare C4 SkyRC MC3000
Price $39.99 $30.46 $21.99 $32.99 $109.99
Cell Slots 2 4 4 4 4
Charge Current (Max) 6A 2A* 1A 1A** 3A
Charge Current (All Slots) 6A 1A 1A 0.5A 3A
Discharge Current (Max) 6A***/5A 1A 0.5A 0.5A 2A
Discharge Current (All Slots) 6A***/3A 1A 0.5A 0.5A 1A
Cells per day per $ 0.45 0.52 0.51 0.26 0.20
  • *Outer 2 slots only, 2 cells max simultaneously, current tapers down from 2A starting at 3.65V
  • **Charge mode only, in test mode 0.5A is maximum
  • ***Regenerative mode using 3s buffer pack

List of Cells that can charge >3.5A

Battery Brand Battery Type Capacity (mAH) Max Discharge Rate (A) Max Charge Rate (A) Datasheet Link
Sony US18650VT 1080 10 (9.3C) 8 continuous (7.4C)
Sony US18650V 1600 20 (12.5C) 5 continuous (3.1C)
Sony US18650VTC4 2100 30 (14.3C) 4 continuous (1.9C), 12 pulse (5.7C)
Sony US18650VTC5 2500 20 (8C) 4 continuous (1.6C)
Sony US18650VTC5A 2500 30 (12C) 6 continuous (2.4C)
Sony US18650VTC6 3000 15 (5C) 5 continuous (1.7C), 6 pulse (2C)
Sanyo UR18650RX 1950 20 (10.3C) 3.9 continuous (2.0C)
Sanyo UR18650NSX 2500 20 (8C) 5 continuous (2.0C)
Samsung INR18650-13B 1300 23 (17.7C) 4 continuous (3.1C)
Samsung INR18650-13Q 1300 15 (11.5C) 4 continuous (3.1C)
Samsung INR18650-15M 1500 23 (15.3C) 4 continuous (2.7C)
Samsung INR18650-15Q 1500 18 (12C) 4 continuous (2.7C)
Samsung INR18650-20Q 2000 15 (7.5C) 4 continuous (2.0C)
Samsung INR18650-20S 2000 30 (15C) 4 continuous (2.0C)
Samsung INR18650-20R 2000 22 (11C) 4 continuous (2.0C)
Samsung INR18650-25R 2500 20 (8C) 4 continuous (1.6C)
Samsung INR18650-30Q 3000 15 (5C) 4 continuous (1.3C)
Revolt 2600mAH 2600 7.8 (3C) 7.8 continuous (3C)
Moli IMR-18650E 1400 20 (14.3C) 6.5 continuous (4.6C)
LG ICR18650HA1 1300 15 (11.5C) 4 continuous (3.1C)
LG ICR18650HB2 1500 30 (20C) 4 continuous (2.7C)
LG ICR18650HB6 1500 30 (20C) 4 continuous (2.7C)
LG ICR18650HB4 1500 30 (20C) 6 continuous (4.0C)
LG ICR18650HE2 2500 20 (8C) 4 continuous (1.6C)
LG ICR18650HE4 2500 20 (8C) 4 continuous (1.6C)
LG ICR18650HG2 3000 20 (6.7C) 4 continuous (1.3C)

Output Format

State List

  • 0. Battery Disconnected (Unused)
  • 1. Battery Discharge
    • Voltage < 2.75V?
  • 2. Battery Disconnected
    • Wait 5 minutes
  • 3. Battery Charge
    • Current < 50mA?
  • 4. Battery Disconnect
  • 5. Wait 1 minute
  • 6. Measure IR
  • 7. Measure IR
    • Wait 10 seconds
  • 8. Parking

Message Type List (FW v0.1-2.0)

  • 0. Cell 1 periodic status
  • 1. Cell 1 end of discharge stats
  • 2. Cell 1 end of charge stats
  • 3. Cell 1 IR debug
  • 4. Buffer pack voltage/system status
  • 5. Cell 2 periodic status
  • 6. Cell 2 end of discharge stats
  • 7. Cell 2 end of charge stats
  • 8. Cell 2 IR debug

Message Type (Periodic Status) Battery Voltage (mV) Battery Current (mA) Capacity (mAH) Capacity (mWH) Temperature (C) State
0 3752 1499 648 2565 23.6 1
5 3942 -1454 980 3658 25.8 3
Message Type (End of Discharge) Battery Voltage (mV) Battery Internal Resistance (mOhm) Capacity (mAH) Capacity (mWH) Temperature (C) State
1 3015 149.3 648 2565 23.6 2
6 2975 45.2 2012 7518 27.3 2
Message Type (End of Charge) Battery Voltage (mV) Battery Internal Resistance (mOhm) Capacity (mAH) Capacity (mWH) Temperature (C) State
2 4109 105.4 980 3658 25.8 7
7 4103 48.4 1780 6507 28.4 7

Message Type List (FW v2.1+)

  • >. User messages (disregard for program)
  • ^. Debug messages (disregard for program), incl. buffer pack/input voltage
  • #. Cell status/end of charge messages:
    • Cell # (1), Message Subtype (See list below), Battery Voltage (mV), Battery Current (mA), Capacity (mAH), Capacity (mWH), Temperature (C), Battery Internal Resistance (mOhm)
    • Cell # (2), Message Subtype (See list below), Battery Voltage (mV), Battery Current (mA), Capacity (mAH), Capacity (mWH), Temperature (C), Battery Internal Resistance (mOhm)
    • Cell # (n), Message Subtype (See list below), Battery Voltage (mV), Battery Current (mA), Capacity (mAH), Capacity (mWH), Temperature (C), Battery Internal Resistance (mOhm)
  • Dual cell concurrent case:
    • 1,1,3854,1499,1503,5784,28.54,103.5
    • 2,2,4194,730,2315,7914,29.77,130.9
  • Cell 1 only case:
    • 1,1,3854,1499,1503,5784,28.54,103.5
  • Cell 2 only case:
    • 2,2,4194,730,2315,7914,29.77,130.9
Message Prefix/Cell Number Message Subtype Battery Voltage (mV) Battery Current (mA) Capacity (mAH) Capacity (mWH) Temperature (C) Internal Resistance (mOhm)
> Menus/User messages
^ 1 12158 (Buffer pack/input voltage) 45.30 (Heatsink thermistor 1) 34.58 (Heatsink thermistor 2)
^ 2 4158 (OCV before) 4155 (OCV after) 958 (Iload) 4012 (Vload) 150.84 (IR, mOhms)
1 2 3942 -1454 980 3658 25.81 89.43
2 1 3564 2498 1976 7432 29.56 65.32

Message subtypes:

  • 1. Periodic status (discharging)
  • 2. Periodic status (charging)
  • 3. End of discharge
  • 4. End of charge
  • 5. IR measuring state
  • 6. Parking/not testing state

Debug Message Subtypes

  • 1. Periodic status (input voltage, heatsink temp(s))
  • 2. IR debug (cell 1)
  • 3. IR debug (cell 2)


Thingspeak is a website that allows users to send periodic data to a channel. Each channel can support 8 fields of data, e.g. voltage, current, temperature, etc.. The free version of Thingspeak, as of 3/10/19, allows users to have up to 4 channels, and can send data at a maximum rate of one "message" every 15 seconds, per channel. A message is a single http request, and can contain up to 8 fields. Updating the first 4 fields, then the second 4 fields counts as 2 messages, and is still limited to the 15 second "rule". Hence, it is best to update all 8 fields at once, to maximize the available bandwidth to Thingspeak. Note you can send data to 2 different channels at the same time, for up to 4 channels * 8 fields per 15 seconds of throughput.

To post to Thingspeak, the following format is used in an http request (example using wget): wget -q -O- "$KEY&field1=$CAPACITY&field2=$VOLTAGE&field3=$CURRENT&field4=$BTEMP&field5=$CTEMP"

In the case of the CCR, we are interested in using 2 channels per tester, one for real time status (voltage, current, temp, capacity) of each cell, and another for end of (discharge) cycle data for each cell. The real time channel should be updated once every 20s, with the combined data from slot 1 and slot 2 (if both cells are being tested simultaneously) combining both cells data into a single line/http request.

For the end of cycle channel, each cell's data can be sent asynchronously, but must not be sent within 20s of each other, otherwise the 2nd message may be dropped. Hence the code needs to check whether a message was sent in the last 20s before posting. If so, it will wait until the channel is not busy, then send.

Live results from the CCR 2.3 SN001 (single slot, black PCB) can be found here: and from the CCR v2.4 SN00x can be found here:



Breadboard Prototype

LTSpiceIV simulation of the SMPS in buck (charging) mode.
LTSpiceIV simulation of the SMPS in boost (discharging) mode.

Early investigation of the concept started with determining the maximum PWM frequency and resolution the STM32F103 could produce, and how to size the inductor and capacitor accordingly to produce a 1.5A output with good current regulation. The best compromise of frequency and resolution was selected to be 360kHz with 200 steps, providing about 200mA/step of resolution in CC mode. This was simulated in LTSpiceIV to size the inductor and capacitor for the buck, chosen to be 33uH with 440uF of output capacitance. The buck circuit was assembled on a breadboard but ultimately did not work due to the high parasitics at the frequency used (360kHz).

Breadboard prototype of the SMPS for the CCR.

COTS Cycler

For cycler software development (excluding the closed loop feedback and PWM, i.e. state machine and interface) a second prototype was built using a CC-CV 3A buck converter module and Re:load v2 constant current load connected to a Maple Mini and additional temperature sensing and current/voltage sensing circuitry.

COTS cycler prototype using CC-CV LM2596 module and Re:load v2.
COTS cycler prototype upgraded with XL4015 module after LM2596 module started showing regulation issues.

This cycler was in active operation from 8/31/18 to 1/21/19 for a total of 234+234 cycles testing Panasonic NCR18650B and LG F1L cells, the results of which are below:

Long term cycle testing results created by the COTS cycler prototype.

CCR v1.0

This is a fully functional regenerative dual cell cycler which has been in use cycle testing a Re-volt 2.7AH 18650 vs Samsung 2.6AH 18650 for several months (over 500 cycles and xxxx hours of continuous operation as of 3/2/19). The board had to have several IO changes to resolve the USB errata mentioned in the Errata section. This board is connected to a ~3.6AH 2s buffer pack which is fitted with a 2s BMS and non-linear passive balancer consisting of 2 blue LEDs, one across each cell, which helps keep the pack balanced when it is at lower state of charge. It functions by draining more current exponentially with voltage above 3.3V, tending to keep both cells at the same voltage. The pack is kept at 7V minimum by a CC-CV buck converter fed from a 15W 12V power adapter.

The cycler's live operation can be followed here for the Samsung 26H cell: and here for the Re-volt cell:

Final 500 cycle test result of the Samsung 26HM vs Revolt cell test at 100% DoD (4.2 to 2.75V, 1.5A charge/discharge).

CCR Dev (Resistive Load)

The original single cell CCR v1.0 board was modified to use a constant current load made with an IRLB8713 MOSFET attached to a 100*40*20 heatsink controlled by an op-amp closed loop feedback circuit. The constant current load was later switched to an actively cooled 25W load (through-hole PCB version) and attached to a cardboard base.

3 versions of the CCR, with the CCR Dev on the left in its original state.
Original constant current load modified to be controlled by the CCR.
Current state of the CCR Dev with new 25W load connected.

CCR Mini 360

This was an investigation to use an off the shelf synchronous buck converter module to produce a regenerative charger/discharger by overriding the module's feedback node, injecting a voltage signal in to bias the module to higher or lower output voltage/current, which when biased lower than the attached battery's voltage would act as a synchronous boost converter, charging the buffer pack. This prototype was successful in concept but had poor regulation and performance, able to manage ~0.8-0.9A in discharge and ~1.3-1.5A in charge.

Voltage/current curves for the CCR Mini 360 in operation.

CCR Dev + Buck

This is another CCR Dev variant using a feedback modulated off-the-shelf buck converter for the charger, as opposed to the custom buck converter controlled directly by STM32. Originally it was built with a Mini-360 module but was later upgraded to an LM2596 module for up to 2A charge capability (originally limited to 1.3-1.5A like the CCR Mini 360 variant). This cycler was provided to SecondLifeStorage member Phizicks for Python code development.

Initially built version of the CCR Dev + Buck.

CCR Dev + 6A Buck

A development board was built for the RT8298 6A buck converter. The board initially had a schematic error putting the diode on the output node instead of the switching node, and which killed the original RT8298 IC due to inductive spikes. It was rebuilt correctly, and during testing was found that it would shut down if the feedback node was too low. The code was modified to limit the feedback PWM from the MCU to minimum ~25% which resolved the issue, but limited the "range" of the control such that charge was limited to only 2A. This board was removed and re-built with an XL4015 module instead, which was able to provide up to 5A charging with a diode upgrade (added SS54 in parallel with SK54 placed), but has poor constant current regulation at certain levels.

1A through 5A charge curves of a Re-volt 2.6AH 18650 with the XL4016 module + MCU feedback.

This cycler was then reworked with a "6A" 13mm inductor, 220uF input capacitor, and 330uF output capacitor, using 3 AO3401A 4.3A MOSFETs in parallel, and 2 SS54 diodes in parallel making up the switching circuit. A test at 2.5A, 2A, 1.5A, and 1A is shown below, showing +/-4.2% current regulation at 2.5A and +/-4.9% current regulation at 2A, and maintaining +/-14(?)% current regulation at 100mA.

The 3 AO3401A MOSFETs were switched with an IRF9540N MOSFET in an attempt to increase power capability, which increased to 3.5A but was still limited due to the relatively high Rdson of 0.117 ohms at 10Vgs, producing ~1.4W of heat at 3.5A.

The IRF9540N was swapped for an NCE30P12S MOSFET which will be used in the final v2.0 design. Current capability was measured to be ~3.5A with 6V supply (3A with 12V supply) with a SOIC-8 top case temperature of ~95 C.

CCR v2 Cost-Down

A stripped down version of the CCR v2 was constructed bypassing the op-amp based closed loop current control and modulating the gate of the N-channel discharge MOSFET directly by the STM32 (filtered via 10k/100n RC filter). Doing so eliminates one of the most expensive components, the low offset op-amps, and some related passive circuitry, for a total of $2.63 savings. Additionally, this charger is run off 5V bypassing the need for the 5V LDO. This charger is also configured for resistive discharge only, without the boost circuitry for regenerative mode installed. Oscilloscope trace shows a ramp up time of approximately 40ms, with minimal overshoot/ringing, and regulation of approximately +/-4.5%. Operation down to 100mA was tested, though regulation is worse at the lower current levels. The FET temperature was measured at 83 C for a single cell discharge at 3.5A. The charge P-MOSFET measured 73C at 3.5A, 3.7V output from 5V supply.

Transient performance of CCR v2 at 360kHz (0-1A), 180kHz (0-1.5A), and 180kHz direct gate drive (0-2A).


Hardware Version HW Config Slots Serial Number Status Software Version Cal Params
Prototype COTS Specific 1 N/A Disassembled 0.5
CCR v1.0 (Regen only) v1.0 2 N/A Functional, using 2s2p LG D1 buffer pack 0.5-10252018
CCR v1.0 Dev Specific 1 N/A Functional 0.x
CCR v1.0 Dev+Buck Specific 1 N/A Functional 0.5-11152018
CCR v1.0 Dev+3A Buck Specific 1 N/A Needs MCU replacement 0.x
CCR v2.0 HW_2_0, V_1S (P-ch only) 2 000-2 Functional 2.0-02252020
CCR v2.0 Cost Down HW_2_0, V_1S 2 N/A Functional, 5V supply, with Phizicks 2.0-06262019
CCR v2.0 HW_2_0, V_1S 2 001 Functional, 12V supply, with Generic 2.0-11132019
CCR v2.4 HW_2_0, V_2S, no regen 2 002 Functional, 12V supply, with All_Work_All_Play 2.0-12202019
CCR v2.3 10uH HW_2_0, V_2S 1 001 12V supply+3s2p HP LiPo 2.0-11132019
CCR v2.4 HW_2_0, V_2S 2 00x 12V supply 2.0-11132019
CCR v2.4 HW_2_0, V_2S1, no regen 2 008 Functional, 12V supply, with Charith 2.0-02252020
CCR v2.4su HW_2_4, V_2S1 2 009 Functional, 9.6V supply, with Wolf 2.0-07082020 S1I - 987, S2I - 1000, S1V - 4200, S2V - 4210, VREF - 6323
CCR v2.4su 40mm HS HW_2_4, V_2S1 2 010 Functional, 9.6V supply, with Travis 2.0-07152020 S1I - 1000, S2I - 1000, S1V - 4209, S2V - 4194, VREF - 6291, VBUS - 5052, S1/2T - 3841, HST - 3350
CCR v2.5su HW_2_4, V_2S 2 011 Functional, with vegburner (replacement) 2.0-09082020 S1I - 993, S2I - 1000, S1V - 4172, S2V - 4173, VREF - 6552, VBUS - 5000, S1/2T - 5050, HST - 5050
CCR v2.5su HW_2_4, V_2S1 2 012 Functional - required 10M || R28 for shifting Vclamp to 12.524V from 12.613V, with vegburner 2.0-09102020 S1I - 1000, S2I - 980, S1V - 4166, S2V - 4186, VREF - 6568, VBUS - 4953, S1/2T - 2615, HST - 3030
CCR v2.5su HW_2_4, V_2S1 2 013 R43 overheated; discharge FET failed (gate to source ~43 ohms, drain to source ~0.7 ohms), PTC possibly failed. Replaced R43 with TH 1/4W 1k || 1k, replaced discharge FET (IRF3710), replaced PTC with 3A glass axial fuse. 2.0-09102020 S1I - 1000, S2I - 990, S1V - 4205, S2V - 4183, VREF - 6475, VBUS - 4940, S1/S2T - xxxx, HST - xxxx (Old: S1I - 982, S2I - 1000, S1V - 4186, S2V - 4186, VREF - 6576, VBUS - 4945, S1/2T - xxxx, HST - xxxx)

Heatsink Sizing

The cooling solution for the 2 MOSFETs that make up the discharging circuit is a 100x40x20mm aluminum extruded heatsink with 11 fins, and a 5V 40x40x20mm fan. Results are as follows (tested at ~21 C ambient):

  • 4A 4.2V (16.8W) (2A x2) - 65 C max on FET body, approx. 71.3 C Tj
  • 5A 4.2V (21W) (2.5A x2) - 75 C max on FET body, approx. 82.9 C Tj
  • 6A 4.2V (25.2W) (3A x2) - 84 C max on FET body, approx. 93.5 C Tj
  • 7A 4.2V (29.4W) (3.5A x2) - 93 C max on FET body, approx. 104 C Tj
  • 4A 4.2V (16.8W) (4A x1) - 79 C max on FET body, approx. 91.6 C Tj
  • 5A 4.2V (21W) (5A x1) - 93 C max on FET body, approx. 108.8 C Tj

The cooling solution for a CCRv2.4su with 1 MOSFET (STB45N30M5 in this case) that makes up the discharging circuit is a 40x40x20mm aluminum extruded heatsink with 11 fins, and a 5V 40x40x20mm fan. Results are as follows (tested at ~25 C ambient):

  • 3.3A 3.73V (24.6W) (3.3A x2) - 100 C max on FET body, approx. 112 C Tj


Buck Converter (Charger)

A simplified schematic of the buck converter that charges the 18650 from a 6-12V supply is shown in the thumbnail below:

Simplified buck circuit schematic for the CCR v2.0.

The input is decoupled with 220uF of electrolytic capacitors for each cell, total 440uF, plus 10uF of MLCCs for each cell. This is switched through an NCE30P12S P-channel MOSFET rated for up to 12A drain current, <25mOhm resistance at 4.5Vgs, and up to 3W power dissipation. Current is then supplied through 2 SS54 diodes in parallel during the off state, for up to 10A rated current at ~0.4Vf at 3A. The output is then filtered through another 440uF of electrolytic capacitors plus 10uF of MLCC.

Boost Converter (Discharger, regenerative)

A simplified schematic of the boost converter that discharges the 18650 into a 6-8.4V buffer pack is shown in the thumbnail below:

Simplified boost circuit schematic for the CCR v2.0.

The input is decoupled with 440uF of electrolytic capacitors plus 10uF of MLCC. This is switched to ground through an AO4406AL N-channel MOSFET rated for up to 13A drain current, <15.5mOhm resistance at 4.5Vgs, and up to 3W power dissipation. Current is carried through 2 SS54 diodes in parallel during the off state, for up to 10A rated current at ~0.4Vf at 3A. The output is then filtered through another 440uF of electrolytic capacitors plus 10uF x2 of MLCC.

CCR v1 Performance Evaluation

Buck (charging)/Boost (discharging) converter efficiency for the CCR v1.0.
Boost (discharging) mode operation at 1.5A, showing peak external transistor temperature of 57.8 C.

Constant Current Load (v2 Discharger, resistive)

A simplified schematic of the MOSFET + Op-Amp based circuit that discharges the 18650 is shown in the thumbnail below:

Simplified FET-based discharger schematic for the CCR v2.0.

The input is decoupled with 440uF of electrolytic capacitors plus 10uF of MLCC. This is discharged to ground through an IRF3710 N-channel MOSFET rated for up to 57A of drain current, ~17mOhm resistance at 4.5Vgs, and up to 200W power dissipation (limited to 21W for single channel based on 100x40x20mm heatsink + 40x40x20mm fan). Current measured across a 10mOhm shunt resistor is fed back to the Op-amp which compares it to a filtered PWM output from the STM32 microcontroller to control the current of the 18650. There is an additional input to the Op-amp to override the feedback and bias the MOSFET off (e.g. during charge or disconnected modes). The original circuit is credited to Youtuber VoltLog (video link) who reverse engineered a commonly sold "60W" constant current load and provided a detailed schematic. This circuit was prototyped on a proto board and then made into 2 standalone PCBs, one for through-hole kit form, and another small version using SMD parts.


The CCR uses an STM32F103C8T6 microcontroller in the form of a "blue pill" board, which includes crystals, header pins, USB plug, and other supporting circuitry, and allows for the MCU to be swapped out in case of damage. Critically, the STM32F103 supports 8 12-bit ADC channels with fast read rate, 6 PWM channels operating at up to 360 kHz with 100 step PWM resolution, and built in USB PHY for communicating via virtual COM port to the PC.

CCR v2 Performance Evaluation

Charging mode ramp from 0 to 1A (CC).
Discharge current pulse of 1A for measuring cell IR.

The CCR v2 was assembled 2/15/19 and checked for basic operation cycle testing a Samsung 25R. Charging current is limited to approximately 2A due to power dissipation of the SOIC-8 P-channel MOSFETs. This may improve slightly with proper airflow routing using a 3D printed enclosure. Transient performance and current regulation were measured with a Rigol DS1052E. Discharge shows an overshoot of approximately 18% for 580us, and regulation of +/-3.8% at 1A. Charge shows no overshoot, and regulation of +/-3.9% at 1.5A.

Thermal image of the P-channel MOSFET at 180kHz switching frequency, 3.5A charging. Peak was 103 C from 12V supply.

Further investigation showed the MOSFET driver was not able to produce sharp edges, causing higher switching losses at 360 kHz. Changing the code to operate the MOSFETs at 180 kHz allows charging at up to 3.5A.

CCR v2.2 Performance Evaluation

Initially the CCR v2.2 was run off 12V, but it was determined this could apply too high of a gate voltage to the high-side N-channel FET, in the case of a 0V output, the switch node (high side N-FET source) goes to 0V, and the high-side N-FET gate is driven with 24V with respect to ground. The original gate driver and high-side N-FET were replaced as it was not functioning correctly. The CCR v2.2 prototype was then run off 5V for further experiments. At 5V, some code bugs were found relating to the min/max buck duty cycle that were resolved. The tester was run at up to 4.5A in this configuration, with source voltage up to 5.5V to get 4.2V output at 4.5A. It was then run at 9V after confirming the gate voltage of the high-side N-FET was not being overdriven at 5V. At 9V, output of up to 5A was confirmed with the N-FET peak temperature measured at only 66 C, though at this current the inductor was near saturation and running at 105 C. The diodes (2 SS54 and 1 SR540 in parallel) were running at 110+ C. The limiting factor in the sychronous architecture is clearly the diodes, though these were necessary for the gate driver to operate correctly, otherwise it did not drive the transistors as the switch node voltage was not 0V during startup. Efficiency of 79.3% was measured at 4.2V, 5A output from 8.83V input, 80.2% at 4.2V, 4.5A output from 8.86V input, 81.3% at 4.2V, 4A output from 8.87V input, and 83.2% at 4.2V, 3A output from 8.91V input.

The CCR v2.2 hardware was modified to pull the gate of the protection FET low during synchronous buck startup (~0.5 to 2ms), which allowed the removal of the diodes. The inductor was also changed to a 10A 60uH inductor to test the limits of the switching FETs beyond 5A. In this new configuration, the CCR was able to produce up to 8A of output current at 4.2V. The FETs/gate driver failed at 9A. The final CCR v2.3 will be limited to 6A for margin, and 4.5A for the smaller "6A" 100uH inductor as a lower power variant. The efficiency of this configuration was measured at 89.3% at 4.2V, 8A, and 87.9% at 4.2V, 9A before the switching components were damaged.

The current waveform during charging startup displays a 600ns negative current pulse of ~0.7A to charge the 450uF capacitance on the cell output, followed by a 21ms ramp up to full current.

2A Charge current ramp on the CCR v2.2.

CCR v2.3 Performance Evaluation

The efficiency in boost (regen discharge) mode was measured to be approximately 78.3% at 2.5V battery voltage, 6A output. Peak FET temperature observed during regenerative discharge or charge was 52 C, dissipating ~3.3W in the system. The protection FET control was modified to be controlled directly by the MCU in order to improve low voltage power handling (during discharge mode and charging/discharging NiMH). Charging efficiency stays within +/-0.6% across input voltage range of 7.3-12.45V during charging at 4.2V, 5.9A. Current regulation at 6A during discharge is +/- 34mA, or +/- 0.56%. Current regulation at 6A during charge is +/- 26mA, or +/- 0.43%. The buffer pack was modified to 3s with 9.6V supply voltage and has similar efficiency in discharge/charge (~80%), though the FETs were observed to operate hotter during discharge at 6A, reaching 60C peak for the lower FET and 55C for the upper.

Assembled CCR v2.3 set up for regenerative mode using an XL4015 module for CC/CV maintenance of a 2s battery at 7.6V.
CCR v2.3 charging/discharging efficiency at 6A, ~7.3V.
CCR v2.3 charge cycles at 4-6A for a Chinese 2.6AH 18650.

CCR v2.6

This was a hardware change to use a 2-stage lower inductance buck (buck converter with 48.4uF/10uH/49.2uF followed by 1.5uH/22uF filter stage, compared to the original 460uF/60uH/450uF single buck converter, which showed promising improvements in voltage/current ripple in LTspiceIV simulation. Power supply and charging modes showed improvement to current/voltage ripple as expected, but reduced stability (the lower inductance/capacitance converter requires a higher loop bandwidth to maintain the same response). As soon as the cycle changed to internal resistance test (discharge mode, 6A peak) the low side switching FET and FET driver blew. The cycler was repaired with a new set of FETs + driver and tested functional. It was determined the ripple voltage at the switching node was high, and a snubber was added (20nF + 13.5 Ohm) to reduce this peak voltage. The snubber was simulated to dissipate approximately 0.7W, and reduced the ringing peak voltage to ~20V peak.

CCR v2.6 mockup vs. CCR v2.4 current regulation comparison in charge/discharge at 6A.
CCR v2.6 mockup vs. CCR v2.4 1A current ramp from 0 to full, showing faster loop bandwidth with the lower inductance/capacitance.
CCR v2.6 mockup vs. CCR v2.4 1.5A current regulation at 2.5ms timebase and 50us timebase, showing improvement with lower inductance/capacitance.

Calibration Procedure

When a device is initialized with a new microcontroller, there are no parameters stored to internal memory, thus initial values based on ideal values will be used.

Reference Voltage

The reference voltage used for the zero point of the two current shunt amplifiers and for scaling against supply voltage drift must first be measured, preferably with a 20000 count multimeter or better to get the 5 significant figures of the calibration value.

  • Measure voltage from pin A5 to ground pin on the Blue Pill board.
  • Take the decimal portion of the value (e.g. 6544 for 1.6544V measured.
  • Write this value to memory using the following command: "tw a0 d6544", where the number after "d" is the value recorded in the previous step.

Output Voltages

The output voltage of the charger must be measured to account for resistor variation in the 4-wire Op-amp circuit for voltage measurement, preferably with a 6000 count multimeter or better to get the 4 significant figures of the voltage value.

  • Start the slot to be measured to 4.2V output using the power supply mode (e.g. "p1" for slot 1, 4.2V output)
  • Measure voltage across the cell holder of the slot to be measured.
  • Take the voltage value in mV (e.g. 4302 for 4.302V measured.
  • Write this value to memory using the following command: "tw aX d4302", where the number after "d" is the value recorded in the previous step, and "X" is the slot tested (1 or 2).

Output Currents

The charger/discharger current must be measured to account for shunt resistor and shunt amplifiers gain variation in the current measurement circuit, preferably with a 2000 count multimeter or better to get the 4 significant figures of the current value.

  • Connect a power supply or cell negative to the negative side of the slot to be measured.
  • Connect a multimeter set to current mode, 2A range (or equivalent to get a reading of 1A), from the positive of the cell/power supply to the positive cell holder terminal.
  • Ensure the cell/power supply is 3.7-4.2V.
  • Start the slot to be measured to discharge mode, 1A current, using the following command: "d1 i1000" for slot 1, 1A
  • Measure current through the multimeter for the slot to be measured.
  • Take the current value in mA (e.g. 1053 for 1.053A measured.
  • Write this value to memory using the following command: "tw aX d1053", where the number after "d" is the value recorded in the previous step, and "X" is the slot tested + 2 (3 or 4).

Input Voltage

The charger/discharger input voltage must be measured to account for voltage divider resistor variation, preferably with a 6000 count multimeter or better to get the 4 significant figures of the input voltage value.

  • Connect a power supply set to 5.000V to the input of the CCR
  • Get the input voltage value using the status "s" command
  • Take the input voltage value in mV (e.g. 4953) output by the command (first value after "4," message)
  • Write this value to memory using the following command: "tw a5 d4953", where the number after "d" is the value recorded in the previous step.

Hardware Revisions

Revision 1.0

The complete system schematic for the CCR v1.0.
The PCB layout (Gerber view from JLCPCB) for the CCR v1.0.

This is the first revision of the CCR, which only natively supports regenerative discharging mode.


  • Pin A11 was used for the P-channel MOSFET control on cell 2, which is not usable for this function (pin is natively used as USB D+).
  • There are no pull-up/pull-down resistors to keep the buck/boost converter "safe" when in programming mode (IO in Hi-Z) or when no power is applied to USB
  • There is no power applied to the MCU when there is no USB plugged in
  • There is no PTC protection for the cell
  • Output of op-amp for voltage reading is 5V capable but going into 3.3V only ADC pin, needs series resistor to prevent damage

Revision 2.0

The complete system schematic for the CCR v2.0.
The PCB layout (Gerber view from JLCPCB) for the CCR v2.0.

This is the second revision of the CCR, which supports regenerative discharging mode (optional) as well as constant current discharging mode, and increased current capability of up to 3A in charge, and 5A (single channel)/3A (dual channel) in discharge.

Change List:

  • Added pull up/pull down resistors to "safe" the device when power is removed or reprogramming is taking place
  • Added PTCs to cell and buck circuit to prevent shoot through or shorting of the cell which led to many N-channel MOSFETs being destroyed on the prototype
  • Thermally isolated temperature sensor NTC from PCB ground plane by thin traces and cutout
  • Added silkscreen below SMD cell holder for better reliability against cell shorting of bare cells
  • Added pads and BOM option for external voltage sense wires for better accuracy in high current operation
  • Added SOIC-8 MOSFET placement options for higher current FETs to accommodate 3-6A charge capability
  • Added cutouts for a lever to pop the 18650 out of the cell holder
  • Added option for second thermistor (e.g. allowing 2 isolated heatsinks for significantly higher power capability in discharge)
  • Changed to WS2812B digitally controlled LEDs with option for external LED strip(s) or array


  • Wrong silkscreen designator for C27 (reads R42)
  • Output of op-amp for voltage reading is 5V capable but going into 3.3V only ADC pin, needs series resistor to prevent damage
  • No pull down on fan control MOSFET causing fan to turn on during programming/reset
  • PB2/boot1 pin location on STM32 blue pill footprint is not correct, offset by about 1 pin width.

Revision 2.2

The complete system schematic for the CCR v2.2.
The PCB layout (Gerber view from JLCPCB) for the CCR v2.1.

This is an update to the second revision of the CCR, to fix the errors found in V2.0 and add the option to chain 2 cells in parallel or link both slot chargers/dischargers to power a single cell at up to 7A (6.5A from 12V supply)/6A for discharge. This version changes the gate driver from the MCP1402 to the ADP3110A bootstrapped synchronous dual N-channel gate driver, to improve the rise/fall times of the switching FETs from ~140ns at 3000pF to ~20ns, and improve overall charge current capability.

Change List:

  • Fixed C27 silkscreen
  • Added series resistors on Op-amp outputs to protect ADC inputs of STM32 module
  • Added low pass filtering capacitors to cell voltage/current outputs
  • Fixed PB2 pin location (offset in v2.0)*
  • Added pull down on fan control pin
  • Added pads to select single cell high power or 2 cell parallel operation
  • Replaced MCP1402 and support components to ADP3110A and support components
  • Changed high side FETs from P-channel NCE30P12S to the same N-channel FETs (AO4406AL) used for boost and protection
  • Removed SS54 diodes no longer needed with new synchronous architecture
  • Removed "low power" BOM placement options


  • Version number is incorrect (2.0)
  • Pull up resistor for top N-FETs should be pull down (did not change from previous P-FETs)
  • Discharge FET drain is on the wrong side of the 0 ohm resistor for single high power slot operation
  • (Improvement) 5V LDO gets very hot (up to 100C+ observed) during fan + LED operation from 12V, should change to buck regulator in future version

Revision 2.4

This is a minor update to the CCR v2.3 which changes the 5V LDO for a buck regulator to improve efficiency/reliability (previous versions the LDO exceeded 100C under 180mA fan+LED load at 12V), and controls the protection FET directly by the MCU to improve handling of low voltage cells including NiMH.

Revision 2.4su

This is an update to the CCR v2.4 which optimizes cost by removing optional/unused features in the v2.4 design, migrates as many components to top side for assembly as possible (all except input fuse and buck/boost N-FETs, 5 comps. total), and is now regen only, with a hardware clamp circuit that allows resistive operation by limiting the output voltage of the cycler to 12.5V, dumping power into a single FET instead.


  • Diode was not included for changing to MP2359 (non-synchronous buck but same pinout as JW5052C)
  • Reference voltage powered by 5V causing sequencing issue; if power is applied on 12V before 5V (USB) device will short/load out 12V

Revision 2.5su

Same as revision 2.4su but fixing the two errata; adding diode for 5V buck and changing reference voltage power source to 12V rail.

PCB Files

Eagle schematic/board files and gerber files can be found here:


The enclosure for the CCR v2.0 was created in Fusion 360 and is made up of x pieces which can be 3D printed and assembled with M3 screws.

Here are the Fusion 360 files for the CCR v2.0 enclosure:

Assembled CCR v2.3 (single slot) in 3D printed enclosure.


Full source code for the project can be found here:

EEPROM Map for Calibration Values

EEPROM Address Description Typical Value
0x0000 Reference Voltage (Real Value - 1.0V) (mV*10) 6500
0x0001 Slot 1 Correction Voltage (Real Value) (mV) 4200
0x0002 Slot 2 Correction Voltage (Real Value) (mV) 4200
0x0003 Slot 1 Correction Current (Real Value) (mA) 1000
0x0004 Slot 2 Correction Current (Real Value) (mA) 1000
0x0005 Input Voltage Correction Value (Reported Value) (mV) 5000
0x0006 Temp Correction Value - 1st 2 digits = slot 1 offset - 5.0 degrees (e.g. 50 = no offset, 60 = +1.0 degree offset, 40 = -1.0 degree offset), 2nd 2 digits = slot 2 offset - 5.0 degrees 5050
0x0007 Heatsink Temp Correction Value - 1st 2 digits = heatsink thermistor 1 offset - 5.0 degrees (e.g. 50 = no offset, 60 = +1.0 degree offset, 40 = -1.0 degree offset), 2nd 2 digits = heatsink thermistor 2 offset - 5.0 degrees 5050
0x0008 Device Serial Number/Identifier 0

Ordering Information

Ordering is currently not recommended, a new version v2.6su is under final design check to address an issue found with R43 being undersized (the dropper resistor between 12V and 2.495Vref) thus causing it to overheat and eventually get damaged, causing unpredictable behavior with the voltage clamp circuit.

If you want to build your own CCR v2.5su, the files (BOM .xlsx, CPL .xlsx, Gerbers .zip) are located here for upload to JLCPCB:

You will need to select the following extended components during checkout (the only unselected necessary component is 4.7uH 0805 inductor):

Extended component selections for ordering.

You will need the following components ordered separately from LCSC:

Part Number Description Link Qty per CCR Cost
C295681 0805 4.7uH Inductor 700mA 230mOhm (min. qty. 20) 1 $0.43
C207092 2920 PTC 7A Hold (min. qty. 10) 3 $4.93
C148400 WSP4406 N-Channel MOSFET (min. qty. 30) 4 $3.25
C43809 470uF Electrolytic Capacitor (min. qty. 20) 4 $0.42
C8404 Vin Screw Terminal (optional, can hard-solder) (min. qty. 10) 1 $0.59
C50984 0.1" Female Header 1x20 (min. qty. 10) 2 $1.06
C66603 0.1" Male Header (Fan connector, optional, can hard-solder) (min. qty. 50) 1 $0.36
C123378 3950B 10k Thermistor for Heatsink (min. qty. 20) 1 $0.50
S&H Shipping $3.66
Total $15.20

You will need the following components/hardware ordered separately from eBay/Aliexpress:

Source Description Link Qty per CCR Cost
JLCPCB 5 PCBAs, assembled top side only from JLCPCB, with $7 SMT coupon 1/5 $84.12
LCSC Remaining FETs, capacitors, connectors (assumed this will be assembled manually) 1 $15.20
eBay 100x40x20mm Heatsink 1 $22.35
Aliexpress STM32F103 (CK32) Blue Pill 1 $9.59
Aliexpress 5V 40x20mm Fan 1 $3.45
eBay M3x25mm Screws for Fan 2 $1.22
Aliexpress 60uH 10A Inductor 10pcs (for operation up to 6.5A charge/discharge) 2 $5.00
Aliexpress 100uH "6A" Inductor 20pcs (for operation up to 3A charge/discharge) 2 $4.88
Aliexpress SMD 18650 Holder 2 $9.39
Aliexpress 9V 5A Adapter (Optional, if you already have PSU) 1 $40.40
Aliexpress M3x5mm Screws (50x) 6 $0.57
Aliexpress M3x8mm Hex Standoffs 2 $0.70
Aliexpress Discharge N-Channel MOSFET (Can obtain from tool pack BMS) 1 $1.33
Total Excl. PSU $152.92 ($30.58 each)
Total Incl. PSU $193.32 ($38.66 each)



Total Project Cost

EE Component Cost Source
OPA335 Zero-Drift Amplifier (qty 2) $2.42 LCSC
MCP1402 MOSFET Driver (qty 4) $1.83 LCSC
STM32F103 "Blue Pill" $1.82 Aliexpress
NCS199A1 Current Sense Amplifier (qty 2) $1.45 LCSC
18650 SMT Holder (qty 2) $1.23 Aliexpress
N-channel MOSFET 13A 11.5mOhm SOIC-8 (qty 4) $0.52 LCSC
rBOM (under $0.41) $4.76 LCSC
Assembly $7.10 - $31.70 PCBgogo
HW Component Cost Source
100x40x20 Aluminum Heatsink $3.02 eBay
40x40x20 5V Fan $1.60 eBay
Misc HW (Under $0.22) $0.42 Aliexpress/eBay
Total Price $52.41 (Assembly cost $317, batch qty 10)