1. Configuration
foxBMS 2 is an embedded system and some parts of the code are near to the hardware level. The code relies on a Hardware Abstraction Layer (HAL), which is a set of functions and definitions acting as an interface between the application and the underlying hardware. The HAL must be configured to fit the application and the hardware the software is running on (e.g., configure IO pins for communication with the outside world). This configuration is done with software called TI HALCoGen. This is described in TI HALCoGen.
Another point is that foxBMS 2 is a development platform. As such, many parts of the code must be configured to fit the target application (e.g., which monitoring IC is used to monitor the battery cells). This is explained in BMS Application.
1.1. TI HALCoGen
TI HALCoGen is a graphical user interface used to configure the HAL sources.
It generates sources in the form of .h, .c and .asm files.
These HAL sources are generated based on the TI HALCoGen configuration files
(*.hcg and *.dil).
The respective configuration files are found
for the application at:
conf/hcg/app.hcgconf/hcg/app.dil
for the bootloader at:
conf/hcg/bootloader.hcgconf/hcg/bootloader.dil
foxBMS 2 uses the Waf tool waf_tools.hcg to automatically run TI HALCoGen and create the required sources. Additional information on the tool can be found in TI HALCoGen Tool.
Note
In some cases it might be beneficial to not generate the HAL during the build step and instead use a generated version of the HAL. For this use case see How to Use Generated Sources from HALCoGen.
TI HALCoGen ships with its own version of FreeRTOS and generates the corresponding sources when running the code generator. As foxBMS 2 uses its own copy of FreeRTOS, the generated FreeRTOS files from TI HALCoGen are removed after the code generator has run.
Furthermore, generated sources listed in conf/hcg/app-remove.yml
(application) and conf/hcg/bootloader-remove.yml (bootloader) are removed
by the build integration.
The startup source check uses target-specific hash files:
src/app/hal/app-startup.hashfor the application buildsrc/bootloader/hal/bootloader-startup.hashfor the bootloader build
1.1.1. Enabling Cache
The TI TMS570LC4357 can use cache to improve performance.
From foxBMS 2 v1.3.0 to v1.11.0, cache is enabled by setting the define
OS_ENABLE_CACHEinsrc/app/task/os/os.htotrue. In newer versions than v1.11.0, cache is enabled by settingmcu:↳use-cache:totrueinconf/bms/bms.json. Therefore, the configuration setting in HALCoGen is ignored. However, as the startup code generated inHL_sys_startup.cby TI HALCoGen does still change (the line to activate cache is added), consequently the hash insrc/app/hal/app-startup.hashstill needs to be updated, but no further changes need to be applied. The process to enable cache is then as follows:Enable cache by applying the cache setting dependent on the foxBMS 2 version.
Update the file hash in
src/app/hal/app-startup.hash
Before foxBMS 2 v1.3.0, enabling cache relied on the TI HALCoGen configuration and that this setting altered the startup code in
HL_sys_startup.c. The cache enable setting is found at settingTMS570LC4357ZWT_FREERTOS, sub-settingR5-MPU-PMUand then the configurationCortex-R5, sub-configurationGeneral Configuration: Enable Cache. The process to enable cache is then as follows:Enable cache in TI HALCoGen
Update the startup code in
fstartup.cwith the changes fromHL_sys_startup.c.Update the file hash in
src/app/hal/app-startup.hash
1.2. BMS Application
The project provides two very basic configuration options:
general options in
conf/bms/bms.json. This file is case-sensitive and all settings need to be in lower-case.
Furthermore, the used battery cells and the general configuration of the battery system that is built up need to be defined:
for the used battery cell:
conf/bms/battery_cell_cfg.json
for the top level view on the battery system:
conf/bms/battery_system_cfg.json
However, the actual behavior of the battery system in the target application is
highly dependent on the target application and can therefore not simply be
configured through some switches.
This needs to be implemented in e.g., the BMS_Trigger() function.
It is up to the developer to familiarize with the hardware, code and
documentation and adapt the source code to the application-specific
requirements.
1.2.1. General Options
Some BMS configurations require compiling different sources. That applies to the operating system and the Analog Front-End.
Note
Only very basic configurations can be changed via these options described here. Again, everything not mentioned here must still be configured by programming the application behavior in the source code.
The main keys
application,bms-slave,debug(optional), andrtos.
are described in the following subsections.
1.2.1.1. application
1.2.1.1.1. application:↳algorithm
The algorithms key requires one key: state-estimation.
Supported settings:
application:↳algorithm:↳state-estimation:↳soc:"counting","debug", ornullto disable the SOC algorithmapplication:↳algorithm:↳state-estimation:↳soe:"counting","debug", ornullto disable the SOE algorithmapplication:↳algorithm:↳state-estimation:↳sof:"trapezoid"application:↳algorithm:↳state-estimation:↳soh:"debug", ornullto disable the SOH algorithm
1.2.1.1.2. application:↳balancing-strategy
Supported settings:
"voltage": Voltage-based balancing: Cell balancing based on voltage differences. Details are found in Voltage-based Balancing"history": History-based balancing: Cell balancing based on voltage history. Details are found in History-based Balancingnull: No balancing of any cell. Details are found in No Balancing
1.2.1.1.3. application:↳current-sensor
Currently only CAN-based current sensors are supported.
The manufacturer, model and the type of connection of the Insulation Monitoring Device must be provided:
application:↳current-sensor:↳type: must be"can"application:↳current-sensor:↳manufacturerapplication:↳current-sensor:↳model
Supported devices:
isabellenhuette:ivt-slem:cab500
1.2.1.1.4. application:↳insulation-monitoring-device
In case no Insulation Monitoring Device is used, the entire key
application:↳insulation-monitoring-device
needs to be removed.
The manufacturer, model and the type of connection of the Insulation Monitoring Device must be provided:
application:↳insulation-monitoring-device:↳type(eithercanorpwm)application:↳insulation-monitoring-device:↳manufacturerapplication:↳insulation-monitoring-device:↳model
Supported devices:
bender:ir155,iso165c
Developer notes:
The joint path from the values of
manufacturerandmodelmust be the name of the source directory insrc/app/driver/imd/<manufacturer>/<model>that includes the driver implementation.Every Insulation Monitoring Device needs to provide its include directories via a Waf target named
{ip}imd-<manufacturer>_<model>usingexport_includesin the correspondingwscriptfile atsrc/app/driver/imd/<manufacturer>/<model>/wscript.
1.2.1.2. bms-slave
bms-slave requires defining analog-front-end and
temperature-sensor.
analog-front-end: The manufacturer and the IC must be provided. Valid settings are:adiades1830
debugcandefault
ltc6804-168066811-16812-16813-1
maxim:max17852
nxpmc33775a
sttidummy
temperature-sensor: The manufacturer, model and the evaluation method of the temperature sensor must be provided.
The list of supported ICs is also found in Section 4.19.3.1.
Developer notes:
The joint path from the values of
manufacturerandicmust be the name of the source directory insrc/app/driver/afe/<manufacturer>/<ic>that includes the driver implementation.Every AFE needs to provide its include directories via a Waf target named
{ip}afe-<manufacturer>_<ic>usingexport_includesin the correspondingwscriptfile atsrc/app/driver/afe/<manufacturer>/<ic>/wscript.The build process behind this configuration is documented at Building the Analog Front-End Library.
1.2.1.3. debug
Some features are only useful when debugging, and should not be enabled in the
final application build.
UART can be added as a debug interface as follows
(debug:↳interfaces:↳["uart"]).
1.2.1.4. rtos
The RTOS name must be defined in rtos:↳name:"<name>", where <name> is
the name of desired operating system.
Currently only FreeRTOS is supported (rtos:↳name:"freertos").
FreeRTOS supports TCP/IP when the following TCP/IP addon is
enabled by adding freertos-plus-tcp to the addon list
(rtos:↳addons:↳["freertos-plus-tcp"]).
Developer notes:
The name must correspond to the directory in source tree where the RTOS sources are (e.g., for
freertosit needs to be atsrc/os/freertos)The value for
osmust be the name of the source directory insrc/os/that includes the operating system sources.Every RTOS needs to provide its include directories via a Waf target named
{ip}rtos-<kernel|tcp>usingexport_includesin the correspondingwscriptfile atsrc/os/freertos/<name>/wscript.
1.2.2. Compiler and Linker Options and Remarks
The details of the project compiler configuration are described in Compiler Configuration.
1.2.3. Basic Battery Cell And System Configuration
1.2.3.1. Battery Cell Configuration
The basic parameters of the used battery cell of the battery system are defined in:
conf/bms/battery_cell_cfg.json
The following parameters need to be defined (the links lead to the doxygen
documentation for the explanation of the specific parameter) in
conf/bms/battery_cell_cfg.json:
Setting |
Details (define name) |
|---|---|
Maximum discharge temperature MSL |
|
Maximum discharge temperature RSL |
|
Maximum discharge temperature MOL |
|
Minimum discharge temperature MSL |
|
Minimum discharge temperature RSL |
|
Minimum discharge temperature MOL |
|
Maximum temperature limit during charge MSL |
|
Maximum temperature limit during charge RSL |
|
Maximum temperature limit during charge MOL |
|
Minimum temperature limit during discharge MSL |
|
Minimum temperature limit during discharge RSL |
|
Minimum temperature limit during discharge MOL |
|
Maximum cell voltage limit MSL |
|
Maximum cell voltage limit RSL |
|
Maximum cell voltage limit MOL |
|
Nominal cell voltage |
|
Minimum cell voltage limit MSL |
|
Minimum cell voltage limit RSL |
|
Minimum cell voltage limit MOL |
|
Maximum discharge current limit MSL |
|
Maximum discharge current limit RSL |
|
Maximum discharge current limit MOL |
|
Maximum charge current limit MSL |
|
Maximum charge current limit RSL |
|
Maximum charge current limit MOL |
|
Cell capacity used for SOC calculation |
|
Cell energy |
|
The state of charge lookup table bc_stateOfChargeLookupTable is defined in
conf/bms/battery_cell_soc_lookup-table.csv and
the state of energy lookup table bc_stateOfEnergyLookupTable is defined in
conf/bms/battery_cell_soe_lookup-table.csv.
1.2.3.2. Battery System Configuration
The basic, top level view on the battery system configuration is defined at:
conf/bms/battery_system_cfg.jsonsrc/app/application/config/bms-slave_cfg.h
Setting |
Details (define name) |
|---|---|
Defines whether discharge current is seen as positive or negative |
|
Number of parallel strings in the battery pack |
|
Number of modules in a string |
|
Number of cells per module |
|
Number of battery cells in a parallel cell connection per battery module |
|
Number of temperature sensors per battery module |
|
Delay in ms after which it is considered the current measurement is not responding anymore |
|
Delay in ms after which it is considered the coulomb counting is not responding anymore |
|
Delay in ms after which it is considered the energy counting is not responding anymore |
|
Maximum break current of main contactors |
|
Maximum fuse trigger duration |
|
Maximum string current limit in mA that is used in the SOA module |
|
Define if interlock feedback should be discarded or not |
|
Defines whether CAN timing shall be evaluated or not |
|
Defines whether balancing shall be available or not |
|
Number of contactors in addition to string contactors (e.g., precharge) |
|
Current threshold for determining rest state of battery |
|
Wait time in 10ms before battery system is at rest |
|
Current sensor threshold for 0 current in mA as the sensor has a jitter |
|
Maximum voltage drop over fuse |
|
Defines whether fuse shall be checked in NORMAL path or not |
|
Defines whether fuse shall be checked in CHARGE path or not |
|
The symbolic names of the individual strings need to be adapted in
BS_STRING_ID_e to the actual number of strings in the battery system.
The configuration array bs_stringsWithPrecharge needs to define whether a
string can be used for precharging or not.
This configuration array uses the entries in BS_STRING_ID_e for the
assignment.