Utility library for testing and calibrating the BQ34Z100-G1 fuel gauge IC.
Utils library for our BQ34Z100G1 driver. See https://os.mbed.com/users/MultipleMonomials/code/BQ34Z100G1/wiki/Setup-and-Calibration-Guide
New releases of this code have moved to GitHub: https://github.com/USCRPL/BQ34Z100G1-Utils
BQ34Z100G1-Utils.cpp@0:fcd2c91c4626, 2021-02-07 (annotated)
- Committer:
- MultipleMonomials
- Date:
- Sun Feb 07 14:21:20 2021 -0800
- Revision:
- 0:fcd2c91c4626
Import test suite from RPL repository
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MultipleMonomials | 0:fcd2c91c4626 | 1 | /* |
MultipleMonomials | 0:fcd2c91c4626 | 2 | USC RPL HAMSTER v2.3 BQ34Z100 Test Suite |
MultipleMonomials | 0:fcd2c91c4626 | 3 | Contributors: Arpad Kovesdy |
MultipleMonomials | 0:fcd2c91c4626 | 4 | */ |
MultipleMonomials | 0:fcd2c91c4626 | 5 | #include "BQ34Z100G1-Utils.h" |
MultipleMonomials | 0:fcd2c91c4626 | 6 | |
MultipleMonomials | 0:fcd2c91c4626 | 7 | #include <cinttypes> |
MultipleMonomials | 0:fcd2c91c4626 | 8 | |
MultipleMonomials | 0:fcd2c91c4626 | 9 | namespace mbed |
MultipleMonomials | 0:fcd2c91c4626 | 10 | { |
MultipleMonomials | 0:fcd2c91c4626 | 11 | FileHandle *mbed_override_console(int) |
MultipleMonomials | 0:fcd2c91c4626 | 12 | { |
MultipleMonomials | 0:fcd2c91c4626 | 13 | static BufferedSerial serial(USBTX, USBRX, 115200); |
MultipleMonomials | 0:fcd2c91c4626 | 14 | return &serial; |
MultipleMonomials | 0:fcd2c91c4626 | 15 | } |
MultipleMonomials | 0:fcd2c91c4626 | 16 | } |
MultipleMonomials | 0:fcd2c91c4626 | 17 | |
MultipleMonomials | 0:fcd2c91c4626 | 18 | // helper function to print a bitfield prettily. |
MultipleMonomials | 0:fcd2c91c4626 | 19 | void printBitfield(uint16_t value, const char* name, const char** bitDescriptions) |
MultipleMonomials | 0:fcd2c91c4626 | 20 | { |
MultipleMonomials | 0:fcd2c91c4626 | 21 | printf("\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 22 | printf("%s: 0x%" PRIx16 " (0b", name, value); |
MultipleMonomials | 0:fcd2c91c4626 | 23 | for (int i = 15; i >= 0; i--) |
MultipleMonomials | 0:fcd2c91c4626 | 24 | { |
MultipleMonomials | 0:fcd2c91c4626 | 25 | printf("%i", (value >> i) & 1); |
MultipleMonomials | 0:fcd2c91c4626 | 26 | } |
MultipleMonomials | 0:fcd2c91c4626 | 27 | printf(")\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 28 | |
MultipleMonomials | 0:fcd2c91c4626 | 29 | const size_t maxBit = sizeof(value) * 8 - 1; |
MultipleMonomials | 0:fcd2c91c4626 | 30 | for (int i = maxBit; i>=0; i--) |
MultipleMonomials | 0:fcd2c91c4626 | 31 | { |
MultipleMonomials | 0:fcd2c91c4626 | 32 | // Description array is in reverse order numerically |
MultipleMonomials | 0:fcd2c91c4626 | 33 | char const * description = bitDescriptions[maxBit - i]; |
MultipleMonomials | 0:fcd2c91c4626 | 34 | |
MultipleMonomials | 0:fcd2c91c4626 | 35 | uint8_t bitValue = (value >> i) & 1; |
MultipleMonomials | 0:fcd2c91c4626 | 36 | if(description != nullptr) |
MultipleMonomials | 0:fcd2c91c4626 | 37 | { |
MultipleMonomials | 0:fcd2c91c4626 | 38 | printf("- %s: %" PRIu8 "\n", description, bitValue); |
MultipleMonomials | 0:fcd2c91c4626 | 39 | } |
MultipleMonomials | 0:fcd2c91c4626 | 40 | } |
MultipleMonomials | 0:fcd2c91c4626 | 41 | } |
MultipleMonomials | 0:fcd2c91c4626 | 42 | |
MultipleMonomials | 0:fcd2c91c4626 | 43 | void BQ34Utils::outputStatus() |
MultipleMonomials | 0:fcd2c91c4626 | 44 | { |
MultipleMonomials | 0:fcd2c91c4626 | 45 | uint16_t status_code = soc.getStatus(); |
MultipleMonomials | 0:fcd2c91c4626 | 46 | |
MultipleMonomials | 0:fcd2c91c4626 | 47 | // Descriptions for each bit of the status bytes |
MultipleMonomials | 0:fcd2c91c4626 | 48 | const char* statusBitDescs[] = { |
MultipleMonomials | 0:fcd2c91c4626 | 49 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 50 | "Full Access Sealed (FAS)", |
MultipleMonomials | 0:fcd2c91c4626 | 51 | "Sealed (SS)", |
MultipleMonomials | 0:fcd2c91c4626 | 52 | "Calibration Enabled (CALEN)", |
MultipleMonomials | 0:fcd2c91c4626 | 53 | "Coulomb Counter Calibrating (CCA)", |
MultipleMonomials | 0:fcd2c91c4626 | 54 | "Board Calibration Active (BCA)", |
MultipleMonomials | 0:fcd2c91c4626 | 55 | "Valid Data Flash Checksum (CSV)", |
MultipleMonomials | 0:fcd2c91c4626 | 56 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 57 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 58 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 59 | "Full Sleep Mode (FULLSLEEP)", |
MultipleMonomials | 0:fcd2c91c4626 | 60 | "Sleep Mode (SLEEP)", |
MultipleMonomials | 0:fcd2c91c4626 | 61 | "Impedance Track using Constant Power (LDMD)", |
MultipleMonomials | 0:fcd2c91c4626 | 62 | "Ra Updates Disabled (RUP_DIS)", |
MultipleMonomials | 0:fcd2c91c4626 | 63 | "Voltage OK for Qmax Updates (VOK)", |
MultipleMonomials | 0:fcd2c91c4626 | 64 | "Qmax Updates Enabled (QEN)" |
MultipleMonomials | 0:fcd2c91c4626 | 65 | }; |
MultipleMonomials | 0:fcd2c91c4626 | 66 | |
MultipleMonomials | 0:fcd2c91c4626 | 67 | printBitfield(status_code, "Control Status", statusBitDescs); |
MultipleMonomials | 0:fcd2c91c4626 | 68 | |
MultipleMonomials | 0:fcd2c91c4626 | 69 | // Descriptions for each bit of the flags bytes |
MultipleMonomials | 0:fcd2c91c4626 | 70 | const char* flagsBitDescs[] = { |
MultipleMonomials | 0:fcd2c91c4626 | 71 | "Overtemperature in Charge (OTC)", |
MultipleMonomials | 0:fcd2c91c4626 | 72 | "Overtemperature in Discharge (OTD)", |
MultipleMonomials | 0:fcd2c91c4626 | 73 | "High Battery Voltage (BATHI)", |
MultipleMonomials | 0:fcd2c91c4626 | 74 | "Low Battery Voltage (BATLOW)", |
MultipleMonomials | 0:fcd2c91c4626 | 75 | "Charge Inhibited (CHG_INH)", |
MultipleMonomials | 0:fcd2c91c4626 | 76 | "Charging Not Allowed (XCHG)", |
MultipleMonomials | 0:fcd2c91c4626 | 77 | "Full Charge (FC)", |
MultipleMonomials | 0:fcd2c91c4626 | 78 | "Charge Allowed (CHG)", |
MultipleMonomials | 0:fcd2c91c4626 | 79 | "Open Circuit Voltage Measurement Performed (OCVTAKEN)", |
MultipleMonomials | 0:fcd2c91c4626 | 80 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 81 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 82 | "Update Cycle Needed (CF)", |
MultipleMonomials | 0:fcd2c91c4626 | 83 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 84 | "SoC Threshold 1 Reached (SOC1)", |
MultipleMonomials | 0:fcd2c91c4626 | 85 | "SoC Threshold Final Reached (SOCF)", |
MultipleMonomials | 0:fcd2c91c4626 | 86 | "Discharge Detected (DSG)" |
MultipleMonomials | 0:fcd2c91c4626 | 87 | }; |
MultipleMonomials | 0:fcd2c91c4626 | 88 | const char* flagsBBitDescs[] = { |
MultipleMonomials | 0:fcd2c91c4626 | 89 | "State of Health Calc Active (SOH)", |
MultipleMonomials | 0:fcd2c91c4626 | 90 | "LiFePO4 Relax Enabled (LIFE)", |
MultipleMonomials | 0:fcd2c91c4626 | 91 | "Waiting for Depth of Discharge Measurement (FIRSTDOD)", |
MultipleMonomials | 0:fcd2c91c4626 | 92 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 93 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 94 | "Depth of Discharge at End of Charge Updated (DODEOC)", |
MultipleMonomials | 0:fcd2c91c4626 | 95 | "Remaining Capacity Changed (DTRC)", |
MultipleMonomials | 0:fcd2c91c4626 | 96 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 97 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 98 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 99 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 100 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 101 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 102 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 103 | nullptr, |
MultipleMonomials | 0:fcd2c91c4626 | 104 | nullptr |
MultipleMonomials | 0:fcd2c91c4626 | 105 | }; |
MultipleMonomials | 0:fcd2c91c4626 | 106 | |
MultipleMonomials | 0:fcd2c91c4626 | 107 | std::pair<uint16_t, uint16_t> flags = soc.getFlags(); |
MultipleMonomials | 0:fcd2c91c4626 | 108 | printBitfield(flags.first, "Flags", flagsBitDescs); |
MultipleMonomials | 0:fcd2c91c4626 | 109 | printBitfield(flags.second, "FlagsB", flagsBBitDescs); |
MultipleMonomials | 0:fcd2c91c4626 | 110 | |
MultipleMonomials | 0:fcd2c91c4626 | 111 | |
MultipleMonomials | 0:fcd2c91c4626 | 112 | uint8_t updateStatus = soc.getUpdateStatus(); |
MultipleMonomials | 0:fcd2c91c4626 | 113 | printf("Update status: 0x%" PRIx8 "\n", updateStatus); |
MultipleMonomials | 0:fcd2c91c4626 | 114 | } |
MultipleMonomials | 0:fcd2c91c4626 | 115 | |
MultipleMonomials | 0:fcd2c91c4626 | 116 | void BQ34Utils::sensorReset() |
MultipleMonomials | 0:fcd2c91c4626 | 117 | { |
MultipleMonomials | 0:fcd2c91c4626 | 118 | printf("Resetting BQ34Z100 Sensor.\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 119 | soc.reset(); |
MultipleMonomials | 0:fcd2c91c4626 | 120 | |
MultipleMonomials | 0:fcd2c91c4626 | 121 | uint16_t deviceType = soc.readDeviceType(); |
MultipleMonomials | 0:fcd2c91c4626 | 122 | if(deviceType == 0x100) |
MultipleMonomials | 0:fcd2c91c4626 | 123 | { |
MultipleMonomials | 0:fcd2c91c4626 | 124 | printf("BQ34Z100 detected\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 125 | } |
MultipleMonomials | 0:fcd2c91c4626 | 126 | else |
MultipleMonomials | 0:fcd2c91c4626 | 127 | { |
MultipleMonomials | 0:fcd2c91c4626 | 128 | printf("Error communicating with BQ34Z100. Expected DEVICE_TYPE = 0x100, got 0x%" PRIx16 "\n", deviceType); |
MultipleMonomials | 0:fcd2c91c4626 | 129 | return; |
MultipleMonomials | 0:fcd2c91c4626 | 130 | } |
MultipleMonomials | 0:fcd2c91c4626 | 131 | |
MultipleMonomials | 0:fcd2c91c4626 | 132 | printf("Chip reads as FW_VERSION 0x%" PRIx16 ", HW version 0x%" PRIx16 "\r\n", soc.readFWVersion(), soc.readHWVersion()); |
MultipleMonomials | 0:fcd2c91c4626 | 133 | } |
MultipleMonomials | 0:fcd2c91c4626 | 134 | |
MultipleMonomials | 0:fcd2c91c4626 | 135 | |
MultipleMonomials | 0:fcd2c91c4626 | 136 | void BQ34Utils::displayData() |
MultipleMonomials | 0:fcd2c91c4626 | 137 | { |
MultipleMonomials | 0:fcd2c91c4626 | 138 | ThisThread::sleep_for(10ms); //Let the device catch up |
MultipleMonomials | 0:fcd2c91c4626 | 139 | printf("SOC: %d%%\r\n", soc.getSOC()); |
MultipleMonomials | 0:fcd2c91c4626 | 140 | printf("Voltage: %d mV\r\n", soc.getVoltage()); |
MultipleMonomials | 0:fcd2c91c4626 | 141 | printf("Current: %d mA\r\n", soc.getCurrent()); |
MultipleMonomials | 0:fcd2c91c4626 | 142 | printf("Remaining: %d mAh\r\n", soc.getRemaining()); |
MultipleMonomials | 0:fcd2c91c4626 | 143 | printf("Temperature: %.1f C\r\n", soc.getTemperature()); |
MultipleMonomials | 0:fcd2c91c4626 | 144 | printf("Max Error: %d%%\r\n", soc.getError()); |
MultipleMonomials | 0:fcd2c91c4626 | 145 | printf("Serial No: %d\r\n", soc.getSerial()); |
MultipleMonomials | 0:fcd2c91c4626 | 146 | printf("CHEM ID: %" PRIx16 "\r\n", soc.getChemID()); |
MultipleMonomials | 0:fcd2c91c4626 | 147 | } |
MultipleMonomials | 0:fcd2c91c4626 | 148 | |
MultipleMonomials | 0:fcd2c91c4626 | 149 | void BQ34Utils::testICConnection() |
MultipleMonomials | 0:fcd2c91c4626 | 150 | { |
MultipleMonomials | 0:fcd2c91c4626 | 151 | printf("Testing Electrical Connection\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 152 | int status = soc.getStatus(); |
MultipleMonomials | 0:fcd2c91c4626 | 153 | printf("Status: %d\r\n\r\n", status); |
MultipleMonomials | 0:fcd2c91c4626 | 154 | } |
MultipleMonomials | 0:fcd2c91c4626 | 155 | |
MultipleMonomials | 0:fcd2c91c4626 | 156 | void BQ34Utils::startCal() |
MultipleMonomials | 0:fcd2c91c4626 | 157 | { |
MultipleMonomials | 0:fcd2c91c4626 | 158 | printf("Starting calibration mode\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 159 | soc.enableCal(); |
MultipleMonomials | 0:fcd2c91c4626 | 160 | soc.enterCal(); |
MultipleMonomials | 0:fcd2c91c4626 | 161 | } |
MultipleMonomials | 0:fcd2c91c4626 | 162 | |
MultipleMonomials | 0:fcd2c91c4626 | 163 | void BQ34Utils::stopCal() |
MultipleMonomials | 0:fcd2c91c4626 | 164 | { |
MultipleMonomials | 0:fcd2c91c4626 | 165 | printf("Stopping calibration mode\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 166 | soc.exitCal(); |
MultipleMonomials | 0:fcd2c91c4626 | 167 | } |
MultipleMonomials | 0:fcd2c91c4626 | 168 | |
MultipleMonomials | 0:fcd2c91c4626 | 169 | void BQ34Utils::startIt() |
MultipleMonomials | 0:fcd2c91c4626 | 170 | { |
MultipleMonomials | 0:fcd2c91c4626 | 171 | printf("Enabling Impedance Tracking\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 172 | soc.ITEnable(); |
MultipleMonomials | 0:fcd2c91c4626 | 173 | } |
MultipleMonomials | 0:fcd2c91c4626 | 174 | |
MultipleMonomials | 0:fcd2c91c4626 | 175 | //Outputs an integer of the length provided starting from the given index in flashBytes |
MultipleMonomials | 0:fcd2c91c4626 | 176 | //Provide pointer to first element (array pointer to flashbytes) |
MultipleMonomials | 0:fcd2c91c4626 | 177 | void BQ34Utils::outputFlashInt(uint8_t* flash, int index, int len) |
MultipleMonomials | 0:fcd2c91c4626 | 178 | { |
MultipleMonomials | 0:fcd2c91c4626 | 179 | if (index > 31) index = index % 32; |
MultipleMonomials | 0:fcd2c91c4626 | 180 | unsigned int result = 0; |
MultipleMonomials | 0:fcd2c91c4626 | 181 | for (int i = 0; i<len; i++) |
MultipleMonomials | 0:fcd2c91c4626 | 182 | { |
MultipleMonomials | 0:fcd2c91c4626 | 183 | //result = result | ((uint32_t)flash[index+i] << 8*len); |
MultipleMonomials | 0:fcd2c91c4626 | 184 | result |= ((uint32_t)flash[index+i] << 8*(len-i-1)); |
MultipleMonomials | 0:fcd2c91c4626 | 185 | } |
MultipleMonomials | 0:fcd2c91c4626 | 186 | printf("%d", result); |
MultipleMonomials | 0:fcd2c91c4626 | 187 | } |
MultipleMonomials | 0:fcd2c91c4626 | 188 | |
MultipleMonomials | 0:fcd2c91c4626 | 189 | void BQ34Utils::writeSettings() |
MultipleMonomials | 0:fcd2c91c4626 | 190 | { |
MultipleMonomials | 0:fcd2c91c4626 | 191 | if(soc.getVoltage() <= FLASH_UPDATE_OK_VOLT * CELLCOUNT) |
MultipleMonomials | 0:fcd2c91c4626 | 192 | { |
MultipleMonomials | 0:fcd2c91c4626 | 193 | printf("WARNING: Measured voltage is below FLASH_UPDATE_OK_VOLT, flash memory writes may not go through. However this is expected if voltage has not been calibrated yet."); |
MultipleMonomials | 0:fcd2c91c4626 | 194 | } |
MultipleMonomials | 0:fcd2c91c4626 | 195 | |
MultipleMonomials | 0:fcd2c91c4626 | 196 | soc.unseal(); |
MultipleMonomials | 0:fcd2c91c4626 | 197 | printf("Starting overwrite of sensor settings\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 198 | uint8_t* flashStore = soc.getFlashBytes(); //Get address of array for later |
MultipleMonomials | 0:fcd2c91c4626 | 199 | |
MultipleMonomials | 0:fcd2c91c4626 | 200 | //Page 48 |
MultipleMonomials | 0:fcd2c91c4626 | 201 | soc.changePage(48, 0); //calls ChangePage from BQ34Z100 editing page 48 from datasheet |
MultipleMonomials | 0:fcd2c91c4626 | 202 | soc.readFlash(); |
MultipleMonomials | 0:fcd2c91c4626 | 203 | |
MultipleMonomials | 0:fcd2c91c4626 | 204 | //declares old subclass properties as per BQ34Z100 function commands |
MultipleMonomials | 0:fcd2c91c4626 | 205 | printf("Old design capacity:"); |
MultipleMonomials | 0:fcd2c91c4626 | 206 | outputFlashInt(flashStore, 11, 2); |
MultipleMonomials | 0:fcd2c91c4626 | 207 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 208 | printf("Old design energy:"); |
MultipleMonomials | 0:fcd2c91c4626 | 209 | outputFlashInt(flashStore, 13, 2); |
MultipleMonomials | 0:fcd2c91c4626 | 210 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 211 | |
MultipleMonomials | 0:fcd2c91c4626 | 212 | //replaces the old subclass properties with new ones as per BQ34Z100 function commands |
MultipleMonomials | 0:fcd2c91c4626 | 213 | soc.changePage48(); |
MultipleMonomials | 0:fcd2c91c4626 | 214 | printf("New design capacity:"); |
MultipleMonomials | 0:fcd2c91c4626 | 215 | outputFlashInt(flashStore, 11, 2); |
MultipleMonomials | 0:fcd2c91c4626 | 216 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 217 | printf("New design energy:"); |
MultipleMonomials | 0:fcd2c91c4626 | 218 | outputFlashInt(flashStore, 13, 2); |
MultipleMonomials | 0:fcd2c91c4626 | 219 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 220 | |
MultipleMonomials | 0:fcd2c91c4626 | 221 | //Page 64 |
MultipleMonomials | 0:fcd2c91c4626 | 222 | soc.changePage(64, 0); //calls ChangePage from BQ34Z100 editing page 48 from datasheet |
MultipleMonomials | 0:fcd2c91c4626 | 223 | soc.readFlash(); |
MultipleMonomials | 0:fcd2c91c4626 | 224 | |
MultipleMonomials | 0:fcd2c91c4626 | 225 | //declares old subclass properties as per BQ34Z100 function commands |
MultipleMonomials | 0:fcd2c91c4626 | 226 | printf("Old Pack Configuration:"); |
MultipleMonomials | 0:fcd2c91c4626 | 227 | outputFlashInt(flashStore, 0, 2); |
MultipleMonomials | 0:fcd2c91c4626 | 228 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 229 | printf("Old LED Config:"); |
MultipleMonomials | 0:fcd2c91c4626 | 230 | outputFlashInt(flashStore, 4, 1); |
MultipleMonomials | 0:fcd2c91c4626 | 231 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 232 | printf("Old Cell Count:"); |
MultipleMonomials | 0:fcd2c91c4626 | 233 | outputFlashInt(flashStore, 7, 1); |
MultipleMonomials | 0:fcd2c91c4626 | 234 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 235 | |
MultipleMonomials | 0:fcd2c91c4626 | 236 | //replaces the old subclass properties with new ones as per BQ34Z100 function commands |
MultipleMonomials | 0:fcd2c91c4626 | 237 | soc.changePage64(); |
MultipleMonomials | 0:fcd2c91c4626 | 238 | printf("New Pack Configuration:"); |
MultipleMonomials | 0:fcd2c91c4626 | 239 | outputFlashInt(flashStore, 0, 2); |
MultipleMonomials | 0:fcd2c91c4626 | 240 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 241 | printf("New LED Config:"); |
MultipleMonomials | 0:fcd2c91c4626 | 242 | outputFlashInt(flashStore, 4, 1); |
MultipleMonomials | 0:fcd2c91c4626 | 243 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 244 | printf("New Cell Count:"); |
MultipleMonomials | 0:fcd2c91c4626 | 245 | outputFlashInt(flashStore, 7, 1); |
MultipleMonomials | 0:fcd2c91c4626 | 246 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 247 | |
MultipleMonomials | 0:fcd2c91c4626 | 248 | //Page 80 |
MultipleMonomials | 0:fcd2c91c4626 | 249 | |
MultipleMonomials | 0:fcd2c91c4626 | 250 | soc.changePage(80, 0); //calls ChangePage from BQ34Z100 editing page 48 from datasheet |
MultipleMonomials | 0:fcd2c91c4626 | 251 | soc.readFlash(); |
MultipleMonomials | 0:fcd2c91c4626 | 252 | //declares old subclass properties as per BQ34Z100 function commands |
MultipleMonomials | 0:fcd2c91c4626 | 253 | printf("Old Load Select:"); |
MultipleMonomials | 0:fcd2c91c4626 | 254 | outputFlashInt(flashStore, 0, 1); |
MultipleMonomials | 0:fcd2c91c4626 | 255 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 256 | printf("Old Load Mode:"); |
MultipleMonomials | 0:fcd2c91c4626 | 257 | outputFlashInt(flashStore, 1, 1); |
MultipleMonomials | 0:fcd2c91c4626 | 258 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 259 | |
MultipleMonomials | 0:fcd2c91c4626 | 260 | soc.changePage(80, 53); |
MultipleMonomials | 0:fcd2c91c4626 | 261 | soc.readFlash(); |
MultipleMonomials | 0:fcd2c91c4626 | 262 | printf("Old Cell Terminate Voltage:"); |
MultipleMonomials | 0:fcd2c91c4626 | 263 | outputFlashInt(flashStore, 53, 2); |
MultipleMonomials | 0:fcd2c91c4626 | 264 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 265 | |
MultipleMonomials | 0:fcd2c91c4626 | 266 | //replaces the old subclass properties with new ones as per BQ34Z100 function commands |
MultipleMonomials | 0:fcd2c91c4626 | 267 | soc.changePage80(); |
MultipleMonomials | 0:fcd2c91c4626 | 268 | soc.changePage(80, 0); |
MultipleMonomials | 0:fcd2c91c4626 | 269 | soc.readFlash(); |
MultipleMonomials | 0:fcd2c91c4626 | 270 | printf("New Load Select:"); |
MultipleMonomials | 0:fcd2c91c4626 | 271 | outputFlashInt(flashStore, 0, 1); |
MultipleMonomials | 0:fcd2c91c4626 | 272 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 273 | printf("New Load Mode:"); |
MultipleMonomials | 0:fcd2c91c4626 | 274 | outputFlashInt(flashStore, 1, 1); |
MultipleMonomials | 0:fcd2c91c4626 | 275 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 276 | printf("Res Current:"); |
MultipleMonomials | 0:fcd2c91c4626 | 277 | outputFlashInt(flashStore, 10, 2); |
MultipleMonomials | 0:fcd2c91c4626 | 278 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 279 | soc.changePage(80, 53); |
MultipleMonomials | 0:fcd2c91c4626 | 280 | soc.readFlash(); |
MultipleMonomials | 0:fcd2c91c4626 | 281 | printf("New Cell Terminate Voltage:"); |
MultipleMonomials | 0:fcd2c91c4626 | 282 | outputFlashInt(flashStore, 53, 2); |
MultipleMonomials | 0:fcd2c91c4626 | 283 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 284 | |
MultipleMonomials | 0:fcd2c91c4626 | 285 | //Page 82 |
MultipleMonomials | 0:fcd2c91c4626 | 286 | soc.changePage(82, 0); //calls ChangePage from BQ34Z100 editing page 48 from datasheet |
MultipleMonomials | 0:fcd2c91c4626 | 287 | soc.readFlash(); |
MultipleMonomials | 0:fcd2c91c4626 | 288 | |
MultipleMonomials | 0:fcd2c91c4626 | 289 | //declares old subclass properties as per BQ34Z100 function commands |
MultipleMonomials | 0:fcd2c91c4626 | 290 | printf("Old QMax0:"); |
MultipleMonomials | 0:fcd2c91c4626 | 291 | outputFlashInt(flashStore, 0, 2); |
MultipleMonomials | 0:fcd2c91c4626 | 292 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 293 | |
MultipleMonomials | 0:fcd2c91c4626 | 294 | //replaces the old subclass properties with new ones as per BQ34Z100 function commands |
MultipleMonomials | 0:fcd2c91c4626 | 295 | soc.changePage82(); |
MultipleMonomials | 0:fcd2c91c4626 | 296 | printf("New QMax0:"); |
MultipleMonomials | 0:fcd2c91c4626 | 297 | outputFlashInt(flashStore, 0, 2); |
MultipleMonomials | 0:fcd2c91c4626 | 298 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 299 | |
MultipleMonomials | 0:fcd2c91c4626 | 300 | //Print the updatestatus |
MultipleMonomials | 0:fcd2c91c4626 | 301 | //0x02 = Qmax and Ra data are learned, but Impedance Track is not enabled. |
MultipleMonomials | 0:fcd2c91c4626 | 302 | //This should be the standard setting for a Golden Image File |
MultipleMonomials | 0:fcd2c91c4626 | 303 | //0x04 = Impedance Track is enabled but Qmax and Ra data are not yet learned. |
MultipleMonomials | 0:fcd2c91c4626 | 304 | //0x05 = Impedance Track is enabled and only Qmax has been updated during a learning cycle. |
MultipleMonomials | 0:fcd2c91c4626 | 305 | //0x06 = Impedance Track is enabled. Qmax and Ra data are learned after a successful learning |
MultipleMonomials | 0:fcd2c91c4626 | 306 | //cycle. This should be the operation setting for end equipment. |
MultipleMonomials | 0:fcd2c91c4626 | 307 | printf("UPDATE STATUS:"); |
MultipleMonomials | 0:fcd2c91c4626 | 308 | outputFlashInt(flashStore, 4, 1); |
MultipleMonomials | 0:fcd2c91c4626 | 309 | printf("\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 310 | } |
MultipleMonomials | 0:fcd2c91c4626 | 311 | |
MultipleMonomials | 0:fcd2c91c4626 | 312 | void BQ34Utils::calibrateVoltage () |
MultipleMonomials | 0:fcd2c91c4626 | 313 | { |
MultipleMonomials | 0:fcd2c91c4626 | 314 | |
MultipleMonomials | 0:fcd2c91c4626 | 315 | printf("Enter voltage across the pack: "); |
MultipleMonomials | 0:fcd2c91c4626 | 316 | float batVoltage=-1; |
MultipleMonomials | 0:fcd2c91c4626 | 317 | scanf("%f", &batVoltage); |
MultipleMonomials | 0:fcd2c91c4626 | 318 | printf("Hand measured voltage: %f\r\n\n", batVoltage); |
MultipleMonomials | 0:fcd2c91c4626 | 319 | //printf("Enter ACTUAL battery voltage in volts\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 320 | //pc.scanf("%f", &batVoltage); |
MultipleMonomials | 0:fcd2c91c4626 | 321 | uint16_t batVoltage_mv = (uint16_t)(batVoltage*1000.0f); |
MultipleMonomials | 0:fcd2c91c4626 | 322 | printf("\r\nCurrent Monitor Bus Voltage Battery Voltage (V): %f\r\n", batVoltage); |
MultipleMonomials | 0:fcd2c91c4626 | 323 | |
MultipleMonomials | 0:fcd2c91c4626 | 324 | printf("New Flash Voltage: %d\r\n", soc.calibrateVoltage(batVoltage_mv)); |
MultipleMonomials | 0:fcd2c91c4626 | 325 | } |
MultipleMonomials | 0:fcd2c91c4626 | 326 | |
MultipleMonomials | 0:fcd2c91c4626 | 327 | //Input current in A |
MultipleMonomials | 0:fcd2c91c4626 | 328 | void BQ34Utils::calibrateCurrent() |
MultipleMonomials | 0:fcd2c91c4626 | 329 | { |
MultipleMonomials | 0:fcd2c91c4626 | 330 | // first reset back to theoretical value |
MultipleMonomials | 0:fcd2c91c4626 | 331 | soc.setSenseResistor(); |
MultipleMonomials | 0:fcd2c91c4626 | 332 | |
MultipleMonomials | 0:fcd2c91c4626 | 333 | // reset sensor so it picks up new settings |
MultipleMonomials | 0:fcd2c91c4626 | 334 | soc.reset(); |
MultipleMonomials | 0:fcd2c91c4626 | 335 | ThisThread::sleep_for(200ms); |
MultipleMonomials | 0:fcd2c91c4626 | 336 | |
MultipleMonomials | 0:fcd2c91c4626 | 337 | // Now calibrate more exactly using hand-measured value |
MultipleMonomials | 0:fcd2c91c4626 | 338 | printf("Enter current through the sense resistor in A: "); |
MultipleMonomials | 0:fcd2c91c4626 | 339 | float current=-1; |
MultipleMonomials | 0:fcd2c91c4626 | 340 | scanf("%f", ¤t); |
MultipleMonomials | 0:fcd2c91c4626 | 341 | printf("Hand measured current%f:\r\n\n", current); |
MultipleMonomials | 0:fcd2c91c4626 | 342 | |
MultipleMonomials | 0:fcd2c91c4626 | 343 | printf("Calibrating current shunt\r\n\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 344 | int16_t current_int = (int16_t)(current*1000.0f); |
MultipleMonomials | 0:fcd2c91c4626 | 345 | soc.calibrateShunt(current_int); |
MultipleMonomials | 0:fcd2c91c4626 | 346 | } |
MultipleMonomials | 0:fcd2c91c4626 | 347 | |
MultipleMonomials | 0:fcd2c91c4626 | 348 | |
MultipleMonomials | 0:fcd2c91c4626 | 349 | void BQ34Utils::readVoltageCurrent() |
MultipleMonomials | 0:fcd2c91c4626 | 350 | { |
MultipleMonomials | 0:fcd2c91c4626 | 351 | Timer chargeTimer; |
MultipleMonomials | 0:fcd2c91c4626 | 352 | chargeTimer.start(); |
MultipleMonomials | 0:fcd2c91c4626 | 353 | |
MultipleMonomials | 0:fcd2c91c4626 | 354 | printf("Time (s),\tVoltage (V),\tCurrent (mA)\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 355 | |
MultipleMonomials | 0:fcd2c91c4626 | 356 | while (true) { |
MultipleMonomials | 0:fcd2c91c4626 | 357 | int voltage = soc.getVoltage(); |
MultipleMonomials | 0:fcd2c91c4626 | 358 | int current = soc.getCurrent(); |
MultipleMonomials | 0:fcd2c91c4626 | 359 | printf("%f,\t%d,\t%d\r\n", std::chrono::duration_cast<std::chrono::duration<float>>(chargeTimer.elapsed_time()).count(), voltage, current); |
MultipleMonomials | 0:fcd2c91c4626 | 360 | ThisThread::sleep_for(100ms); |
MultipleMonomials | 0:fcd2c91c4626 | 361 | } |
MultipleMonomials | 0:fcd2c91c4626 | 362 | } |
MultipleMonomials | 0:fcd2c91c4626 | 363 | |
MultipleMonomials | 0:fcd2c91c4626 | 364 | void BQ34Utils::resetVoltageCalibration() |
MultipleMonomials | 0:fcd2c91c4626 | 365 | { |
MultipleMonomials | 0:fcd2c91c4626 | 366 | soc.setVoltageDivider(RESETVOLTAGE); |
MultipleMonomials | 0:fcd2c91c4626 | 367 | printf("\r\n\nVoltage divider calibration reset.\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 368 | } |
MultipleMonomials | 0:fcd2c91c4626 | 369 | |
MultipleMonomials | 0:fcd2c91c4626 | 370 | void BQ34Utils::testFloatConversion() |
MultipleMonomials | 0:fcd2c91c4626 | 371 | { |
MultipleMonomials | 0:fcd2c91c4626 | 372 | // test data from https://e2e.ti.com/support/power-management/f/196/p/551252/2020286?tisearch=e2e-quicksearch&keymatch=xemics#2020286 |
MultipleMonomials | 0:fcd2c91c4626 | 373 | float valueFloat = .8335f; |
MultipleMonomials | 0:fcd2c91c4626 | 374 | uint32_t valueXemics = 0x80555E9E; |
MultipleMonomials | 0:fcd2c91c4626 | 375 | |
MultipleMonomials | 0:fcd2c91c4626 | 376 | // try converting float to xemics |
MultipleMonomials | 0:fcd2c91c4626 | 377 | uint32_t convertedValue = BQ34Z100::floatToXemics(valueFloat); |
MultipleMonomials | 0:fcd2c91c4626 | 378 | printf("Converted value: 0x%" PRIx32 "\n", convertedValue); |
MultipleMonomials | 0:fcd2c91c4626 | 379 | |
MultipleMonomials | 0:fcd2c91c4626 | 380 | // try converting xemics to float |
MultipleMonomials | 0:fcd2c91c4626 | 381 | float convertedFloat = BQ34Z100::xemicsToFloat(valueXemics); |
MultipleMonomials | 0:fcd2c91c4626 | 382 | printf("Converted float: %f\n", convertedFloat); |
MultipleMonomials | 0:fcd2c91c4626 | 383 | |
MultipleMonomials | 0:fcd2c91c4626 | 384 | printf("Expected default CC Gain: 0x%" PRIx32 "\n", BQ34Z100::floatToXemics(0.4768)); |
MultipleMonomials | 0:fcd2c91c4626 | 385 | printf("Expected default CC Delta: 0x%" PRIx32 "\n", BQ34Z100::floatToXemics(567744.56)); |
MultipleMonomials | 0:fcd2c91c4626 | 386 | |
MultipleMonomials | 0:fcd2c91c4626 | 387 | } |
MultipleMonomials | 0:fcd2c91c4626 | 388 | |
MultipleMonomials | 0:fcd2c91c4626 | 389 | |
MultipleMonomials | 0:fcd2c91c4626 | 390 | int main() |
MultipleMonomials | 0:fcd2c91c4626 | 391 | { |
MultipleMonomials | 0:fcd2c91c4626 | 392 | //declare the test harness |
MultipleMonomials | 0:fcd2c91c4626 | 393 | BQ34Utils harness; |
MultipleMonomials | 0:fcd2c91c4626 | 394 | |
MultipleMonomials | 0:fcd2c91c4626 | 395 | while(1){ |
MultipleMonomials | 0:fcd2c91c4626 | 396 | int test=-1; |
MultipleMonomials | 0:fcd2c91c4626 | 397 | printf("\r\n\nBattery State of Charge Sensor Test Suite:\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 398 | |
MultipleMonomials | 0:fcd2c91c4626 | 399 | //Menu for each test item |
MultipleMonomials | 0:fcd2c91c4626 | 400 | printf("Select a test: \n\r"); |
MultipleMonomials | 0:fcd2c91c4626 | 401 | printf("1. Reset Sensor (Restart)\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 402 | printf("2. Write Settings to Flash\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 403 | printf("3. Calibrate Voltage\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 404 | printf("4. Calibrate Current\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 405 | printf("5. Enable Calibration Mode\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 406 | printf("6. Disable Calibration Mode\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 407 | printf("7. Enable Impedance Tracking\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 408 | printf("8. Output Status\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 409 | printf("9. Display Data\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 410 | printf("10. Test Connection to Sensor\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 411 | printf("11. Reset Voltage Divider Calibration\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 412 | printf("12. Test Float Conversion\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 413 | printf("13. Read Voltage and Current Forever\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 414 | |
MultipleMonomials | 0:fcd2c91c4626 | 415 | scanf("%d", &test); |
MultipleMonomials | 0:fcd2c91c4626 | 416 | printf("Running test %d:\r\n\n", test); |
MultipleMonomials | 0:fcd2c91c4626 | 417 | |
MultipleMonomials | 0:fcd2c91c4626 | 418 | //SWITCH. ADD A CASE FOR EACH TEST. |
MultipleMonomials | 0:fcd2c91c4626 | 419 | switch(test) { |
MultipleMonomials | 0:fcd2c91c4626 | 420 | case 1: harness.sensorReset(); break; |
MultipleMonomials | 0:fcd2c91c4626 | 421 | case 2: harness.writeSettings(); break; |
MultipleMonomials | 0:fcd2c91c4626 | 422 | case 3: harness.calibrateVoltage(); break; |
MultipleMonomials | 0:fcd2c91c4626 | 423 | case 4: harness.calibrateCurrent(); break; |
MultipleMonomials | 0:fcd2c91c4626 | 424 | case 5: harness.startCal(); break; |
MultipleMonomials | 0:fcd2c91c4626 | 425 | case 6: harness.stopCal(); break; |
MultipleMonomials | 0:fcd2c91c4626 | 426 | case 7: harness.startIt(); break; |
MultipleMonomials | 0:fcd2c91c4626 | 427 | case 8: harness.outputStatus(); break; |
MultipleMonomials | 0:fcd2c91c4626 | 428 | case 9: harness.displayData(); break; |
MultipleMonomials | 0:fcd2c91c4626 | 429 | case 10: harness.testICConnection(); break; |
MultipleMonomials | 0:fcd2c91c4626 | 430 | case 11: harness.resetVoltageCalibration(); break; |
MultipleMonomials | 0:fcd2c91c4626 | 431 | case 12: harness.testFloatConversion(); break; |
MultipleMonomials | 0:fcd2c91c4626 | 432 | case 13: harness.readVoltageCurrent(); break; |
MultipleMonomials | 0:fcd2c91c4626 | 433 | default: printf("Invalid test number.\r\n"); break; |
MultipleMonomials | 0:fcd2c91c4626 | 434 | } |
MultipleMonomials | 0:fcd2c91c4626 | 435 | |
MultipleMonomials | 0:fcd2c91c4626 | 436 | printf("done.\r\n"); |
MultipleMonomials | 0:fcd2c91c4626 | 437 | } |
MultipleMonomials | 0:fcd2c91c4626 | 438 | return 0; |
MultipleMonomials | 0:fcd2c91c4626 | 439 | } |