Show Quoted Text
LTspice group had a very active session on this.
the following is from
"sgtwookieusmc" Date: Mon, November 8, 2010 8:10 am
V2.0 Helmut Sennewald 02/22/04
*
Modified from NiMH.lib to simulate sealed lead-acid batteries; SgtWookie 11/3/2010
*
*------------------------
*
*1 CELLS Number of cells in the battery; 2 =3D 4.2v, 3=3D6.35v, 6=3D12.8v= , etc.
VCELL nominal cell voltage in volts, e.g. 2.133
CAPAH cell capacity in Ah(ampere*hours), e.g. 7.2
R_SER series resistance in Ohms, e.g 0.2
SOC state of charge (0..1, .9=3Ddischarged, .95=3D50%, 1=3Dfull)
CHEFF charging effeciency, e.g 0.7 means you need 1/0.7 times the
ampere*hours to charge fully
SELFDC self discharge per hour, e.g. 0.000042 if 3%/per month
TEMPC Battery internal temperature in =B0C; e.g. 25 =3D 25=B0C
*
I started with an old article from S.C.Hageman about a SPICE model for
NIMH batteries. It's the model "NIMH" - PSpice Nickel-Metal-Hydride
battery discharge simulator. Optimized for 4/5A and AA Standard Cells
and discharge rates from 0C to 5C. It's for discharge only.
First I did some little changes on this discharge model.
Later, I started with further development to include a charging model
for he battery too. The result is the new model NIMH_AA.
+-------+----------- +/- Cell connections (Floating)
*
*
.SUBCKT Batt_SLA Ext+ Ext-
.PARAM CELLS=3D6 .PARAM VCELL=3D2.133 .PARAM CAPAH=3D7.2 .PARAM R_SER=3D20m .PARAM SOC=3D1 .PARAM CHEFF=3D0.75 .PARAM SELFDC=3D0.000042 .PARAM TEMPC=3D25
.IC V(Charge)=3D{SOC} .NODESET V(Charge)=3D{SOC*CELLS* VCELL} .PARAM R_DIS=3D{VCELL*CELLS/(SELFDC*CAPAH)}
R_Cell Ext+ Cell+ {R_SER} V_Sense Ext- Cell- 0 R_dis Cell+ Cell- {R_DIS}
Charge to voltage translation with E-TABLE
The last table entry (1.1 -10) together with the clamped reverse voltage(D2)
defines the battery voltage in reverse mode. If this entry is omitted,
then the battery will clamp to zero volts.
*
Following table is a rough approximation of a lead-acid battery E_Cell Cell+ Cell- TABLE { V(SODC) } =3D
(0.0000 {{1.0000*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.0750 {{0.9899*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.1500 {{0.9797*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.2250 {{0.9695*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.3000 {{0.9594*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.3750 {{0.9492*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.4500 {{0.9391*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.5250 {{0.9289*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.6000 {{0.9188*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.6750 {{0.9086*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.7500 {{0.8985*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.8250 {{0.8203*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.8310 {{0.8000*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.8510 {{0.7417*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.9080 {{0.6133*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.9480 {{0.5047*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.9800 {{0.3180*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.9900 {{0.1109*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.9950 {{0.0000*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.9960 {{0.0000*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.9970 {{0.0000*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.9980 {{0.0000*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(0.9990 {{0.0000*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(1.0000 {{0.0000*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
(1.1000 {{-10.0000*CELLS* VCELL}-{{TEMP-25}*0.003* CELLS}})
Original NiMH table below
*+(0.0 1.3346) (0.0293 1.3042)(0.0426 1.2942) (0.0689 1.2841)
* +(0.13 1.2733) (0.436 1.2633) (0.512 1.2532) (0.580 1.2432)
*+(0.646 1.2331) (0.702 1.2231) (0.7583 1.2130)(8.0324E-01 1.2030)
* +(0.831 1.1929) (0.851 1.1828) (0.908 1.1425) (0.948 1.0919)
*+(0.980 0.987) (0.99 0.9352) (0.995 0.8272) (0.996 0.741)
* +(0.997 0.647)(0.998 0.514) (0.999 0.33) (1.0000 0.0) (1.1 -10)
Actual rate of discharge by external load.
E.g. 0.2 means a full battery would last 5hours(=3D1/0.2). E_Rate N001 0 VALUE =3D { IF( (I(V_sense)>0 & V(Cell+,Cell-)>0),
I(V_Sense)/CAPAH, CHEFF*I(V_Sense)/CAPAH ) } R2 N001 Rate_d 1 C1 Rate_d 0 1
State of charge is actually just a 1 to 1 transform of "Charge" E_Rate1 Soc 0 TABLE { V(Charge) } =3D (-1,-1) (1,1)
Higher capacity for discharge current below 0.2*C E_LowRate LowRate 0 TABLE { V(Rate_d) } =3D (0,0) (0.001,0.15) (0.1,0.1) (0.2,0) R3 LowRate 0 1G G_LowRate 0 Charge VALUE =3D { IF( (I(V_sense)>0 & V(Cell+,Cell-))>0,
V(LowRate)*I(V_Sense), 0) }
Lower capacity for discharge current above 0.2*C E_LostRate LostRate 0 TABLE { V(Rate_d) } =3D (0.2,0.0) (1.0,0.1) (5,0.2) R5 LostRate 0 1G G_HighRate Charge 0 VALUE =3D { IF( I(V_sense)>0 & V(Cell+,Cell-)>0,
V(LostRate)*I(V_Sense), 0) }
Overcharge and discharge clamped with diodes C_CellCapacity Charge 0 { 3600 * CAPAH * {TABLE (TEMP,
+-99, 0.2,
+-20, 0.46,
+-15, 0.56,
+-10, 0.66,
+-5 , 0.71,
+0 , 0.76,
+5 , 0.83,
+10 , 0.90,
+15 , 0.95,
+20 , 0.98,
+25 , 1.00,
+30 , 1.03,
+35 , 1.05,
+40 , 1.07,
+45 , 1.09,
+99 , 1.10)}}
R1 Charge 0 1MEG V2 N003 0 0.993 D1 Charge N003 DFULL D2 0 Charge DREV G_DisCharge Charge 0 VALUE =3D { IF( I(V_Sense)>0 ^ (V(Cell+,Cell-)