Code to assist in measuring a battery's Chemical ID.
New releases of this code have moved to GitHub: https://github.com/USCRPL/BQ34Z100G1-Utils
ChemIDMeasurer.cpp@0:246ef70a9e6e, 2021-02-07 (annotated)
- Committer:
- Jamie Smith
- Date:
- Sun Feb 07 20:57:24 2021 -0800
- Revision:
- 0:246ef70a9e6e
Import code from RPL repository
Who changed what in which revision?
User | Revision | Line number | New 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 | } |