Utility library for testing and calibrating the BQ34Z100-G1 fuel gauge IC.

Dependencies:   BQ34Z100G1

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

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?

UserRevisionLine numberNew 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", &current);
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 }