A public repository for BMS algorithms for a NUCLEO BOARD.

Dependencies:   mbed

Hi Everyone!

Welcome to this repository from Howey's Research Group at the University of Oxford.

The code published here incorporates BMS algorithms for diagnosis functions such as SOC, SOH and Power estimation on a Kokam 53Ah Li-ion battery. This code was designed to work with a NUCLEO F401-RE board and to be tested with a dSPACE HIL Simulator. A short guide on how the set up works is available at https://bitbucket.org/ff95/bms .

The code is made up of three key parts. "Headers" and "Source" folders and the "main.cpp" file. As the code was generated by converting a Simulink model ( available on the BitBucket page), the headers and source code files generated by the conversion are in the corresponding "Headers" and "Source" folders. The "main.cpp" file sets up the ADC, the USB data transmission and starts the estimation (once a character "y" has been received by the computer it is connected to). It also transmits the data from the estimation via USB. Explanation on how to set up the communication with the board is available at BitBucket webpage, from where a MATLAB file can be downloaded which allows real time communication.

For any questions you can contact the author at federicomariaferrari@gmail.com .

The Simulink and Matlab files, together with a short guide, are all available at: https://bitbucket.org/ff95/bms.

Thanks for trying this out!

Federico

Committer:
fmferrari
Date:
Thu Jul 13 10:50:13 2017 +0000
Revision:
23:447ef1071e49
Parent:
8:339dd9885af3
A working version of the code needed to run an mbed micro controller.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fmferrari 8:339dd9885af3 1 //
fmferrari 8:339dd9885af3 2 // Academic License - for use in teaching, academic research, and meeting
fmferrari 8:339dd9885af3 3 // course requirements at degree granting institutions only. Not for
fmferrari 8:339dd9885af3 4 // government, commercial, or other organizational use.
fmferrari 8:339dd9885af3 5 //
fmferrari 8:339dd9885af3 6 // File: rt_nonfinite.cpp
fmferrari 8:339dd9885af3 7 //
fmferrari 8:339dd9885af3 8 // Code generated for Simulink model 'EKF'.
fmferrari 8:339dd9885af3 9 //
fmferrari 8:339dd9885af3 10 // Model version : 1.6
fmferrari 8:339dd9885af3 11 // Simulink Coder version : 8.11 (R2016b) 25-Aug-2016
fmferrari 8:339dd9885af3 12 // C/C++ source code generated on : Thu Dec 8 19:03:07 2016
fmferrari 8:339dd9885af3 13 //
fmferrari 8:339dd9885af3 14 // Target selection: ert.tlc
fmferrari 8:339dd9885af3 15 // Embedded hardware selection: STMicroelectronics->ST10/Super10
fmferrari 8:339dd9885af3 16 // Code generation objectives: Unspecified
fmferrari 8:339dd9885af3 17 // Validation result: Not run
fmferrari 8:339dd9885af3 18 //
fmferrari 8:339dd9885af3 19
fmferrari 8:339dd9885af3 20 //
fmferrari 8:339dd9885af3 21 // Abstract:
fmferrari 8:339dd9885af3 22 // Function to initialize non-finites,
fmferrari 8:339dd9885af3 23 // (Inf, NaN and -Inf).
fmferrari 8:339dd9885af3 24 #include "rt_nonfinite.h"
fmferrari 8:339dd9885af3 25 #include "rtGetNaN.h"
fmferrari 8:339dd9885af3 26 #include "rtGetInf.h"
fmferrari 8:339dd9885af3 27
fmferrari 8:339dd9885af3 28 extern "C" {
fmferrari 8:339dd9885af3 29 real_T rtInf;
fmferrari 8:339dd9885af3 30 real_T rtMinusInf;
fmferrari 8:339dd9885af3 31 real_T rtNaN;
fmferrari 8:339dd9885af3 32 real32_T rtInfF;
fmferrari 8:339dd9885af3 33 real32_T rtMinusInfF;
fmferrari 8:339dd9885af3 34 real32_T rtNaNF;
fmferrari 8:339dd9885af3 35 }
fmferrari 8:339dd9885af3 36 extern "C"
fmferrari 8:339dd9885af3 37 {
fmferrari 8:339dd9885af3 38 //
fmferrari 8:339dd9885af3 39 // Initialize the rtInf, rtMinusInf, and rtNaN needed by the
fmferrari 8:339dd9885af3 40 // generated code. NaN is initialized as non-signaling. Assumes IEEE.
fmferrari 8:339dd9885af3 41 //
fmferrari 8:339dd9885af3 42 void rt_InitInfAndNaN(size_t realSize)
fmferrari 8:339dd9885af3 43 {
fmferrari 8:339dd9885af3 44 (void) (realSize);
fmferrari 8:339dd9885af3 45 rtNaN = rtGetNaN();
fmferrari 8:339dd9885af3 46 rtNaNF = rtGetNaNF();
fmferrari 8:339dd9885af3 47 rtInf = rtGetInf();
fmferrari 8:339dd9885af3 48 rtInfF = rtGetInfF();
fmferrari 8:339dd9885af3 49 rtMinusInf = rtGetMinusInf();
fmferrari 8:339dd9885af3 50 rtMinusInfF = rtGetMinusInfF();
fmferrari 8:339dd9885af3 51 }
fmferrari 8:339dd9885af3 52
fmferrari 8:339dd9885af3 53 // Test if value is infinite
fmferrari 8:339dd9885af3 54 boolean_T rtIsInf(real_T value)
fmferrari 8:339dd9885af3 55 {
fmferrari 8:339dd9885af3 56 return (boolean_T)((value==rtInf || value==rtMinusInf) ? 1U : 0U);
fmferrari 8:339dd9885af3 57 }
fmferrari 8:339dd9885af3 58
fmferrari 8:339dd9885af3 59 // Test if single-precision value is infinite
fmferrari 8:339dd9885af3 60 boolean_T rtIsInfF(real32_T value)
fmferrari 8:339dd9885af3 61 {
fmferrari 8:339dd9885af3 62 return (boolean_T)(((value)==rtInfF || (value)==rtMinusInfF) ? 1U : 0U);
fmferrari 8:339dd9885af3 63 }
fmferrari 8:339dd9885af3 64
fmferrari 8:339dd9885af3 65 // Test if value is not a number
fmferrari 8:339dd9885af3 66 boolean_T rtIsNaN(real_T value)
fmferrari 8:339dd9885af3 67 {
fmferrari 8:339dd9885af3 68 return (boolean_T)((value!=value) ? 1U : 0U);
fmferrari 8:339dd9885af3 69 }
fmferrari 8:339dd9885af3 70
fmferrari 8:339dd9885af3 71 // Test if single-precision value is not a number
fmferrari 8:339dd9885af3 72 boolean_T rtIsNaNF(real32_T value)
fmferrari 8:339dd9885af3 73 {
fmferrari 8:339dd9885af3 74 return (boolean_T)(((value!=value) ? 1U : 0U));
fmferrari 8:339dd9885af3 75 }
fmferrari 8:339dd9885af3 76 }
fmferrari 8:339dd9885af3 77
fmferrari 8:339dd9885af3 78 //
fmferrari 8:339dd9885af3 79 // File trailer for generated code.
fmferrari 8:339dd9885af3 80 //
fmferrari 8:339dd9885af3 81 // [EOF]
fmferrari 8:339dd9885af3 82 //