from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
from tkinter.font import BOLD
from tkinter.ttk import Separator
'''
DS2782K 6000mAh电池ACR校准计算公式:
(1)ACR校准:ACR=((CurrACR/6600)-0.02)*6600 #CurrACR为第一次校准值;6600为最大ACR值;0.02是减小2个百分点;
(2)电量百分比计算:求1%的电压 即:(maxVol- currVol) / (maxVol-minVol)
(3)ACR直接计算:MaxACR * 电量百分比
Note:
MaxVoltage: 4320
MinVoltage: 3377
MaxACR: 6600
CurrentVoltage/CurrentACR: DS2782K工具读取
调试注意事项:
(1)手持机放电不到0关机,即7%或30%关机则ACR往下调
(2)手持机充电充不满则ACR网上调
(3)ACR偏小则电池容易过放、偏大则放电不充分电池用的时间短
校准方法:
---------------------------------------
=>计算出当前电量的百分比
(1)整机充电到充电截止测出:MaxVoltage
(2)整机放电到自动关机测出:MinVoltage(可以适当增加100mV)
(3)DS2782K软件查看电池CurrentVoltage
(4)填入如上参数“计算”出当前电量百分比
---------------------------------------
=>使用上一步计算出的电量百分比计算出对应ACR
(1)MaxACR:6600(6500mAh就默认是6600mAh)
(2)Precentage填入上一步计算出的电量百分比
(3)计算出当前电量对应ACR
---------------------------------------
=>充满电放电测试后,根据实际放电情况上下调整ACR
(1)填入DS2782K读取的当前ACR值到CurrACR
(2)MaxACR默认6600
(3)Precentage填入想上调或下调百分之多少
(4)校准出在当前ACR之上上调或下调的ACR值
---------------------------------------
'''
win = Tk()
win.title('电池ACR校准')
win.geometry('210x300-200-100')
defaultMaxVol = StringVar(value ='4320') #6000mAh 默认充电最大电压值
defaultMinVol = StringVar(value ='3377') #6000mA 手持机测试默认最小电压
defaultMaxACR = StringVar(value='6600') #6000mAh电池默认最大ACR 6600mAh
#计算百分比对应电压
def calculationVoltagePercentage():
maxVol = MaxVol.get()
minVol = MinVol.get()
currVol = currentVol.get()
currentPercentage = (int(currVol) - int(minVol)) / (int(maxVol) - int(minVol))
percentageOut.insert(0, currentPercentage)
#校准ACR
def calibrationACR():
if((len(lbl_CurrACR.get()) == 0) | (len(lbl_MaxACR.get()) == 0) | (len(lbl_Per.get()) == 0)):
messagebox.showwarning('Message title','CurrACR/MaxACR/Percentage不能为空')
return
CurrACR = lbl_CurrACR.get() #第一次校准得到的ACR值
maxACR = lbl_MaxACR.get() #最大ACR值
percentage = lbl_Per.get() #减小的百分比
print('CurrACR:{} maxACR:{} percentage:{}'.format(CurrACR,maxACR,percentage))
if(direction_var.get() == 1):
Tout = ((float(CurrACR)/float(maxACR)) - (int(percentage)/100))*(float(maxACR)) #下调ACR(放掉不到0%即关机下调)
else:
Tout = ((float(CurrACR)/float(maxACR)) + (int(percentage)/100))*(float(maxACR)) #上调ACR(充不满的上调)
lbl_Tout.insert(0,Tout)
#直接根据最大ACR和输入百分比计算ACR
def calculationACR():
MaxACR = maxACR.get()
perValue = percentageACR.get()
outACR = int(MaxACR) * ((int)(perValue)/100)
calOutACR.insert(0, outACR)
lbl_MaxVol = Label(win,text='MaxVoltage:',width=10)
lbl_MaxVol.grid(column=0,row=0)
MaxVol = Entry(win,textvariable=defaultMaxVol, width=10)
MaxVol.grid(column=1,row=0)
lbl_UnitmV1 = Label(win,text='mV',width=5)
lbl_UnitmV1.grid(column=2,row=0)
lbl_MinVol = Label(win,text='MinVoltage:',width=10)
lbl_MinVol.grid(column=0,row=1)
MinVol = Entry(win,textvariable=defaultMinVol, width=10)
MinVol.grid(column=1,row=1)
lbl_UnitmV2 = Label(win,text='mV',width=5)
lbl_UnitmV2.grid(column=2,row=1)
lbl_CurVol = Label(win, text='CurrentVol:', width=10)
lbl_CurVol.grid(column=0,row=2)
currentVol = Entry(win,width=10)
currentVol.grid(column=1,row=2)
lbl_PercentSign = Label(win,text='mV',width=5)
lbl_PercentSign.grid(column=2,row=2)
btn_calculation = Button(win, text='计算:', width=8, command=calculationVoltagePercentage, bg='#FF0000',font=BOLD)
btn_calculation.grid(column=0,row=3)
percentageOut = Entry(win,width=10)
percentageOut.grid(column=1,row=3)
lbl_UnitPercentage = Label(win,text='%',width=5)
lbl_UnitPercentage.grid(column=2,row=3)
#插入分割线
separ = Separator(win, orient=HORIZONTAL,style='red.TSeparator')
separ.grid(column=0,row=4,rowspan=1, columnspan=3, sticky='EW', pady=5, padx=5)
lbl_Pre = Label(win, text='CurrACR:',width=10)
lbl_Pre.grid(column=0, row=5)
lbl_CurrACR = Entry(win, width=10)
lbl_CurrACR.grid(column=1, row=5)
direction_var = IntVar()
direction_var.set(1)
checkBut_direction = Checkbutton(win, text='下调',bg='#0000FF', variable=direction_var)
checkBut_direction.grid(column=2, row=5)
lbl_load = Label(win, text='MaxACR:', width=10)
lbl_load.grid(column=0,row=6)
lbl_MaxACR = Entry(win,textvariable=defaultMaxACR, width=10)
lbl_MaxACR.grid(column=1,row=6)
lbl_UnitmV3 = Label(win,text='mAh',width=5)
lbl_UnitmV3.grid(column=2,row=6)
lbl_Tclk = Label(win, text='Percentage:', width=10)
lbl_Tclk.grid(column=0,row=7)
lbl_Per = Entry(win,width=10)
lbl_Per.grid(column=1,row=7)
lbl_Percent = Label(win,text='%',width=5)
lbl_Percent.grid(column=2,row=7)
btn_calculation = Button(win, text='校准:', width=8, command=calibrationACR, bg='#FF0000',font=BOLD)
btn_calculation.grid(column=0,row=8)
lbl_Tout = Entry(win,width=10)
lbl_Tout.grid(column=1,row=8)
lbl_UnitUs = Label(win,text='mAh',width=5)
lbl_UnitUs.grid(column=2,row=8)
#插入分割线
separ2 = Separator(win, orient=HORIZONTAL)
separ2.grid(column=0,row=9,rowspan=1, columnspan=3, sticky='EW', pady=5, padx=5)
lbl_maxACR = Label(win, text="MaxACR:",width=10)
lbl_maxACR.grid(column=0,row=10)
maxACR = Entry(win,textvariable=defaultMaxACR, width=10)
maxACR.grid(column=1, row=10)
lbl_UnitmV4 = Label(win,text='mAh',width=5)
lbl_UnitmV4.grid(column=2,row=10)
lbl_Percentage3 = Label(win, text='Percentage:', width=10)
lbl_Percentage3.grid(column=0,row=11)
percentageACR = Entry(win,width=10)
percentageACR.grid(column=1,row=11)
lbl_Percent3 = Label(win,text='%',width=5)
lbl_Percent3.grid(column=2,row=11)
btn_calculation3 = Button(win, text='计算:', width=8, command=calculationACR, bg='#FF0000',font=BOLD)
btn_calculation3.grid(column=0,row=12)
calOutACR = Entry(win,width=10)
calOutACR.grid(column=1,row=12)
lbl_UnitACR = Label(win,text='mAh',width=5)
lbl_UnitACR.grid(column=2,row=12)
win.mainloop()