foxBMS  1.6.0
The foxBMS Battery Management System API Documentation
ltc_6806_cfg.h
Go to the documentation of this file.
1 /**
2  *
3  * @copyright © 2010 - 2023, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V.
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright notice, this
12  * list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright notice,
15  * this list of conditions and the following disclaimer in the documentation
16  * and/or other materials provided with the distribution.
17  *
18  * 3. Neither the name of the copyright holder nor the names of its
19  * contributors may be used to endorse or promote products derived from
20  * this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  * We kindly request you to use one or more of the following phrases to refer to
34  * foxBMS in your hardware, software, documentation or advertising materials:
35  *
36  * - ″This product uses parts of foxBMS®″
37  * - ″This product includes parts of foxBMS®″
38  * - ″This product is derived from foxBMS®″
39  *
40  */
41 
42 /**
43  * @file ltc_6806_cfg.h
44  * @author foxBMS Team
45  * @date 2015-02-18 (date of creation)
46  * @updated 2023-10-12 (date of last update)
47  * @version v1.6.0
48  * @ingroup DRIVERS_CONFIGURATION
49  * @prefix LTC
50  *
51  * @brief Header for the configuration for the LTC 6806 monitoring IC
52  *
53  */
54 
55 #ifndef FOXBMS__LTC_6806_CFG_H_
56 #define FOXBMS__LTC_6806_CFG_H_
57 
58 /*========== Includes =======================================================*/
59 /* clang-format off */
60 #include "ltc_cfg.h"
61 /* clang-format on */
62 
63 #include "ltc_defs.h"
64 #include "battery_system_cfg.h"
65 
66 #include "ltc_afe_dma.h"
67 #include "spi.h"
68 
69 #include <stdint.h>
70 
71 /*========== Macros and Definitions =========================================*/
72 /**
73  * If set to 1 LTC driver is configured to use foxBMS slave boards version 1.x
74  * If set to 2 LTC driver is configured to use foxBMS slave boards version 2.x
75  */
76 #define SLAVE_BOARD_VERSION (2)
77 
78 /**
79  * If set to 0 LTC driver is configured to use PCA8574 port expander
80  * If set to 1 LTC driver is configured to use TCA6408A port expander
81  */
82 #define LTC_PORTEXPANDER_VERSION (1)
83 
84 /**
85  * @def LTC_6806_MAX_SUPPORTED_CELLS
86  * @brief Defines the maximal number of supported cells per module
87  */
88 #define LTC_6806_MAX_SUPPORTED_CELLS (36u)
89 
90 #if BS_NR_OF_CELL_BLOCKS_PER_MODULE > LTC_6806_MAX_SUPPORTED_CELLS
91 #error "Number of cell blocks per module cannot be higher than maximum number of cells per module"
92 #endif
93 
94 /**
95  * Address of TI port expander (0 or 1)
96  */
97 #define LTC_PORTEXPANDER_ADR_TI (0)
98 
99 /** Controls if PEC should be discarded (true) or not (false) */
100 #define LTC_DISCARD_PEC (false)
101 
102 /** Number of multiplexer used per LTC-IC */
103 #define LTC_N_MUX_PER_LTC (3)
104 
105 /** Number of channels per multiplexer */
106 #define LTC_N_MUX_CHANNELS_PER_MUX (8)
107 
108 /** Number of multiplexer measurements per LTC cycle */
109 #define LTC_NUMBER_OF_MUX_MEASUREMENTS_PER_CYCLE (8)
110 
111 /** Number of multiplexed channels per LTC-IC */
112 #define LTC_N_MUX_CHANNELS_PER_LTC (LTC_N_MUX_PER_LTC * LTC_N_MUX_CHANNELS_PER_MUX)
113 
114 /** Number of LTC-ICs per battery module */
115 #define LTC_NUMBER_OF_LTC_PER_MODULE (1u)
116 
117 /**
118  * Voltage measurement range for fuel cells
119  * LSB = 1.5 mV if HIRNG = 0u
120  * LSB = 3.0 mV if HIRNG = 1u
121  */
122 #define LTC_HIRNG (0u)
123 
124 /** Open-wire voltage measurement time for fuel cells */
125 #define LTC_FUEL_CELL_ADOW_TIME_MS (100u + 1u)
126 
127 /** Open-wire detection threshold */
128 #define LTC_ADOW_THRESHOLD (-200)
129 
130 /**
131  * Measurement modus for voltages, possible values:
132  * - LTC_ADCMODE_NORMAL_DCP0
133  * - LTC_ADCMODE_FILTERED_DCP0
134  * - LTC_ADCMODE_FAST_DCP0
135  */
136 #define LTC_VOLTAGE_MEASUREMENT_MODE (LTC_ADCMODE_NORMAL_DCP0)
137 
138 /**
139  * Measurement modus for GPIOs, possible values:
140  * - LTC_ADCMODE_NORMAL_DCP0
141  * - LTC_ADCMODE_FILTERED_DCP0
142  * - LTC_ADCMODE_FAST_DCP0
143  */
144 #define LTC_GPIO_MEASUREMENT_MODE (LTC_ADCMODE_NORMAL_DCP0)
145 
146 /**
147  * Measurement modus for Open-wire check, possible values:
148  * - LTC_ADCMODE_NORMAL_DCP0
149  * - LTC_ADCMODE_FILTERED_DCP0
150  */
151 #define LTC_OW_MEASUREMENT_MODE (LTC_ADCMODE_NORMAL_DCP0)
152 
153 /**
154  * Timeout in milliseconds added to the transmission time for interrupt-based
155  * SPI transmission.
156  */
157 #define LTC_TRANSMISSION_TIMEOUT (10)
158 
159 /**
160  * SPI1 is used for communication with LTC
161  * @{
162  */
163 #define LTC_SPI_HANDLE &spi_devices[0]
164 #define LTC_SPI_INSTANCE *LTC_SPI_HANDLE.Instance
165 #define LTC_SPI_PRESCALER *LTC_SPI_HANDLE.Init.BaudRatePrescaler
166 /**@}*/
167 
168 /** start definition of LTC timings; Twake (see LTC data sheet) */
169 #define LTC_TWAKE_US (300)
170 /** start definition of LTC timings; Tready (see LTC data sheet) */
171 #define LTC_TREADY_US (10)
172 /** start definition of LTC timings; Tidle (see LTC data sheet) */
173 #define LTC_TIDLE_US (6700)
174 
175 /** LTC SPI wakeup time */
176 #define LTC_SPI_WAKEUP_WAIT_TIME_US (30u)
177 
178 /** Time to measure all fuel cells in normal mode 10280 &micro;s */
179 #define LTC_FUELCELL_NORMAL_ALL_CELLS_MS (11)
180 
181 /** LTC state machine short time definition in ms */
182 #define LTC_STATEMACH_SHORTTIME (1)
183 
184 /**
185  * time for the first initialization of the daisy chain
186  * see LTC6804 data sheet page 41
187  */
188 #define LTC_STATEMACH_DAISY_CHAIN_FIRST_INITIALIZATION_TIME ((LTC_TWAKE_US * LTC_N_LTC) / 1000)
189 /**
190  * time for the second initialization of the daisy chain
191  * see LTC6804 data sheet page 41
192  */
193 #define LTC_STATEMACH_DAISY_CHAIN_SECOND_INITIALIZATION_TIME ((LTC_TREADY_US * LTC_N_LTC) / 1000)
194 
195 /*
196  * Timings of Voltage Cell and GPIO measurement for all cells or all GPIO
197  */
198 
199 /**
200  * ~1.1ms Measurement+Calibration Cycle Time When Starting from the REFUP State in Fast Mode
201  * unit: ms
202  */
203 #define LTC_STATEMACH_MEAS_ALL_FAST_TCYCLE (2)
204 
205 /**
206  * ~2.3ms Measurement+Calibration Cycle Time When Starting from the REFUP State in Normal Mode
207  * unit: ms
208  */
209 #define LTC_STATEMACH_MEAS_ALL_NORMAL_TCYCLE (3)
210 
211 /**
212  * ~201ms Measurement+Calibration Cycle Time When Starting from the REFUP State in Filtered Mode
213  * unit: ms
214  */
215 #define LTC_STATEMACH_MEAS_ALL_FILTERED_TCYCLE (202)
216 
217 /*
218  * Timings of Voltage Cell and GPIO measurement for a pair of cells or a single GPIO
219  */
220 
221 /**
222  * ~0.201ms Measurement+Calibration Cycle Time When Starting from the REFUP State in Fast Mode
223  * unit: ms
224  */
225 #define LTC_STATEMACH_MEAS_SINGLE_FAST_TCYCLE (1)
226 
227 /**
228  * ~0.405ms Measurement+Calibration Cycle Time When Starting from the REFUP State in Normal Mode
229  * unit: ms
230  */
231 #define LTC_STATEMACH_MEAS_SINGLE_NORMAL_TCYCLE (1)
232 
233 /**
234  * ~34 ms Measurement+Calibration Cycle Time When Starting from the REFUP State in Filtered Mode
235  * unit: ms
236  */
237 #define LTC_STATEMACH_MEAS_SINGLE_FILTERED_TCYCLE (35)
238 
239 /** LTC state machine sequence error timing in ms */
240 #define LTC_STATEMACH_SEQERRTTIME (5)
241 /** LTC state machine CRC-transmission error timing in ms */
242 #define LTC_STATEMACH_PECERRTIME (1)
243 
244 /**
245  * Maximum number of re-tries in case of CRC error during the communication with daisy chain
246  * before going into error state
247  */
248 #define LTC_TRANSMIT_PECERRLIMIT (10)
249 
250 /**
251  * Maximum number of re-tries in case of SPI error during the communication with daisy chain
252  * before going into error state
253  */
254 #define LTC_TRANSMIT_SPIERRLIMIT (3)
255 
256 /** If set to 1, check if multiplexers acknowledged transmission */
257 #define LTC_READCOM (0)
258 
259 /**
260  * Number of required ADOW commands because of external C-Pin capacitance and
261  * the respective duration to perform an open wire check for 14 modules with
262  * 12 cells each. During this time no cell voltages and temperatures are measured!
263  * +----------------+--------------+---------------+----------+----------+
264  * | External C pin | Normal mode | Filtered mode | Duration | Duration |
265  * | capacitance | | | normal | filtered |
266  * | ---------------+--------------+---------------+----------+----------+
267  * | <= 10nF | 2 | 2 | 32ms | 828ms |
268  * | 100nF | 10 | 2 | 112ms | 828ms |
269  * | 1uF | 100 | 2 | 1012ms | 828ms |
270  * | C | 1.5+(C/10nF) | 2 | | |
271  * +----------------+--------------+---------------+----------+----------+
272  */
273 #define LTC_NMBR_REQ_ADOW_COMMANDS (2)
274 
275 /**
276  * Transmit functions
277  * @{
278  */
279 #define LTC_TRANSMIT_WAKE_UP(spi_ltcInterface) SPI_TransmitDummyByte(spi_ltcInterface, LTC_SPI_WAKEUP_WAIT_TIME_US)
280 #define LTC_TRANSMIT_I2C_COMMAND(spi_ltcInterface, txbuf) \
281  SPI_TransmitDummyByte(spi_ltcInterface, LTC_SPI_WAKEUP_WAIT_TIME_US); \
282  SPI_TransmitData(spi_ltcInterface, txbuf, 4 + 9)
283 #define LTC_TRANSMIT_COMMAND(spi_ltcInterface, command) \
284  SPI_TransmitDummyByte(spi_ltcInterface, LTC_SPI_WAKEUP_WAIT_TIME_US); \
285  SPI_TransmitData(spi_ltcInterface, command, 4)
286 #define LTC_TRANSMIT_RECEIVE_DATA(spi_ltcInterface, txbuf, rxbuf, length) \
287  SPI_TransmitDummyByte(spi_ltcInterface, LTC_SPI_WAKEUP_WAIT_TIME_US); \
288  SPI_TransmitReceiveDataDma(spi_ltcInterface, txbuf, rxbuf, length)
289 /**@}*/
290 
291 /*========== Extern Constant and Variable Declarations ======================*/
292 
293 /**
294  * On the foxBMS slave board there are 6 multiplexer inputs dedicated to temperature
295  * sensors by default.
296  * Lookup table between temperature sensors and battery cells
297  */
299 
300 /** Lookup table to indicate which voltage inputs are used */
302 
303 /*========== Extern Function Prototypes =====================================*/
304 
305 /**
306  * @brief converts a raw voltage from multiplexer to a temperature value in
307  * deci &deg;C.
308  * @details The temperatures are read from NTC elements via voltage dividers.
309  * This function implements the look-up table between voltage and
310  * temperature, taking into account the NTC characteristics and the
311  * voltage divider.
312  * @param adcVoltage_mV voltage read from the multiplexer in mV
313  * @return temperature value in deci &deg;C
314  */
315 extern int16_t LTC_ConvertMuxVoltagesToTemperatures(uint16_t adcVoltage_mV);
316 
317 /*========== Externalized Static Functions Prototypes (Unit Test) ===========*/
318 #ifdef UNITY_UNIT_TEST
319 #endif
320 
321 #endif /* FOXBMS__LTC_6806_CFG_H_ */
Configuration of the battery system (e.g., number of battery modules, battery cells,...
#define BS_NR_OF_TEMP_SENSORS_PER_MODULE
number of temperature sensors per battery module
const uint8_t ltc_muxsensortemperatur_cfg[BS_NR_OF_TEMP_SENSORS_PER_MODULE]
#define LTC_6806_MAX_SUPPORTED_CELLS
Defines the maximal number of supported cells per module.
Definition: ltc_6806_cfg.h:88
const uint8_t ltc_voltage_input_used[LTC_6806_MAX_SUPPORTED_CELLS]
Definition: ltc_6806_cfg.c:66
int16_t LTC_ConvertMuxVoltagesToTemperatures(uint16_t adcVoltage_mV)
converts a raw voltage from multiplexer to a temperature value in deci °C.
Headers for the driver for the DMA module for the LTC.
Headers for the configuration for the LTC analog front-end.
Headers for the driver for the LTC analog front-end.
Headers for the driver for the SPI module.