source: trunk/fw_g473rct/SES/src/self_discharge.c

Last change on this file was 20, checked in by f.jahn, 4 days ago

adc dma funktioniert und modbus funktioniert

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.