Code to assist in measuring a battery's Chemical ID.

Dependencies:   BQ34Z100G1

New releases of this code have moved to GitHub: https://github.com/USCRPL/BQ34Z100G1-Utils

Committer:
Jamie Smith
Date:
Sun Feb 07 21:41:33 2021 -0800
Revision:
1:485ac3d4918b
Parent:
0:246ef70a9e6e
Add config.txt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jamie Smith 0:246ef70a9e6e 1 #include "ChemIDMeasurer.h"
Jamie Smith 0:246ef70a9e6e 2 #include <cinttypes>
Jamie Smith 0:246ef70a9e6e 3
Jamie Smith 0:246ef70a9e6e 4 namespace mbed
Jamie Smith 0:246ef70a9e6e 5 {
Jamie Smith 0:246ef70a9e6e 6 FileHandle *mbed_override_console(int)
Jamie Smith 0:246ef70a9e6e 7 {
Jamie Smith 0:246ef70a9e6e 8 static BufferedSerial serial(USBTX, USBRX, 115200);
Jamie Smith 0:246ef70a9e6e 9 return &serial;
Jamie Smith 0:246ef70a9e6e 10 }
Jamie Smith 0:246ef70a9e6e 11 }
Jamie Smith 0:246ef70a9e6e 12
Jamie Smith 0:246ef70a9e6e 13 ChemIDMeasurer::ChemIDMeasurer():
Jamie Smith 0:246ef70a9e6e 14 soc(I2C_SDA, I2C_SCL, 100000)
Jamie Smith 0:246ef70a9e6e 15 {
Jamie Smith 0:246ef70a9e6e 16 }
Jamie Smith 0:246ef70a9e6e 17
Jamie Smith 0:246ef70a9e6e 18 void ChemIDMeasurer::activateCharger()
Jamie Smith 0:246ef70a9e6e 19 {
Jamie Smith 0:246ef70a9e6e 20 // If you have code to activate the charger, put it here
Jamie Smith 0:246ef70a9e6e 21 }
Jamie Smith 0:246ef70a9e6e 22
Jamie Smith 0:246ef70a9e6e 23 void ChemIDMeasurer::deactivateCharger()
Jamie Smith 0:246ef70a9e6e 24 {
Jamie Smith 0:246ef70a9e6e 25 // If you have code to deactivate the charger, put it here
Jamie Smith 0:246ef70a9e6e 26 }
Jamie Smith 0:246ef70a9e6e 27
Jamie Smith 0:246ef70a9e6e 28 void ChemIDMeasurer::activateLoad()
Jamie Smith 0:246ef70a9e6e 29 {
Jamie Smith 0:246ef70a9e6e 30 // If you have code to activate the dummy load, put it here
Jamie Smith 0:246ef70a9e6e 31 }
Jamie Smith 0:246ef70a9e6e 32
Jamie Smith 0:246ef70a9e6e 33 void ChemIDMeasurer::deactivateLoad()
Jamie Smith 0:246ef70a9e6e 34 {
Jamie Smith 0:246ef70a9e6e 35 // If you have code to deactivate the dummy load, put it here
Jamie Smith 0:246ef70a9e6e 36 }
Jamie Smith 0:246ef70a9e6e 37
Jamie Smith 0:246ef70a9e6e 38 void ChemIDMeasurer::setState(ChemIDMeasurer::State newState)
Jamie Smith 0:246ef70a9e6e 39 {
Jamie Smith 0:246ef70a9e6e 40 state = newState;
Jamie Smith 0:246ef70a9e6e 41 stateTimer.reset();
Jamie Smith 0:246ef70a9e6e 42 }
Jamie Smith 0:246ef70a9e6e 43
Jamie Smith 0:246ef70a9e6e 44 void ChemIDMeasurer::runMeasurement()
Jamie Smith 0:246ef70a9e6e 45 {
Jamie Smith 0:246ef70a9e6e 46 totalTimer.start();
Jamie Smith 0:246ef70a9e6e 47 stateTimer.start();
Jamie Smith 0:246ef70a9e6e 48
Jamie Smith 0:246ef70a9e6e 49 while(state != State::DONE)
Jamie Smith 0:246ef70a9e6e 50 {
Jamie Smith 0:246ef70a9e6e 51 // read data
Jamie Smith 0:246ef70a9e6e 52 uint16_t voltage_mV = soc.getVoltage();
Jamie Smith 0:246ef70a9e6e 53 int32_t current_mA = soc.getCurrent();
Jamie Smith 0:246ef70a9e6e 54 double temperatureC = soc.getTemperature();
Jamie Smith 0:246ef70a9e6e 55 char const * comment = "";
Jamie Smith 0:246ef70a9e6e 56
Jamie Smith 0:246ef70a9e6e 57 // update based on state
Jamie Smith 0:246ef70a9e6e 58 switch (state)
Jamie Smith 0:246ef70a9e6e 59 {
Jamie Smith 0:246ef70a9e6e 60 case State::INIT:
Jamie Smith 0:246ef70a9e6e 61 // Print header
Jamie Smith 0:246ef70a9e6e 62 printf("Elapsed Time (s), Voltage (mV), Current (mA), Temperature (deg C), SoC (%%), Comments\n");
Jamie Smith 0:246ef70a9e6e 63 setState(State::CHARGE);
Jamie Smith 0:246ef70a9e6e 64 activateCharger();
Jamie Smith 0:246ef70a9e6e 65 comment = "Activating charger and entering CHARGE";
Jamie Smith 0:246ef70a9e6e 66 break;
Jamie Smith 0:246ef70a9e6e 67
Jamie Smith 0:246ef70a9e6e 68 case State::CHARGE:
Jamie Smith 0:246ef70a9e6e 69 // threshold current = C/10
Jamie Smith 0:246ef70a9e6e 70 if(current_mA < DESIGNCAP/10)
Jamie Smith 0:246ef70a9e6e 71 {
Jamie Smith 0:246ef70a9e6e 72 deactivateCharger();
Jamie Smith 0:246ef70a9e6e 73 setState(State::RELAX_CHARGED);
Jamie Smith 0:246ef70a9e6e 74 comment = "Deactivating charger and entering RELAX_CHARGED";
Jamie Smith 0:246ef70a9e6e 75 }
Jamie Smith 0:246ef70a9e6e 76 break;
Jamie Smith 0:246ef70a9e6e 77
Jamie Smith 0:246ef70a9e6e 78 case State::RELAX_CHARGED:
Jamie Smith 0:246ef70a9e6e 79 if(stateTimer.elapsed_time() > 2h)
Jamie Smith 0:246ef70a9e6e 80 {
Jamie Smith 0:246ef70a9e6e 81 activateLoad();
Jamie Smith 0:246ef70a9e6e 82 setState(State::DISCHARGE);
Jamie Smith 0:246ef70a9e6e 83 comment = "Done relaxing and entering discharge -- please disconnect charger and connect C/10 load now.";
Jamie Smith 0:246ef70a9e6e 84 }
Jamie Smith 0:246ef70a9e6e 85 break;
Jamie Smith 0:246ef70a9e6e 86
Jamie Smith 0:246ef70a9e6e 87 case State::DISCHARGE:
Jamie Smith 0:246ef70a9e6e 88 // Change states once we hit the termination voltage
Jamie Smith 0:246ef70a9e6e 89 if(voltage_mV < ZEROCHARGEVOLT * CELLCOUNT)
Jamie Smith 0:246ef70a9e6e 90 {
Jamie Smith 0:246ef70a9e6e 91 deactivateLoad();
Jamie Smith 0:246ef70a9e6e 92 setState(State::RELAX_DISCHARGED);
Jamie Smith 0:246ef70a9e6e 93 comment = "Done discharging -- please remove C/10 load now.";
Jamie Smith 0:246ef70a9e6e 94 }
Jamie Smith 0:246ef70a9e6e 95 // BQ34Z100 reports positive current always, but TI's tool expects discharging to
Jamie Smith 0:246ef70a9e6e 96 // be negative current.
Jamie Smith 0:246ef70a9e6e 97 current_mA *= -1;
Jamie Smith 0:246ef70a9e6e 98 break;
Jamie Smith 0:246ef70a9e6e 99
Jamie Smith 0:246ef70a9e6e 100 case State::RELAX_DISCHARGED:
Jamie Smith 0:246ef70a9e6e 101 if(stateTimer.elapsed_time() > 5h)
Jamie Smith 0:246ef70a9e6e 102 {
Jamie Smith 0:246ef70a9e6e 103 setState(State::DONE);
Jamie Smith 0:246ef70a9e6e 104 comment = "Done!";
Jamie Smith 0:246ef70a9e6e 105 }
Jamie Smith 0:246ef70a9e6e 106 break;
Jamie Smith 0:246ef70a9e6e 107
Jamie Smith 0:246ef70a9e6e 108 default:
Jamie Smith 0:246ef70a9e6e 109 // will never be hit but here to silence warning
Jamie Smith 0:246ef70a9e6e 110 break;
Jamie Smith 0:246ef70a9e6e 111 }
Jamie Smith 0:246ef70a9e6e 112
Jamie Smith 0:246ef70a9e6e 113
Jamie Smith 0:246ef70a9e6e 114 // print data column
Jamie Smith 0:246ef70a9e6e 115 printf("%" PRIi64 ", %" PRIi16 ", %" PRIi32 ", %f, %" PRIu8 ", %s\n",
Jamie Smith 0:246ef70a9e6e 116 std::chrono::duration_cast<std::chrono::seconds>(totalTimer.elapsed_time()).count(),
Jamie Smith 0:246ef70a9e6e 117 voltage_mV, current_mA, temperatureC, soc.getSOC(), comment);
Jamie Smith 0:246ef70a9e6e 118
Jamie Smith 0:246ef70a9e6e 119 // wait, update freq is every 5 seconds
Jamie Smith 0:246ef70a9e6e 120 ThisThread::sleep_for(5s);
Jamie Smith 0:246ef70a9e6e 121 }
Jamie Smith 0:246ef70a9e6e 122 }
Jamie Smith 0:246ef70a9e6e 123
Jamie Smith 0:246ef70a9e6e 124 ChemIDMeasurer measurer;
Jamie Smith 0:246ef70a9e6e 125
Jamie Smith 0:246ef70a9e6e 126 int main()
Jamie Smith 0:246ef70a9e6e 127 {
Jamie Smith 0:246ef70a9e6e 128 measurer.runMeasurement();
Jamie Smith 0:246ef70a9e6e 129 return 0;
Jamie Smith 0:246ef70a9e6e 130 }