CCR: Difference between revisions
Line 426: | Line 426: | ||
* 4. End of charge | * 4. End of charge | ||
* 5. IR measuring state | * 5. IR measuring state | ||
'''Debug Message Subtypes''' | |||
* 1. Periodic status (input voltage, heatsink temp(s)) | |||
* 2. IR debug (cell 1) | |||
* 3. IR debug (cell 2) | |||
===Thingspeak=== | ===Thingspeak=== |
Revision as of 23:14, 11 March 2019
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.
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
- Discharge: Up to 5A (single channel), 3A (dual channel)
Low Power Variant
- Charge: Up to 1.5A
- Discharge: Up to 3A
List of Cells that can charge >3.5A
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 | ||||||
^ | 12158 (Buffer pack/input voltage) | 45.30 (Heatsink thermistor 1) | 34.58 (Heatsink thermistor 2) | ||||
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
Debug Message Subtypes
- 1. Periodic status (input voltage, heatsink temp(s))
- 2. IR debug (cell 1)
- 3. IR debug (cell 2)
Thingspeak
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- "https://api.thingspeak.com/update?key=$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.
Development
Breadboard Prototype
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).
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.
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:
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: http://rev0.net/ts_samsung.html and here for the Re-volt cell: http://rev0.net/ts_revolt.html
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.
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.
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.
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.
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.
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
Electronics
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:
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:
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
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:
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.
Microcontroller
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
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.
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.
Hardware Revisions
Revision 1.0
This is the first revision of the CCR, which only natively supports regenerative discharging mode.
Errata:
- 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
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
Errata:
- 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.0
This is a minor 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 (or 6A for discharge).
Change List:
- Fixed C27 silkscreen
- Added series resistor on Op-amp output to protect ADC input of STM32 module
- 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*
Errata:
- ...
PCB Files
Here is the Eagle schematic file for the CCR v1.0: http://rev0proto.com/files/tbd.sch Here is the Eagle board file for the CCR v1.0: http://rev0proto.com/files/tbd.brd
Here is the Eagle schematic file for the CCR v2.0: http://rev0proto.com/files/tbd.sch Here is the Eagle board file for the CCR v2.0: http://rev0proto.com/files/tbd.brd
Enclosure
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: http://rev0proto.com/files/tbd.zip
Code
Full source code for the project can be found here: http://rev0proto.com/files/x.zip
Videos
<HTML5video type="youtube" width="400" height="300" autoplay="false">1SHY4jAfTcM</HTML5video>
Photos
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 |
PCB | $2.00 | JLCPCB |
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) |