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

Last change on this file since 28 was 28, checked in by f.jahn, 3 days ago

24V Version implementiert

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