source: trunk/firmware/Src/self_discharge.c@ 26

Last change on this file since 26 was 26, checked in by f.jahn, 3 months ago
  • Bug in ADC Kalibrierung (STM32 ADC Strom) behoben
  • DMA Buffer für ADC 1 und ADC wird vor Überschreibung während bearbeitung geschützt, indem Datenübertragung nur einmalig erfolgt und erst nach Auswertung wieder gestartet wird
  • RS485Modbus: Timeout Zeit wird für Baudraten >19200 korrekt berechnet
  • Hardware ID geändert
  • Separates Register für "Batterie Empty detection mode" auf Adresse 92 angelegt
File size: 2.6 KB
Line 
1#include <stdio.h>
2#include "sysdata.h"
3#include "self_discharge.h"
4
5#define HOLD_TIME (10800 ) //10800 = 3 stunde
6#define SD_FILTER 64
7
8int16_t SELF_DISCHARGE_Exec(void)
9{
10
11 const double batt_float_voltage_tol = 0.03;
12 const int32_t batt_voltage_holding_tol = 10;
13 int32_t max_u = sys_data.s.parameter.uBatFull * ( 1 + batt_float_voltage_tol);
14 int32_t min_u = sys_data.s.parameter.uBatFull * ( 1 - batt_float_voltage_tol);
15 static uint32_t holding_counter = 0;
16 static int32_t u_hold = 0;
17
18
19 sys_data.s.values.selfDischargeTime = holding_counter;
20
21 int32_t u = sys_data.s.values.batteryVoltage;
22
23 if (u > max_u)
24 {
25 u_hold = 0;
26 holding_counter = 0;
27 return -1;
28 }
29
30 if (u < min_u)
31 {
32 u_hold = 0;
33 holding_counter = 0;
34 return -1;
35 }
36
37 //Bin im richtigen Spannungsbereich, zu haltende Spannung speichern
38 if (u_hold == 0)
39 {
40 u_hold = u;
41 }
42
43 int32_t u_hold_max = u_hold + batt_voltage_holding_tol;
44 int32_t u_hold_min = u_hold - batt_voltage_holding_tol;
45
46 if (u > u_hold_max)
47 {
48 u_hold = 0;
49 holding_counter = 0;
50 //printf("self_discharge: fail voltage too high!\n");
51 return -2;
52 }
53
54
55 if (u < u_hold_min)
56 {
57 u_hold = 0;
58 holding_counter = 0;
59 //printf("self_discharge: fail voltage too low!\n");
60 return -2;
61 }
62
63
64 if (sys_data.s.values.batteryCurrent < sys_data.s.parameter.extraDischargeStrom_mA)
65 {
66 //Abbruch Ladegerät wurde entfernt, wir müssen mindesten den Lipro Strom messen
67 u_hold = 0;
68 holding_counter = 0;
69 //printf("self_discharge: fail current too small!\n");
70 return -3;
71 }
72
73 holding_counter++;
74 if (holding_counter > HOLD_TIME)
75 {
76 sys_data.s.values.selfDischarge = sys_data.s.values.batteryCurrent - sys_data.s.parameter.extraDischargeStrom_mA;
77 }
78
79
80 //Wenn ein gültiger Wert gemessen wurde, dann zu Mittelwert hinzufügen
81 if (sys_data.s.values.selfDischarge > 0)
82 {
83
84 // --- Mittelwert ---
85 static uint32_t last_days;
86 static unsigned long avgsum = 0;
87
88 // Converting seconds into days
89 uint32_t days = sys_data.s.values.onTime / (24U * 3600U);
90
91 // Alle 24 Stunden ein Wert zur Mittelwertberechnung hinzufügen
92 if (days != last_days)
93 {
94 last_days = days;
95
96 uint32_t avgval;
97 // Filterlängen in 2er-Potenzen --> Compiler optimiert
98 avgsum -= avgsum/SD_FILTER;
99 avgsum += sys_data.s.values.selfDischarge;
100 avgval = avgsum / SD_FILTER;
101
102 sys_data.s.values.selfDischargeAvg = avgval;
103 }
104
105 }
106
107
108
109 return 0;
110
111
112}
Note: See TracBrowser for help on using the repository browser.