source: trunk/firmware_v2/SES/src/mode_secondaryprotection_plus.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: 9.6 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
13// Hier wird Manuall On nicht erlaubt -> Extra sicher
14// Ansonsten wie Modus 1
15
16
17
18#include "stdio.h"
19#include "mode_secondaryprotection_plus.h"
20#include "button.h"
21#include "relais.h"
22#include "main.h"
23#include "leds.h"
24#include "buzzer.h"
25#include "chip_temperature.h"
26#include "voltage_meas.h"
27
28
29typedef enum SECONDARYPROTECTION_State_enum
30{
31  SECONDARYPROTECTION_OFF, 
32  SECONDARYPROTECTION_ON,
33 // SECONDARYPROTECTION_MANUAL_ON, HIer nicht erlaubt für mehr Sicherheit
34  SECONDARYPROTECTION_ERROR
35} SECONDARYPROTECTION_state_t;
36
37typedef enum SECONDARYPROTECTION_ErrorState_enum
38{
39  ERROR_NONE,
40  ERROR_EXTERNAL_FAULT, //z.B Kurzschluss
41  ERROR_TEMPERATURE,
42  ERROR_VOLTAGE_DROP,
43  ERROR_LVP_AND_OVP,      //z.B. kritische Überspannung, tiefeEntladung
44} SECONDARYPROTECTION_ErrorState_t;
45
46
47static SECONDARYPROTECTION_state_t smState;
48static SECONDARYPROTECTION_ErrorState_t smError = ERROR_NONE;
49static int autoRetryMode;
50
51static void SECONDARYPROTECTION_SM_Off(void)
52{
53  int faultInput;
54  int lvpAndOvpInput;
55
56  if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
57  {
58    faultInput = 1;
59  }
60  else
61  {
62    faultInput = 0;
63  }
64
65  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))
66  {
67    lvpAndOvpInput = 1;
68  }else {
69    lvpAndOvpInput = 0;
70  }
71
72 
73
74
75  //Prüfe auf Wechsel des Modus AUTO / SM ON
76  if (BUTTON_GetMode() == BUTTON_AUTO)
77  {
78    if (faultInput == 0) 
79    {
80      RELAIS_SetPuls();
81      BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
82      LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
83      printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
84      smState = SECONDARYPROTECTION_ON;
85          smError = ERROR_NONE;
86
87    }
88    else   
89    {
90      //Wechsel nicht möglich. Fehler Eingang aktiv
91      BUZZER_Beep(BUZZER_ON_TIME_REJECT);
92      BUTTON_SetModeOff();
93      //LEDS_RT_Blink_Start(LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_GN_OFF_TIME); //Fehler Anzeigen
94          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
95      printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
96      smState = SECONDARYPROTECTION_ERROR;
97          smError = ERROR_EXTERNAL_FAULT;
98       
99    }
100  }
101
102
103  ////Prüfe auf Wechsel in MANUAL ON Mode
104  ////Keine Fehlerüberprüfungen. In diesem Modus werdem alle Alarme ignoriert.
105  //if (BUTTON_GetMode() == BUTTON_MANUAL_ON)
106  //{
107     
108  //    RELAIS_SetPuls();
109  //    BUZZER_Alarm_Start(BUZZER_ON_TIME_ALARM_MANUAL_MODE, BUZZER_OFF_TIME);
110  //    LEDS_GN_On();
111  //    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
112  //    printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
113  //    smState = SECONDARYPROTECTION_MANUAL_ON;
114  //}
115
116
117
118}
119
120static void SECONDARYPROTECTION_SM_On(void)
121{
122  int faultInput = 0;
123  int lvpAndOvpInput = 0;
124  static int lvpAndOvpInputTimeCounter = 0;
125  static int oldtime;
126
127  if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
128  {
129    faultInput = 1;
130  }
131  else
132  {
133    faultInput = 0;
134  }
135 
136
137  if (faultInput == 1)
138  {
139    RELAIS_ResetPuls();
140    BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
141    LEDS_GN_Off();
142    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
143    BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
144    printf("FAULT INPUT EVENT DETECTED!\n");
145    printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
146    smState = SECONDARYPROTECTION_ERROR;
147        smError = ERROR_EXTERNAL_FAULT;
148        return;
149  }
150
151
152
153  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))
154  {
155    if (HAL_GetTick() != oldtime)
156    {
157      lvpAndOvpInputTimeCounter++;
158      if (lvpAndOvpInputTimeCounter > 30000)
159      {
160        lvpAndOvpInput = 1;
161        lvpAndOvpInputTimeCounter=0;
162      }
163      oldtime = HAL_GetTick();
164    }
165  }
166  else 
167  {
168    lvpAndOvpInputTimeCounter = 0;
169    lvpAndOvpInput = 0;
170  }
171
172 
173
174  // Prüfe Wechsel in off mode
175  if (BUTTON_GetMode() == BUTTON_OFF)
176  {
177    //Ausschalten muss immer möglich sein
178    RELAIS_ResetPuls();
179    BUZZER_Beep(BUZZER_ON_TIME_CONFIRM); //Bestätigung
180    LEDS_GN_Off();
181    LEDS_RT_Off();
182    printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
183    smState = SECONDARYPROTECTION_OFF;
184        smError = ERROR_NONE;
185  }
186
187  //Prüfe auf Fehlermode
188  if (VOLTAGE_MEAS_GetLimitAlarm() == 1)
189  {
190          RELAIS_ResetPuls();
191          BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
192          LEDS_GN_Off();
193          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
194          BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
195          printf("FAULT VOLTAGE DROP DETECTED!\n");
196          printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
197          smState = SECONDARYPROTECTION_ERROR; 
198          smError = ERROR_VOLTAGE_DROP;
199          VOLTAGE_MEAS_ResetCounter(); // Damit Fehlerzähler bei Neustart auf 0
200  }
201
202
203
204  if (lvpAndOvpInput == 1)
205  {
206    RELAIS_ResetPuls();
207    BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
208    LEDS_GN_Off();
209    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
210    BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
211    printf("BMS SECONDARY PROTECTION FAULT EVENT DETECTED (LVP & OVP )!\n");
212    printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
213    smState = SECONDARYPROTECTION_ERROR;
214        smError = ERROR_LVP_AND_OVP;
215  }
216
217  if (CHIP_TEMPERATURE_GetTemp() > 80)
218  {
219        RELAIS_ResetPuls();
220        BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
221        LEDS_GN_Off();
222        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
223        BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
224        printf("NEW_STATE: MAINSWITCH_ERROR, Temp too high\n");
225        smState = SECONDARYPROTECTION_ERROR;         
226        smError = ERROR_TEMPERATURE;
227  }
228
229
230
231}
232
233//static void SECONDARYPROTECTION_SM_ManualOn(void)
234//{
235//  // Prüfe Wechsel in off mode
236//  if (BUTTON_GetMode() == BUTTON_OFF)
237//  {
238//    //Ausschalten muss immer möglich sein
239//    RELAIS_ResetPuls();
240//    BUZZER_Alarm_Stop();
241//    LEDS_GN_Off();
242//    LEDS_RT_Off();
243//    printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
244//    smState = SECONDARYPROTECTION_OFF;
245//  }
246
247//}
248
249static void SECONDARYPROTECTION_SM_Error(void)
250{
251  int faultInput;
252  int lvpAndOvpInput;
253  static uint32_t retry_counter = 0;
254  static uint32_t oldTimeMSTick;
255
256  if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
257  {
258    faultInput = 1;
259  }
260  else
261  {
262    faultInput = 0;
263  }
264
265
266
267  //Prüfe auf Wechsel des Modus AUTO / SM ON
268  if (BUTTON_GetMode() == BUTTON_AUTO) 
269  {
270    if (faultInput == 0) 
271    {
272          retry_counter = 0;
273      RELAIS_SetPuls();
274      BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
275      LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
276      LEDS_RT_Off(); //Fehler löschen
277      printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
278      smState = SECONDARYPROTECTION_ON;
279          smError = ERROR_NONE;
280    }
281    else
282    {
283      //Wechsel nicht möglich. Fehler Eingang weiterhin aktiv
284      BUZZER_Beep(BUZZER_ON_TIME_REJECT);
285      BUTTON_SetModeOff();
286    }
287  }
288
289  if (autoRetryMode == 1) {
290
291    if (oldTimeMSTick != HAL_GetTick())
292    {
293        oldTimeMSTick = HAL_GetTick();
294        retry_counter++;
295    }
296
297    if  (retry_counter > 3600000)  // jede stunde
298    {
299        BUTTON_SetModeAuto();
300        retry_counter = 0;
301    }
302  }
303  //Prüfe auf Wechsel in MANUAL ON Mode
304  //Keine Fehlerüberprüfungen. In diesem Modus werdem alle Alarme ignoriert.
305  //if (BUTTON_GetMode() == BUTTON_MANUAL_ON)
306  //{
307     
308  //    RELAIS_SetPuls();
309  //    BUZZER_Alarm_Start(BUZZER_ON_TIME_ALARM_MANUAL_MODE, BUZZER_OFF_TIME);
310  //    LEDS_GN_On();
311  //    LEDS_RT_Off();
312  //    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
313  //    printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
314  //    smState = SECONDARYPROTECTION_MANUAL_ON;
315  //}
316
317
318
319}
320
321
322
323void MODE_SECONDARYPROTECTION_PLUS_Exec(int am)
324{
325
326        autoRetryMode = am;
327
328  switch (smState)
329  {
330    case SECONDARYPROTECTION_OFF:
331      SECONDARYPROTECTION_SM_Off();
332    break;
333
334    case SECONDARYPROTECTION_ON:
335      SECONDARYPROTECTION_SM_On();
336    break;
337
338    //case SECONDARYPROTECTION_MANUAL_ON:
339      //SECONDARYPROTECTION_SM_ManualOn();
340    //break;
341
342    case SECONDARYPROTECTION_ERROR:
343      SECONDARYPROTECTION_SM_Error();
344    break;
345
346    default:
347    break;
348  }
349}
350
351
Note: See TracBrowser for help on using the repository browser.