-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathKlausBMS_config.h
209 lines (160 loc) · 6.53 KB
/
KlausBMS_config.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/**
* ==========================================================================
* Klaus' Twizy LiFEPO4 (LFP) BMS: Configuration
* ==========================================================================
*/
#ifndef _KlausBMS_config_h
#define _KlausBMS_config_h
// Personalization:
#define KLAUS_BMS_NAME "KlausBMS"
// Serial baud rate:
// (Arduino supports up to 2 Mbit, but cannot send faster than 1 Mbit)
#define SERIAL_BAUD 1000000
// Bluetooth baud rate:
// (i.e. 57600 / 38400 / 19200 / 9600, Default of HC-05/06 is 9600)
#define BT_BAUD 57600
// Input calibration mode (inhibits normal operation):
#define CALIBRATION_MODE 1
// Note: calibration mode will still allow VirtualBMS state transitions.
// You can drive & charge in calibration mode, but no sensor data
// will be used to update the Twizy SOC & power status. So if you charge
// or drive in calibration mode, you need to monitor your voltages!
// Optional / development features:
#define FEATURE_CMD_ES 0
// --------------------------------------------------------------------------
// PORTS
// --------------------------------------------------------------------------
// Analog input port assignment:
#define PORT_VOLT A0 // cell voltage MUX
#define PORT_TEMP_F A1 // temperature sensor front
#define PORT_TEMP_R A2 // temperature sensor rear
#define PORT_CURR A3 // pack current (comment out to disable)
// MUX address pins:
#define PORT_MUX_S0 4
#define PORT_MUX_S1 5
#define PORT_MUX_S2 6
#define PORT_MUX_S3 7
// --------------------------------------------------------------------------
// OPERATION
// --------------------------------------------------------------------------
// Maximum charge current to use [A] (5…35)
// …at 20 °C and higher:
#define MAX_CHARGE_CURRENT 35
// …at 0 °C:
#define MAX_CHARGE_CURRENT_0C 20
// Charge current → power drawn from socket:
// 35 A = 2,2 kW
// 30 A = 2,1 kW
// 25 A = 1,7 kW
// 20 A = 1,4 kW
// 15 A = 1,0 kW
// 10 A = 0,7 kW
// 5 A = 0,4 kW
// Maximum driving & recuperation power limits to use [W] (500…30000)
// …at 20 °C and higher:
#define MAX_DRIVE_POWER 25000
#define MAX_RECUP_POWER 12500
// …at 0 °C:
#define MAX_DRIVE_POWER_0C 16000
#define MAX_RECUP_POWER_0C 6000
// Drive power cutback [%]:
// (100% at FULL → 100% at <SOC1>% → <LVL2>% at <SOC2>% → 0% at EMPTY)
#define DRV_CUTBACK_SOC1 50
#define DRV_CUTBACK_SOC2 25
#define DRV_CUTBACK_LVL2 70
// Charge power cutback by SOC [%]:
// (100% at EMPTY → 100% at <SOC>% → 0% at FULL)
#define CHG_CUTBACK_SOC 90
// Charge power cutback by charger temperature [°C]:
#define CHG_CUTBACK_TEMP 50
#define CHG_CUTBACK_TEMPMAX 65
// --------------------------------------------------------------------------
// VOLTAGE
// --------------------------------------------------------------------------
// Number of cells (max 16):
#define CELL_COUNT 16
// Voltage range for discharging [V]:
#define VMIN_DRV 2.90
#define VMAX_DRV 3.35
// Voltage range for charging [V]:
#define VMIN_CHG 2.90
#define VMAX_CHG 3.65
// Voltage smoothing [100ms samples] (min 1 = no smoothing):
#define SMOOTH_VOLT 20
// Port scaling utils:
#define VPORT 5.0 / 1024.0
#define VDIV(R1,R2) (R1+R2) / R2
// Voltage divider analog input scaling:
// - scale = R_sum / R_probe * calibration
// - first cell is connected directly
const float SCALE_VOLT[CELL_COUNT] = {
VPORT * 1.00000 // 3.2 V
, VPORT * VDIV( 27, 47) * 1.00000 // 6.4 V
, VPORT * VDIV( 68, 47) * 1.00000 // 9.6 V
, VPORT * VDIV(100, 47) * 1.00000 // 12.8 V
, VPORT * VDIV(150, 47) * 1.00000 // 16.0 V
, VPORT * VDIV(180, 47) * 1.00000 // 19.2 V
, VPORT * VDIV(220, 47) * 1.00000 // 22.4 V
, VPORT * VDIV(270, 47) * 1.00000 // 25.6 V
, VPORT * VDIV(330, 47) * 1.00000 // 28.8 V
, VPORT * VDIV(330, 47) * 1.00000 // 32.0 V
, VPORT * VDIV(390, 47) * 1.00000 // 35.2 V
, VPORT * VDIV(390, 47) * 1.00000 // 38.4 V
, VPORT * VDIV(470, 47) * 1.00000 // 41.6 V
, VPORT * VDIV(470, 47) * 1.00000 // 44.8 V
, VPORT * VDIV(560, 47) * 1.00000 // 48.0 V
, VPORT * VDIV(560, 47) * 1.00000 // 51.2 V
};
// Voltage warning/error thresholds [V]:
// (Note: resolution of cell #16 is ~ 80 mV)
#define VOLT_DIFF_WARN 0.3
#define VOLT_DIFF_ERROR 0.6
#define VOLT_DIFF_SHUTDOWN 1.0
// SOC smoothing [1s samples] (min 1 = no smoothing):
#define SMOOTH_SOC_DOWN 60 // adaption to lower voltage
#define SMOOTH_SOC_UP_DRV 30 // adaption to higher voltage while driving
#define SMOOTH_SOC_UP_CHG 10 // adaption to higher voltage while charging
// --------------------------------------------------------------------------
// CURRENT & CAPACITY
// --------------------------------------------------------------------------
// Current analog input scaling:
// LEM HAC-600-S: -600 … +600 A → 0.072 … 4.002 V
//#define SCALE_CURR (1200.0 / (4.002 - 0.072))
//#define BASE_CURR (-600.0 - 0.072 * SCALE_CURR)
// Tamura L06P400S05: -400 … +400 A → 1.0 … 4.0 V
#define SCALE_CURR (800.0 / (4.0 - 1.0))
#define BASE_CURR (-400.0 - 1.0 * SCALE_CURR)
// If you need to reverse polarity, change to -1:
#define CURR_POLARITY_DRV 1
#define CURR_POLARITY_CHG 1
// Battery capacity:
#define CAP_NOMINAL_AH 120
// Capacity adjustment smoothing (min 100 = fastest adaption):
#define SMOOTH_CAP 200
// --------------------------------------------------------------------------
// HYBRID SOC
// --------------------------------------------------------------------------
// Prioritize voltage based SOC [%]:
#define SOC_VOLT_PRIO_ABOVE 90
#define SOC_VOLT_PRIO_BELOW 20
// Degrade coulomb based SOC [%]:
#define SOC_COUL_DEGR_ABOVE 90
#define SOC_COUL_DEGR_BELOW 20
// --------------------------------------------------------------------------
// TEMPERATURE
// --------------------------------------------------------------------------
// Temperature analog input scaling:
// LM35D: +2 .. +100°, 10 mV / °C => 100 °C = 1.0 V
#define SCALE_TEMP (100.0 / 1.0)
#define BASE_TEMP (+2.0)
// Temperature smoothing [samples]:
#define SMOOTH_TEMP 30
// Temperature warning/error thresholds [°C]:
#define TEMP_WARN 40
#define TEMP_ERROR 45
#define TEMP_SHUTDOWN 50
// Temperature front/rear difference warning/error thresholds [°C]:
#define TEMP_DIFF_WARN 3
#define TEMP_DIFF_ERROR 5
#define TEMP_DIFF_SHUTDOWN 10
#endif // _KlausBMS_config_h