def test_bugs(): """Test bugfixes.""" cct = eispice.Circuit('Break-Point Stall Bug') cct.Vx = eispice.V('vs',0, 0, eispice.Pulse(0, 1, '0n','1n','1n','4n','8n')) cct.Rt = eispice.R('vs', 'vi', 50) cct.Tg = eispice.T('vi', 0, 'vo', 0, 50, '2n') cct.Cx = eispice.C('vo',0,'5p') cct.tran('0.01n', '18n') eispice.plot(cct) cct = eispice.Circuit("LC Tline Bug") cct.Vs = eispice.V('vs', 0, 0, eispice.Pulse(0, 1, '15n', '1n', '1n', '5n', '50n')) cct.Rs = eispice.R('vs', 1, 50) for i in range(1,100): setattr(cct,"L%i"%i,eispice.L(i,i+1,"2n")) setattr(cct,"C%i"%i,eispice.C(i+1,0,"1p")) cct.Rl = eispice.R(i+1, 0, 50) cct.tran('0.1n', '200n') eispice.plot_voltage(cct, 1 ,'%i' % (i+1)) cct = eispice.Circuit("SuperLU Hangup Bug") cct.Vx = eispice.V('1', '0', 4, eispice.Pulse(4, 8, '10n', '2n', '3n', '5n', '20n')) cct.Vy = eispice.V('1', '0', 4, eispice.Pulse(8, 4, '10n', '2n', '3n', '5n', '20n')) cct.tran('0.5n', '100n') eispice.plot(cct)
def generateSpiceModel(self): self.spiceModel = [] #clear the spiceModel #setting up singel battery spice model for i in range(self.length-1):# in order to set the last battery sepratedly we should have self.length-1 here Vsp = ('V'+str(i),eispice.V(self[i].pNode,self[i].nNode,self[i].voltage))#eispice source model Rsp = ('iR'+str(i),eispice.R(self[i].nNode,self[i+1].pNode,self[i].intR))#eispice resistance model self.spiceModel.append(Vsp) self.spiceModel.append(Rsp) #set a signel battery spice model if self[i].balanceRate != 0.0: Rsb=('balance_'+ self[i].name,eispice.R(self[i].pNode,self[i+1].pNode, 1.0 * self.balanceResVal / self[i].balanceRate)) self.spiceModel.append(Rsb) # set the spice model for the last battery Vsp = ('V'+str(self.length-1),eispice.V(self[self.length-1].pNode,self[self.length-1].nNode,self[self.length-1].voltage)) Rsp = ('iR'+str(self.length-1),eispice.R(self[self.length-1].nNode,self.nNode,self[self.length-1].intR)) self.spiceModel.append(Vsp) self.spiceModel.append(Rsp) if self[self.length-1].balanceRate != 0.0: Rsb=('balance_'+ self[self.length-1].name,eispice.R(self[self.length-1].pNode,self.nNode, 1.0 * self.balanceResVal / self[self.length-1].balanceRate)) self.spiceModel.append(Rsb) for i in range(self.length): #self.voltageList[i] = round(self[i].voltage,3) #self.quantityList[i] = round(self[i].quantity,3) self.voltageList[i] = self[i].voltage self.quantityList[i] =self[i].quantity self.socList[i] = round(self[i].soc,1) self.cyclesList[i] = self[i].cycles self.totalCurrent=self[0].current self.totalVoltage=sum(self.voltageList) #having a new list to store all the battery spice models return self.spiceModel
def circuit(): cir = eispice.Circuit("Mixed Mode Test") #cir.Vx = eispice.V(1,0,4) cir.L = eispice.L(1, 0, 27e-9) cir.R = eispice.R(1, 0, 820) cir.C = eispice.C(1, 0, 47e-12) cir.Rout = eispice.R(2, 0, 100) cir.TriggerOut = EispicePort(1, 0, triggerout, eispice.Current) cir.DetectorOut = EispicePort(2, 0, detectorout, eispice.Voltage) return cir
def __init__(self, pNode, nNode, batteryDescriptor): ''' Arguments: pNode -- positive node name nNode -- negative node name parameterDict -- dictionary to describe the battery The following keys should be included: batteryDescriptor.Name = 'cell' batteryDescriptor.OCVParameter = OCV_SOC_Parameters batteryDescriptor.InnerR = 0.021 batteryDescriptor.R1 = 0.045 batteryDescriptor.C1 = 300 batteryDescriptor.R2 = None batteryDescriptor.C2 = None batteryDescriptor.InitialSOC = 0.99 batteryDescriptor.Capacity = 5300 batteryDescriptor.OCVCallback = some call back function batteryDescriptor.BalanceResCallBack = None #if it's not None, then a balance resistance will be added. OCVParameter -- K0~K4 parameter of OCV-SOC relation InnerR -- Inner resistance of the battery R1,C1 -- R and C value of first order dynamic model ''' name = batteryDescriptor.Name if batteryDescriptor.R2 is not None and batteryDescriptor.C2 is not None: self.C2 = [('C2_' + name, eispice.C('@nc2_' + name, pNode, batteryDescriptor.C2))] self.R2 = [('R2_' + name, eispice.R(pNode, '@nc2_' + name, batteryDescriptor.R2))] self.C1 = [('C1_' + name, eispice.C('@nc1_' + name, '@nc2_' + name, batteryDescriptor.C1))] self.R1 = [('R1_' + name, eispice.R('@nc2_' + name, '@nc1_' + name, batteryDescriptor.R1))] else: self.C1 = [('C1_' + name, eispice.C('@nc1_' + name, pNode, batteryDescriptor.C1))] self.R1 = [('R1_' + name, eispice.R(pNode, '@nc1_' + name, batteryDescriptor.R1))] self.iR = [('iR_' + name, eispice.R('@nc0_' + name, '@nc1_' + name, batteryDescriptor.InnerR))] self.ocv = [('OCV_' + name, OCV('@nc0_' + name, nNode, batteryDescriptor.OCVParameter, batteryDescriptor.InitialSOC, batteryDescriptor.Capacity, 'OCV_' + name, batteryDescriptor.OCVCallback))] if batteryDescriptor.BalanceResCallBack is not None: self.balanceR = customizedCurrentSource( pNode, nNode, batteryDescriptor.BalanceResCallBack)
def discharge(self, time, saveStatus=True): totalQuantity = 0 totalSOC = 0 f = open('dischargeData.txt', 'a') cct = eispice.Circuit("battery stimulator discharge") cct.batteries = self.bg.generateSpiceModel() #it will return a list contains connected batteries cct.load = eispice.R(self.bg.pNode, self.bg.nNode, self.load) # put the load on cct.tran('0.01n', '0.02n') #doing transient analysis for i in range(self.NumberOfCells * self.NumberOfStacks): self.bg[i].current = abs(cct.i['V' + str(i)]('0.01n')) * 1000 self.bg[i].quantity -= self.bg[i].current * time / 3600 self.bg[i].soc = self.bg[i].quantity / self.BATTERYCAPACITY totalQuantity += self.bg[i].quantity #print 'the total quantity is:',totalQuantity totalSOC = totalQuantity / (self.BATTERYCAPACITY * self.NumberOfCells * self.NumberOfStacks) self.clock += time f.write(str(self.clock) + '\t') f.write(str(totalSOC) + '\t') f.write('\n') f.close() if saveStatus: self.backup() # save current status self.updateInfo()
def generateSpiceModel(): spiceModel = [] Vsp = ('Vsp', eispice.V('V1+', eispice.GND, 3.65)) #eispice source model Rsp = ('Rsp', eispice.R('V1+', 'V2-', 0.0155)) #eispice resistance model Rb = ('Rb', eispice.R('V2-', eispice.GND, 240)) Vsp2 = ('Vsp2', eispice.V('V2-', 'V2+', 3.65)) Rsp2 = ('Rsp2', eispice.R('V2+', 'V3-', 0.0155)) Rb2 = ('Rb2', eispice.R('V2-', 'V3-', 240)) Vsp3 = ('Vsp3', eispice.V('V3-', 'V3+', 3.65)) Rsp3 = ('Rsp3', eispice.R('V3+', 'V4-', 0.0155)) Rb3 = ('Rb3', eispice.R('V3-', 'V4-', 240)) load = ('load', eispice.R('V4-', eispice.GND, 1000)) spiceModel.append(Vsp) spiceModel.append(Rsp) #set a signel battery spice model spiceModel.append(Rb) spiceModel.append(Vsp2) spiceModel.append(Rsp2) spiceModel.append(Rb2) spiceModel.append(Vsp3) spiceModel.append(Rsp3) spiceModel.append(Rb3) spiceModel.append(load) return spiceModel
def run(self): global eispice_finished cir = eispice.Circuit("Mixed Mode Test") ### here we do the analog circuit description ### cir.L = eispice.L(1, 0, 27e-9) cir.R = eispice.R(1, 0, 820) cir.C = eispice.C(1, 0, 47e-12) cir.Rout = eispice.R(2, 0, 100) ### now we define our two MyHDL ports ### cir.TriggerOut = EispicePort(1, 0, triggerout, eispice.Current) cir.DetectorOut = EispicePort(2, 0, detectorout, eispice.Voltage) ### starting the simulation ### cir.tran(myhdl_timestep, simulationlen) ### plotting the results ### eispice.plot(cir) print "Eispice Simulation finished" catchup.set() eispice_finished = 1
def chargeNdischarge(self,time,saveStatus = True ): cct = eispice.Circuit("battery stimulator charge") cct.batteries = self.bg.generateSpiceModel(); cct.source = eispice.I(self.bg.pNode,self.bg.nNode,self.source)# constant current charge source cct.load = eispice.R(self.bg.pNode,self.bg.nNode,self.load)# put the load on cct.tran('0.01n','0.02n')#doing transient analysis for i in range(self.NumberOfCells*self.NumberOfStacks): self.bg[i].current=cct.i['V'+str(i)]('0.01n')*1000 self.bg[i].quantity += self.bg[i].current * time /3600 print('current:{0}, quantity Gain:{1}'.format(self.bg[i].current,self.bg[i].qGain)) if saveStatus: self.backup() # save current status self.updateInfo()
def generateSpiceModel(self): self.spiceModel = [] #clear the spiceModel #setting up singel battery spice model for i in range( self.length - 1 ): # in order to set the last battery sepratedly we should have self.length-1 here Vsp = ('V' + str(i), eispice.V(self[i].pNode, self[i].nNode, self[i].voltage)) #eispice source model Rsp = ('iR' + str(i), eispice.R(self[i].nNode, self[i + 1].pNode, self[i].intR)) #eispice resistance model self.spiceModel.append(Vsp) self.spiceModel.append(Rsp) #set a signel battery spice model # set the spice model for the last battery Vsp = ('V' + str(self.length - 1), eispice.V(self[self.length - 1].pNode, self[self.length - 1].nNode, self[self.length - 1].voltage)) Rsp = ('iR' + str(self.length - 1), eispice.R(self[self.length - 1].nNode, self.nNode, self[self.length - 1].intR)) self.spiceModel.append(Vsp) self.spiceModel.append(Rsp) for b in self: if b.balanceRate != 0.0: Rsb = ('balance_' + b.name, eispice.R(b.pNode, b.intR, 1.0 * self.balanceResVal / b.balanceRate)) self.spiceModel.append(Rsb) for i in range(self.length): self.voltageList[i] = round(self[i].voltage, 3) return self.spiceModel
def NdischargeNCharge(self, time, saveStatus=True): #calculate the current cct = eispice.Circuit("battery stimulator not discharge not charge") cct.batteries = self.bg.generateSpiceModel() #it will return a list contains connected batteries cct.load = eispice.R(self.bg.pNode, self.bg.nNode, 10000000) cct.tran('0.01n', '0.02n') #doing transient analysis for i in range(self.NumberOfCells * self.NumberOfStacks): print cct.i['V' + str(i)]('0.01n') self.bg.current = self.bg.current + abs( cct.i['V' + str(i)]('0.01n')) print self.bg.current qLoss = self.bg.current * time for b in self.bg: b.quantity = b.quantity - qLoss print('current:{0}, quantity loss:{1}'.format(self.bg.current, qLoss))
def test_ibis(): """Extended eispice.Ibis Model Testing NOTE: Will only work on my development tree, these models are copyrighted and can not be distributed with eispice. CE """ # 29le010.ibs ibs = eispice.Ibis("../development/29le010.ibs") cct = eispice.Circuit('test_29le010') cct.Driver = ibs['17']('vs') cct.Tg = eispice.T('vs', 0, 'vo', 0, 75, '10n') cct.Receiver = ibs['2']('vo') cct.tran('0.1n', '5n') eispice.plot(cct) # 39wf800a.ibs ibs = eispice.Ibis("../development/39wf800a.ibs") cct = eispice.Circuit('test_39wf800a') cct.Driver = ibs['e2']('vs') cct.Tg = eispice.T('vs', 0, 'vo', 0, 100, '10n') cct.Receiver = ibs['a1']('vo') cct.tran('0.1n', '5n') eispice.plot(cct) # ad9222bcp.ibs ibs = eispice.Ibis("../development/ad9222bcp.ibs") cct = eispice.Circuit('test_ad9222bcp') cct.Driver = ibs['39']('vs') cct.Tg = eispice.T('vs', 0, 'vo', 0, 50, '10n') cct.Receiver = ibs['38']('vs') cct.tran('0.1n', '200n') eispice.plot(cct) # ad9289bbc.ibs ibs = eispice.Ibis("../development/ad9289bbc.ibs") cct = eispice.Circuit('test_ad9289bbc') cct.DriverP = ibs['b1']('vsp') cct.DriverN = ibs['b1']('vsn', direction=eispice.Falling) cct.Rl = eispice.R('vsp',0,50) cct.R2 = eispice.R('vsn',0,50) cct.tran('0.1n', '10n') eispice.plot(cct) # ahc1g14.ibs ibs = eispice.Ibis("../development/ahc1g14.ibs") cct = eispice.Circuit('test_ahc1g14') cct.Driver = ibs['4']('vx', modelName='ahc_xgouti_50') cct.Rl = eispice.R('vx','vs',33.2) cct.Tg = eispice.T('vs', 0, 'vo', 0, 50, '10n') cct.Receiver = ibs['2']('vs', modelName='ahc_xg14in_50') cct.tran('0.1n', '50n') eispice.plot(cct) # alvc00m_300.ibs ibs = eispice.Ibis("../development/alvc00m_300.ibs") cct = eispice.Circuit('test_alvc00m_300') cct.Driver = ibs['3']('vx') cct.Rl = eispice.R('vx','vs',33.2) cct.Tg = eispice.T('vs', 0, 'vo', 0, 50, '10n') cct.Receiver = ibs['1']('vs') cct.tran('0.1n', '50n') eispice.plot(cct) # au1000.ibs ibs = eispice.Ibis("../development/au1000.ibs") cct = eispice.Circuit('test_au1000') cct.Driver = ibs['A1']('vx') cct.Rl = eispice.R('vx','vs',33.2) cct.Tg = eispice.T('vs', 0, 'vo', 0, 50, '10n') cct.Receiver = ibs['A10']('vs') cct.tran('0.1n', '50n') eispice.plot(cct)
import eispice ibs = eispice.Ibis('test') cct = eispice.Circuit('IBIS Test') cct.Driver = ibs['2']('vs') cct.Rt = eispice.R('vs', 'vi', 33.2) cct.Tg = eispice.T('vi', 0, 'vo', 0, 50, '2n') cct.Receiver = ibs['1']('vo') cct.tran('0.01n', '20n') eispice.plot(cct)
import eispice cct = eispice.Circuit("battery stimulator not discharge not charge") cct.Vsource1 = eispice.V('V1+', eispice.GND, 3.65) cct.intR1 = eispice.R('V1+', 'intR1', 0.0155) cct.balanceR1 = eispice.R('intR1', eispice.GND, 240) cct.tran('0.01n', '0.02n') print 'current of Vsource1 is:', cct.i['Vsource1']('0.01n') #unit is A print 'voltage of V1+ is:', cct.v['V1+']('0.01n') #unit is V