Hanna
Sourcecode Batteriemanagementsystem
sdcard_bms.c
gehe zur Dokumentation dieser Datei
1 
14 #include <stdlib.h>
15 #include <avr/io.h>
16 #include <stdio.h>
17 #include <stddef.h>
18 #include <string.h>
19 //#include <avr/interrupt.h>
20 //#include <avr/pgmspace.h>
21 
22 #include "macros.h"
23 #include "usartx.h"
24 #include "sdcard_driver.h"
25 #include "sdcard_bms.h"
26 #include "ds1388_rtc.h"
27 #include "BMS-Basic.h"
28 #include "ad7997.h"
29 #include "temp_mcp9843.h"
30 #include "sdcard/fat.h"
31 
51 {
52  char filename[] = { "state.bms" };
53  char zeile[70];
54  char timestamp[20];
55 
57  sprintf ( timestamp, "20%02i-%02i-%02i %02i:%02i:%02i", now.year, now.month, now.day, now.hours, now.minutes, now.seconds );
58 
59  sd_card_open ();
60  sd_file_open ( filename );
61 
62  for ( int i = 0; i <= 7; i++ )
63  {
64  sprintf ( zeile, "%03i;%03i;%03i;%03.0f;%06li;%06li;%04.1f;%s\r", SOC[i], SOH[i], c_max[i], charge[i], betriebszeit_s[i], ladezeit_s[i], ladezyklus[i], timestamp );
65  file_write_line ( i + 1, zeile );
66  }
67 
68  sd_file_close ();
69  sd_card_close ();
70 }
71 
88 void sdcard_bms_read_state ( void )
89 {
90  char filename[] = { "state.bms" };
91  char zeile[70], wert[70];
92 
93  sd_card_open ();
94  sd_file_open ( filename );
95 
96 // Der Dateiinhalt wird zeilenweise eingelesen und den entsprechenden Variablen zugeordnet.
97  for ( int i = 0; i <= 7; i++ )
98  {
99  file_getLine ( i + 1, zeile );
100 
101  for ( int n = 0; n <= 69; n++ )
102  {
103  if ( zeile[n] >= 0x30 && zeile[n] <= 0x39 ) wert[n] = zeile[n] - 0x30; // Char-Werte der Ziffern werden in numerische Werte umgerechnet
104  }
105 
106 // Umrechnung in numerische Werte
107  SOC[i] = wert[0] * 100 + wert[1] * 10 + wert[2];
108  SOH[i] = wert[4] * 100 + wert[5] * 10 + wert[6];
109  c_max[i] = wert[8] * 100 + wert[9] * 10 + wert[10];
110  charge[i] = (float) (wert[12] * 100 + wert[13] * 10 + wert[14]);
111  betriebszeit_s[i] = wert[16] * 100000 + wert[17] * 10000 + wert[18] * 1000 + wert[19] * 100 + wert[20] * 10 + wert[21];
112  ladezeit_s[i] = wert[23] * 100000 + wert[24] * 10000 + wert[25] * 1000 + wert[26] * 100 + wert[27] * 10 + wert[28];
113  ladezyklus[i] = (float) (wert[30] * 10.0 + wert[31] * 1.0 + wert[33] / 10.0);
114  }
115 
116  sd_file_close ();
117  sd_card_close ();
118 }
119 
133 {
134  char filename[] = { "base.bms" };
135  char zeile[20];
136 
137  uint8_t yy = 16;
138  uint8_t dd = 29, mm = 3;
139  uint16_t max_capa[8] = { 750, 750, 750, 750, 750, 750, 750, 750 };
140 
141  sd_card_open ();
142  sd_file_delete ( filename );
143  sd_file_new ( filename );
144  sd_file_open ( filename );
145 
146  for ( int i = 0; i <= 7; i++ )
147  {
148  // Daten: Kapazität Jahr Monat Tag
149  sprintf ( zeile, "%04i;%02i;%02i;%02i\r", max_capa[i], yy, mm, dd );
150  sd_file_write_append ( zeile );
151  }
152 
153  sd_file_close ();
154 // sd_card_close ();
155 }
156 
168 void sdcard_bms_read_base ( void )
169 {
170  char filename[] = { "base.bms" };
171  char zeile[20], wert[20];
172 
173  uint8_t yy[8];
174  uint8_t dd[8], mm[8];
175  uint16_t max_capa[8];
176 
177  sd_card_open ();
178  sd_file_open ( filename );
179 
180 // Der Dateiinhalt wird zeilenweise eingelesen und den entsprechenden Variablen zugeordnet.
181  for ( int i = 0; i <= 7; i++ )
182  {
183  file_getLine ( i + 1, zeile );
184 
185  for ( int n = 0; n <= 19; n++ )
186  {
187  if ( zeile[n] >= 0x30 && zeile[n] <= 0x39 ) wert[n] = zeile[n] - 0x30; // Char-Werte der Ziffern werden in numerische Werte umgerechnet
188  }
189 
190 // Umrechnung in numerische Werte
191  max_capa[i] = wert[0] * 1000 + wert[1] * 100 + wert[2] * 10 + wert[3];
192  yy[i] = wert[5] * 10 + wert[6];
193  mm[i] = wert[8] * 10 + wert[9];
194  dd[i] = wert[11] * 10 + wert[12];
195  }
196 
197  sd_file_close ();
198  sd_card_close ();
199 }
200 
226 {
227  char filename[] = { "betrieb.csv" };
228  char zeile[70];
229  char timestamp[20];
230  static bool einmal = true;
231 
233  sprintf ( timestamp, "20%02i-%02i-%02i %02i:%02i:%02i", now.year, now.month, now.day, now.hours, now.minutes, now.seconds );
234 
235  sd_card_open ();
236 // sd_file_open ( filename );
237  if ( !sd_file_open ( filename ) )
238  {
239  sd_file_new ( filename );
240  sd_file_open ( filename );
241  }
242 
243  if ( einmal )
244  {
245  sprintf ( zeile, "Zeit" );
246  sd_file_write_append ( zeile );
247 
248  for ( int i = 0; i <= 7; i++ )
249  {
250  sprintf ( zeile, ";Zelle;Vorhanden;Aktiv;Strom;Spannung;Temperatur;Ladung;SOC" );
251  sd_file_write_append ( zeile );
252  }
253 
254  sprintf ( zeile, "\r" );
255  sd_file_write_append ( zeile );
256 
257  einmal = false;
258  }
259 
260  sprintf ( zeile, "%s", timestamp );
261  sd_file_write_append ( zeile );
262 
263  for ( int i = 0; i <= 7; i++ )
264  {
265  sprintf ( zeile, ";%i;%i;%i;%i;%5.2f;%i;%7.2f;%i", i, akku[i], akku_an[i], current[i], voltage[i], temp[i], charge[i], SOC[i] );
266  sd_file_write_append ( zeile );
267  }
268 
269  sprintf ( zeile, "\r" );
270  sd_file_write_append ( zeile );
271 
272  sd_file_close ();
273 // sd_card_close ();
274 }
275 
299 {
300  char filename[] = { "laden.csv" };
301  char zeile[70];
302  char timestamp[20];
303  static bool einmal = true;
304 
306  sprintf ( timestamp, "20%02i-%02i-%02i %02i:%02i:%02i", now.year, now.month, now.day, now.hours, now.minutes, now.seconds );
307 
308  sd_card_open ();
309  // sd_file_open ( filename );
310  if ( !sd_file_open ( filename ) )
311  {
312  sd_file_new ( filename );
313  sd_file_open ( filename );
314  }
315 
316  if ( einmal )
317  {
318  sprintf ( zeile, "Zeit" );
319  sd_file_write_append ( zeile );
320 
321  for ( int i = 0; i <= 7; i++ )
322  {
323  sprintf ( zeile, ";Zelle;Strom;Spannung;Temperatur;Ladung;SOC" );
324  sd_file_write_append ( zeile );
325  }
326 
327  sprintf ( zeile, "\r" );
328  sd_file_write_append ( zeile );
329 
330  einmal = false;
331  }
332 
333  sprintf ( zeile, "%s", timestamp );
334  sd_file_write_append ( zeile );
335 
336  for ( int i = 0; i <= 7; i++ )
337  {
338  sprintf ( zeile, ";%i;%i;%5.2f;%i;%7.2f;%i", i, current[i], voltage[i], temp[i], charge[i], SOC[i] );
339  sd_file_write_append ( zeile );
340  }
341 
342  sprintf ( zeile, "\r" );
343  sd_file_write_append ( zeile );
344 
345  sd_file_close ();
346 // sd_card_close ();
347 }
348 
Konstanten, Filter und Commands für den Temperatursensor MCP 9843.
Header, Definition der Konstanten und Commands für DS1388.
void DS1388_get_datetime(void)
Die Uhrzeit und das Datum werden ausgelesen.
Definition: ds1388_rtc.c:107
SD-Card Reader Bibliothek von Roland Riegel.
void sdcard_bms_read_state(void)
Zustandsdaten der Batterien werden gelesen.
Definition: sdcard_bms.c:88
Standard Header Datei, Definition der Batteriekonstanten und Grenzwerte.
void sdcard_bms_write_state(void)
Zustandsdaten der Batterien werden gespeichert.
Definition: sdcard_bms.c:50
Standardheader und Auswahl der Übertragungsgeschwindigkeit.
void sdcard_bms_write_base(void)
Basisdaten der Batterien werden gespeichert.
Definition: sdcard_bms.c:132
void sdcard_bms_daten_laden(void)
Daten im Modus "Laden" werden auf die SD-Karte geschrieben.
Definition: sdcard_bms.c:298
Datei aus der SD-Card Reader Bibliothek von M. Junghans.
Standardheader. Datenmanagement für BMS-Daten mit SD Card Reader.
void sdcard_bms_daten_betrieb(void)
Daten im Modus "Betrieb" werden auf die SD-Karte geschrieben.
Definition: sdcard_bms.c:225
void sdcard_bms_read_base(void)
Basisdaten der Batterien werden gelesen.
Definition: sdcard_bms.c:168
SD-Card Reader Bibliothek von M. Junghans.
Header für ADC AD7997, Definition der Register und Commands.