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

Last change on this file since 9 was 6, checked in by f.jahn, 8 months ago
File size: 1.9 KB
RevLine 
[6]1
2#include "sysdata.h"
3#include "self_discharge.h"
4
5#define HOLD_TIME ( 3 * 3600 ) // 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 double 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 return -2;
51 }
52
53
54 if (u < u_hold_min)
55 {
56 u_hold = 0;
57 holding_counter = 0;
58 return -2;
59 }
60
61 holding_counter++;
62 if (holding_counter > HOLD_TIME)
63 {
64 sys_data.s.values.selfDischarge = sys_data.s.values.batteryCurrent;
65 }
66
67
68
69 // --- Mittelwert ---
70 static uint32_t last_days;
71 static unsigned long avgsum = 0;
72
73 // Converting seconds into days
74 uint32_t days = sys_data.s.values.onTime / (24U * 3600U);
75
76 // Alle 24 Stunden ein Wert zur Mittelwertberechnung hinzufügen
77 if (days != last_days)
78 {
79 last_days = days;
80
81 uint32_t avgval;
82 // Filterlängen in 2er-Potenzen --> Compiler optimiert
83 avgsum -= avgsum/SD_FILTER;
84 avgsum += sys_data.s.values.selfDischarge;
85 avgval = avgsum / SD_FILTER;
86
87 sys_data.s.values.selfDischargeAvg = avgval;
88 }
89
90
91
92
93
94 return 0;
95
96
97}
Note: See TracBrowser for help on using the repository browser.