source: trunk/firmware_v4/SES/src/mode_secondaryprotection.c@ 44

Last change on this file since 44 was 44, checked in by Zed, 28 hours ago

Es wurden zwei zusätzliche Register hinzugefügt.

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