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

Last change on this file since 6 was 6, checked in by f.jahn, 3 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.