SLUAAA1 October   2021 BQ21061 , BQ21062 , BQ24179 , BQ25150 , BQ25155 , BQ25157 , BQ25672 , BQ25790 , BQ25792 , BQ25798 , BQ25882 , BQ25883 , BQ25887 , BQ25895 , BQ25896 , BQ25898 , BQ25898D

 

  1.   Trademarks
  2. 1Introduction
  3. 2Battery Characterization
  4. 3Generating the Lookup Table
  5. 4BQ25155 Register Configuration
  6. 5Best Use Cases
  7. 6Python Lookup Table Generator
  8. 7MSP430 Code Snippet

Python Lookup Table Generator


#Command Line Arguments: [TI format gauge output csv file], [Polynomial order for regression]
#Output: Plots VBAT vs SOC reported by TI gauge and creates a polynomial regression of the specified order.
#        This regression is plotted on the same graph as the data and is mapped to a 101-pt hexadecimal lookup table given in the "lookup_table.txt" file.


import matplotlib.pyplot as plt
import numpy as np
import csv
import sys



vbat_arr = []
num_reads = 0
read_arr = []
soc_arr = []

poly4x = []
poly4y = []
poly3y = []
poly3x = []

bin_vals = []

#reads in the TI Gauge csv file and puts the data into the corresponding list.
#Adjust this section if not using TI gauge
with open (sys.argv[1]) as csv_file1:
    csv_reader = csv.reader(csv_file1, dialect='excel',delimiter=',')
    line_count = 0
    for row in csv_reader:
        if (line_count > 8): #To get rid of the labels and other unnecessary stuff
            vbat_arr.append(float(row[6]))
            soc_arr.append(int(row[16]))
            num_reads += 1
        line_count += 1
        

#create a polynomial regression of the order specified in cmd line
polyfunc = np.polyfit(soc_arr, vbat_arr, int(sys.argv[len(sys.argv)-1]))
poly4 = np.poly1d(polyfunc)



#This for loop creates an x and y list from the regression such that it can be plotted later.
#It also calculates the hex values for the battery voltages needed to create the lookup table.
for i in range (0, 101):
    poly4y.append(poly4(i))
    poly4x.append(i)
    vbat_16 = int(round(((poly4(i)/1000)*(2**16))/6)) #Vbat formula found in datasheet
    bin_vals.append(hex(vbat_16)) 

#This for loop outputs the lookup table to the file called "lookup_table.txt"
with open ("lookup_table.txt","w+") as outfile:
    for i in range(0, 101):
        outfile.write(str(bin_vals[i])[0] + str(bin_vals[i])[1] + str(bin_vals[i])[2].upper() + str(bin_vals[i])[3].upper() + str(bin_vals[i])[4].upper() + str(bin_vals[i])[5].upper() + ",\n") #Ensures that hex letters are all uppercase
outfile.close()

#The rest of this is for plotting the data collected and the calculated regression
plt.plot(soc_arr, vbat_arr, 'r', label='Battery Data')
plt.yticks([3000, 3200, 3400, 3600, 3800, 4000, 4200, 4400])
plt.plot(poly4x, poly4y,'b',label='Regression')

plt.xlabel('SOC (%)')
plt.ylabel('Battery Voltage (mV)')
plt.gca().invert_xaxis() #Reverses x axis so that 100% is shown as the leftmost value
plt.title('Battery Voltage vs SOC') 
plt.legend()
plt.grid(b=True, which='major', axis='both')

plt.show()