source: trunk/firmware_v2/SES/src/mode_secondaryprotection.c @ 29

Last change on this file since 29 was 29, checked in by f.jahn, 30 hours ago
  • Auto Restart mode implementiert
  • IWDG implementiert
  • 24V Kompiler Version implementiert
File size: 10.7 KB
Line 
1
2// Dieser Modus ist ein Hauptschaltermodus mit Secondary Protection
3// Secondary Protection löst aus, wenn OVP und LVP wegfällt.
4// OVP und LVP fällt wegbei:
5// - Sehr tiefe Entladung
6// - Sehr hohe Spannung
7// - Übertemperatur
8// - je nach Liproeinstellung möglicherweise auch wenn sowohl Untertemperaturschutz für Ladung und für Last erreicht ist
9// - je nach Liproeinstellung möglicherweise auch wenn sowohl Überttemperaturschutz für Ladung und für Last erreicht ist
10// - Die letzten beiden Positionen können vielleicht ungewollt sein.
11
12// OVP UND LVP Signal gleichzeitig:
13// Es wurde eine Verzögerung von ca. 30 Sekunden implementiert. So kann noch problemlos ein Testjumper auf die Lipro gesteckt werden und die
14// einzelnennen Funktionen zu prüfen. Außerdem ist es eventuell für die Prametrierung hilfreich, wenn nicht sofort ausgeht
15// Auch wäre es hilfreich um zum Beispiel die Ursache über Modbus abfragen heruas zu bekommen
16
17//
18// Fault Input:
19// Hier ohne Verzögerung um schnell auf kurzschluss reagieren zu können
20// Ansonsten wie Modus 0
21
22
23
24#include "stdio.h"
25#include "mode_secondaryprotection.h"
26#include "button.h"
27#include "relais.h"
28#include "main.h"
29#include "leds.h"
30#include "buzzer.h"
31#include "voltage_meas.h"
32#include "chip_temperature.h"
33
34
35typedef enum SECONDARYPROTECTION_State_enum
36{
37  SECONDARYPROTECTION_OFF, 
38  SECONDARYPROTECTION_ON,
39  SECONDARYPROTECTION_MANUAL_ON, 
40  SECONDARYPROTECTION_ERROR
41} SECONDARYPROTECTION_state_t;
42
43typedef enum SECONDARYPROTECTION_ErrorState_enum
44{
45  ERROR_NONE,
46  ERROR_EXTERNAL_FAULT, //z.B Kurzschluss
47  ERROR_TEMPERATURE,
48  ERROR_VOLTAGE_DROP,
49  ERROR_LVP_AND_OVP,      //z.B. kritische Überspannung, tiefeEntladung
50} SECONDARYPROTECTION_ErrorState_t;
51
52
53static SECONDARYPROTECTION_state_t smState;
54static SECONDARYPROTECTION_ErrorState_t smError;
55static int autoRetryMode;
56
57
58static void SECONDARYPROTECTION_SM_Off(void)
59{
60  int faultInput;
61  int lvpAndOvpInput;
62
63  if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
64  {
65    faultInput = 1;
66  }
67  else
68  {
69    faultInput = 0;
70  }
71
72  if ((HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_SET) &&  (HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin) == GPIO_PIN_SET))
73  {
74    lvpAndOvpInput = 1;
75  }else {
76    lvpAndOvpInput = 0;
77  }
78
79 
80
81
82  //Prüfe auf Wechsel des Modus AUTO / SM ON
83  if (BUTTON_GetMode() == BUTTON_AUTO)
84  {
85    if (faultInput == 0) 
86    {
87      RELAIS_SetPuls();
88      BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
89      LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
90      printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
91      smState = SECONDARYPROTECTION_ON;
92          smError = ERROR_NONE;
93
94    }
95    else   
96    {
97      //Wechsel nicht möglich. Fehler Eingang aktiv
98      BUZZER_Beep(BUZZER_ON_TIME_REJECT);
99      BUTTON_SetModeOff();
100      //LEDS_RT_Blink_Start(LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_GN_OFF_TIME); //Fehler Anzeigen
101          LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_FAULT_INPUT, LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
102      printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
103      smState =SECONDARYPROTECTION_ERROR;
104          smError = ERROR_EXTERNAL_FAULT;
105    }
106  }
107
108
109  //Prüfe auf Wechsel in MANUAL ON Mode
110  //Keine Fehlerüberprüfungen. In diesem Modus werdem alle Alarme ignoriert.
111  if (BUTTON_GetMode() == BUTTON_MANUAL_ON)
112  {
113     
114      RELAIS_SetPuls();
115      BUZZER_Alarm_Start(BUZZER_ON_TIME_ALARM_MANUAL_MODE, BUZZER_OFF_TIME);
116      LEDS_GN_On();
117      LEDS_RT_BlinkCode_Start(BLINK_CODE_WARN_MANUAL, LED_RT_ON_TIME_WARN_MANUAL_MODE, LED_RT_OFF_TIME, LED_RT_OFF_TIME * 5); //Fehler Anzeigen
118      printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
119      smState = SECONDARYPROTECTION_MANUAL_ON;
120          smError = ERROR_NONE;
121  }
122
123
124
125}
126
127static void SECONDARYPROTECTION_SM_On(void)
128{
129  int faultInput = 0;
130  int lvpAndOvpInput = 0;
131  static int lvpAndOvpInputTimeCounter = 0;
132  static int oldtime;
133
134  if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
135  {   
136          faultInput = 1;
137          RELAIS_ResetPuls();
138      BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
139      LEDS_GN_Off();
140      LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_FAULT_INPUT, LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
141      BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
142      printf("FAULT INPUT EVENT DETECTED!\n");
143      printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
144      smState = SECONDARYPROTECTION_ERROR;
145          smError = ERROR_EXTERNAL_FAULT;
146  }
147  else
148  {
149    faultInput = 0;
150  }
151 
152  if ((HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_SET) &&  (HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin) == GPIO_PIN_SET))
153  {
154    if (HAL_GetTick() != oldtime)
155    {
156      lvpAndOvpInputTimeCounter++;
157      if (lvpAndOvpInputTimeCounter > 30000)
158      {
159        lvpAndOvpInput = 1;
160        lvpAndOvpInputTimeCounter=0;
161      }
162      oldtime = HAL_GetTick();
163    }
164  }
165  else 
166  {
167    lvpAndOvpInputTimeCounter = 0;
168    lvpAndOvpInput = 0;
169  }
170
171 
172
173  // Prüfe Wechsel in off mode
174  if (BUTTON_GetMode() == BUTTON_OFF)
175  {
176    //Ausschalten muss immer möglich sein
177    RELAIS_ResetPuls();
178    BUZZER_Beep(BUZZER_ON_TIME_CONFIRM); //Bestätigung
179    LEDS_GN_Off();
180    LEDS_RT_Off();
181    printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
182    smState = SECONDARYPROTECTION_OFF;
183  }
184
185  //Prüfe auf Fehlermode
186  if (VOLTAGE_MEAS_GetLimitAlarm() == 1)
187  {
188          RELAIS_ResetPuls();
189          BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
190          LEDS_GN_Off();
191          LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_VOLTAGE_DROP, LED_RT_ON_TIME_WARN_VOLTAGE_DROP, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
192          BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
193          printf("FAULT VOLTAGE DROP DETECTED!\n");
194          printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
195          smState = SECONDARYPROTECTION_ERROR; 
196          smError = ERROR_VOLTAGE_DROP;
197          VOLTAGE_MEAS_ResetCounter(); // Damit Fehlerzähler bei Neustart auf 0
198  }
199
200
201
202  if (lvpAndOvpInput == 1)
203  {
204    RELAIS_ResetPuls();
205    BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
206    LEDS_GN_Off();
207    LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_OVP_LVP, LED_RT_ON_TIME_WARN_OVP_AND_LVP_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
208    BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
209    printf("BMS SECONDARY PROTECTION FAULT EVENT DETECTED (LVP & OVP )!\n");
210    printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
211    smState = SECONDARYPROTECTION_ERROR;
212        smError = ERROR_LVP_AND_OVP;
213  }
214
215  if (CHIP_TEMPERATURE_GetTemp() > 80)
216  {
217        RELAIS_ResetPuls();
218        BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
219        LEDS_GN_Off();
220        LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_TEMP, LED_RT_ON_TIME_WARN_TEMP, LED_GN_OFF_TIME, LED_GN_OFF_TIME *5); //Fehler Anzeigen
221        BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
222        printf("NEW_STATE: MAINSWITCH_ERROR, Temp too high\n");
223        smState = SECONDARYPROTECTION_ERROR;         
224        smError = ERROR_TEMPERATURE;
225  }
226
227
228
229}
230
231static void SECONDARYPROTECTION_SM_ManualOn(void)
232{
233
234  int faultInput = 0;
235
236
237  if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
238  {   
239          faultInput = 1;
240  }
241  else
242  {
243    faultInput = 0;
244  }
245
246  if (faultInput == 1)
247  {
248    RELAIS_ResetPuls();
249    BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
250    LEDS_GN_Off();
251    LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_FAULT_INPUT, LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
252    BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
253    printf("FAULT INPUT EVENT DETECTED!\n");
254    printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
255    smState = SECONDARYPROTECTION_ERROR;
256        smError = ERROR_EXTERNAL_FAULT;
257  }
258
259
260  // Prüfe Wechsel in off mode
261  if (BUTTON_GetMode() == BUTTON_OFF)
262  {
263    //Ausschalten muss immer möglich sein
264    RELAIS_ResetPuls();
265    BUZZER_Alarm_Stop();
266    LEDS_GN_Off();
267    LEDS_RT_Off();
268    printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
269    smState = SECONDARYPROTECTION_OFF;
270        smError = ERROR_NONE;
271  }
272
273}
274
275static void SECONDARYPROTECTION_SM_Error(void)
276{
277  int faultInput;
278  int lvpAndOvpInput;
279  static uint32_t retry_counter = 0;
280  static uint32_t oldTimeMSTick;
281
282  if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
283  {
284    faultInput = 1;
285  }
286  else
287  {
288    faultInput = 0;
289  }
290
291
292
293  //Prüfe auf Wechsel des Modus AUTO / SM ON
294  if (BUTTON_GetMode() == BUTTON_AUTO)
295  {
296    if (faultInput == 0) 
297    {
298      RELAIS_SetPuls();
299      BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
300      LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
301      LEDS_RT_Off(); //Fehler löschen
302      printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
303      smState = SECONDARYPROTECTION_ON;
304          smError = ERROR_NONE;
305    }
306    else
307    {
308      //Wechsel nicht möglich. Fehler Eingang weiterhin aktiv
309      BUZZER_Beep(BUZZER_ON_TIME_REJECT);
310      BUTTON_SetModeOff();
311    }
312  }
313
314  //Prüfe auf Wechsel in MANUAL ON Mode
315  //Keine Fehlerüberprüfungen. In diesem Modus werdem alle Alarme ignoriert.
316  if (BUTTON_GetMode() == BUTTON_MANUAL_ON)
317  {
318     
319      RELAIS_SetPuls();
320      BUZZER_Alarm_Start(BUZZER_ON_TIME_ALARM_MANUAL_MODE, BUZZER_OFF_TIME);
321      LEDS_GN_On();
322      LEDS_RT_Off();
323      LEDS_RT_BlinkCode_Start(BLINK_CODE_WARN_MANUAL, LED_RT_ON_TIME_WARN_MANUAL_MODE, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
324      printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
325      smState = SECONDARYPROTECTION_MANUAL_ON;
326          smError = ERROR_NONE;
327  }
328
329
330  if (autoRetryMode == 1) {
331
332    if (oldTimeMSTick != HAL_GetTick())
333    {
334        oldTimeMSTick = HAL_GetTick();
335        retry_counter++;
336    }
337
338    if  (retry_counter > 3600000)  // 10 Minuten * 60 * 1000 = 600000 || 60 * 60 * 1000 =3600000
339    {
340        BUTTON_SetModeAuto();
341        retry_counter=0;
342    }
343  }
344}
345
346
347
348void MODE_SECONDARYPROTECTION_Exec(int am)
349{
350
351        autoRetryMode = am;
352
353  switch (smState)
354  {
355    case SECONDARYPROTECTION_OFF:
356      SECONDARYPROTECTION_SM_Off();
357    break;
358
359    case SECONDARYPROTECTION_ON:
360      SECONDARYPROTECTION_SM_On();
361    break;
362
363    case SECONDARYPROTECTION_MANUAL_ON:
364      SECONDARYPROTECTION_SM_ManualOn();
365    break;
366
367    case SECONDARYPROTECTION_ERROR:
368      SECONDARYPROTECTION_SM_Error();
369    break;
370
371    default:
372    break;
373  }
374}
375
376
Note: See TracBrowser for help on using the repository browser.