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

Last change on this file was 29, checked in by f.jahn, 7 weeks ago
  • Auto Restart mode implementiert
  • IWDG implementiert
  • 24V Kompiler Version implementiert
File size: 10.7 KB
RevLine 
[17]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"
[24]32#include "chip_temperature.h"
[17]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
[29]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;
[17]51
[29]52
[17]53static SECONDARYPROTECTION_state_t smState;
[29]54static SECONDARYPROTECTION_ErrorState_t smError;
55static int autoRetryMode;
[17]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;
[29]92 smError = ERROR_NONE;
[17]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;
[29]104 smError = ERROR_EXTERNAL_FAULT;
[17]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;
[29]120 smError = ERROR_NONE;
[17]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)
[28]135 {
136 faultInput = 1;
[29]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;
[17]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;
[29]196 smError = ERROR_VOLTAGE_DROP;
[17]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;
[29]212 smError = ERROR_LVP_AND_OVP;
[17]213 }
214
[24]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;
[29]224 smError = ERROR_TEMPERATURE;
[24]225 }
[17]226
[24]227
228
[17]229}
230
231static void SECONDARYPROTECTION_SM_ManualOn(void)
232{
[28]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;
[29]256 smError = ERROR_EXTERNAL_FAULT;
[28]257 }
258
259
[17]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;
[29]270 smError = ERROR_NONE;
[17]271 }
272
273}
274
275static void SECONDARYPROTECTION_SM_Error(void)
276{
277 int faultInput;
278 int lvpAndOvpInput;
[29]279 static uint32_t retry_counter = 0;
280 static uint32_t oldTimeMSTick;
[17]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;
[29]304 smError = ERROR_NONE;
[17]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;
[29]326 smError = ERROR_NONE;
[17]327 }
328
329
[29]330 if (autoRetryMode == 1) {
[17]331
[29]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 }
[17]344}
345
346
347
[29]348void MODE_SECONDARYPROTECTION_Exec(int am)
[17]349{
350
[29]351 autoRetryMode = am;
[17]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.