source: trunk/firmware_v4/SES/src/mode_secondaryprotection_plus.c

Last change on this file was 42, checked in by f.jahn, 5 days ago
File size: 9.8 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#ifdef DEBUG
84 printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
85#endif
86 smState = SECONDARYPROTECTION_ON;
87 smError = ERROR_NONE;
88
89 }
90 else
91 {
92 //Wechsel nicht möglich. Fehler Eingang aktiv
93 BUZZER_Beep(BUZZER_ON_TIME_REJECT);
94 BUTTON_SetModeOff();
95 //LEDS_RT_Blink_Start(LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_GN_OFF_TIME); //Fehler Anzeigen
96 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
97#ifdef DEBUG
98 printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
99#endif
100 smState = SECONDARYPROTECTION_ERROR;
101 smError = ERROR_EXTERNAL_FAULT;
102
103 }
104 }
105
106
107 ////Prüfe auf Wechsel in MANUAL ON Mode
108 ////Keine Fehlerüberprüfungen. In diesem Modus werdem alle Alarme ignoriert.
109 //if (BUTTON_GetMode() == BUTTON_MANUAL_ON)
110 //{
111
112 // RELAIS_SetPuls();
113 // BUZZER_Alarm_Start(BUZZER_ON_TIME_ALARM_MANUAL_MODE, BUZZER_OFF_TIME);
114 // LEDS_GN_On();
115 // 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
116 // printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
117 // smState = SECONDARYPROTECTION_MANUAL_ON;
118 //}
119
120
121
122}
123
124static void SECONDARYPROTECTION_SM_On(void)
125{
126 int faultInput = 0;
127 int lvpAndOvpInput = 0;
128 static int lvpAndOvpInputTimeCounter = 0;
129 static int oldtime;
130
131 if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)
132 {
133 faultInput = 1;
134 }
135 else
136 {
137 faultInput = 0;
138 }
139
140
141 if (faultInput == 1)
142 {
143 RELAIS_ResetPuls();
144 BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
145 LEDS_GN_Off();
146 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
147 BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
148#ifdef DEBUG
149 printf("FAULT INPUT EVENT DETECTED!\n");
150 printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
151#endif
152 smState = SECONDARYPROTECTION_ERROR;
153 smError = ERROR_EXTERNAL_FAULT;
154 return;
155 }
156
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 smState = SECONDARYPROTECTION_OFF;
192 smError = ERROR_NONE;
193 }
194
195 //Prüfe auf Fehlermode
196 if (VOLTAGE_MEAS_GetLimitAlarm() == 1)
197 {
198 RELAIS_ResetPuls();
199 BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
200 LEDS_GN_Off();
201 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
202 BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
203#ifdef DEBUG
204 printf("FAULT VOLTAGE DROP DETECTED!\n");
205 printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
206#endif
207 smState = SECONDARYPROTECTION_ERROR;
208 smError = ERROR_VOLTAGE_DROP;
209 VOLTAGE_MEAS_ResetCounter(); // Damit Fehlerzähler bei Neustart auf 0
210 }
211
212
213
214 if (lvpAndOvpInput == 1)
215 {
216 RELAIS_ResetPuls();
217 BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
218 LEDS_GN_Off();
219 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
220 BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
221#ifdef DEBUG
222 printf("BMS SECONDARY PROTECTION FAULT EVENT DETECTED (LVP & OVP )!\n");
223 printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
224#endif
225 smState = SECONDARYPROTECTION_ERROR;
226 smError = ERROR_LVP_AND_OVP;
227 }
228
229 if (CHIP_TEMPERATURE_GetTemp() > 80)
230 {
231 RELAIS_ResetPuls();
232 BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
233 LEDS_GN_Off();
234 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
235 BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
236#ifdef DEBUG
237 printf("NEW_STATE: MAINSWITCH_ERROR, Temp too high\n");
238#endif
239 smState = SECONDARYPROTECTION_ERROR;
240 smError = ERROR_TEMPERATURE;
241 }
242}
243
244//static void SECONDARYPROTECTION_SM_ManualOn(void)
245//{
246// // Prüfe Wechsel in off mode
247// if (BUTTON_GetMode() == BUTTON_OFF)
248// {
249// //Ausschalten muss immer möglich sein
250// RELAIS_ResetPuls();
251// BUZZER_Alarm_Stop();
252// LEDS_GN_Off();
253// LEDS_RT_Off();
254// printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
255// smState = SECONDARYPROTECTION_OFF;
256// }
257
258//}
259
260static void SECONDARYPROTECTION_SM_Error(void)
261{
262 int faultInput;
263 int lvpAndOvpInput;
264 static uint32_t retry_counter = 0;
265 static uint32_t oldTimeMSTick;
266
267 if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)
268 {
269 faultInput = 1;
270 }
271 else
272 {
273 faultInput = 0;
274 }
275
276
277
278 //Prüfe auf Wechsel des Modus AUTO / SM ON
279 if (BUTTON_GetMode() == BUTTON_AUTO)
280 {
281 if (faultInput == 0)
282 {
283 retry_counter = 0;
284 RELAIS_SetPuls();
285 BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
286 LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
287 LEDS_RT_Off(); //Fehler löschen
288#ifdef DEBUG
289 printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
290#endif
291 smState = SECONDARYPROTECTION_ON;
292 smError = ERROR_NONE;
293 }
294 else
295 {
296 //Wechsel nicht möglich. Fehler Eingang weiterhin aktiv
297 BUZZER_Beep(BUZZER_ON_TIME_REJECT);
298 BUTTON_SetModeOff();
299 }
300 }
301
302 if (autoRetryMode == 1) {
303
304 if (oldTimeMSTick != HAL_GetTick())
305 {
306 oldTimeMSTick = HAL_GetTick();
307 retry_counter++;
308 }
309
310 if (retry_counter > 3600000) // jede stunde
311 {
312 BUTTON_SetModeAuto();
313 retry_counter = 0;
314 }
315 }
316 //Prüfe auf Wechsel in MANUAL ON Mode
317 //Keine Fehlerüberprüfungen. In diesem Modus werdem alle Alarme ignoriert.
318 //if (BUTTON_GetMode() == BUTTON_MANUAL_ON)
319 //{
320
321 // RELAIS_SetPuls();
322 // BUZZER_Alarm_Start(BUZZER_ON_TIME_ALARM_MANUAL_MODE, BUZZER_OFF_TIME);
323 // LEDS_GN_On();
324 // LEDS_RT_Off();
325 // 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
326 // printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
327 // smState = SECONDARYPROTECTION_MANUAL_ON;
328 //}
329
330
331
332}
333
334
335
336void MODE_SECONDARYPROTECTION_PLUS_Exec(int am)
337{
338
339 autoRetryMode = am;
340
341 switch (smState)
342 {
343 case SECONDARYPROTECTION_OFF:
344 SECONDARYPROTECTION_SM_Off();
345 break;
346
347 case SECONDARYPROTECTION_ON:
348 SECONDARYPROTECTION_SM_On();
349 break;
350
351 //case SECONDARYPROTECTION_MANUAL_ON:
352 //SECONDARYPROTECTION_SM_ManualOn();
353 //break;
354
355 case SECONDARYPROTECTION_ERROR:
356 SECONDARYPROTECTION_SM_Error();
357 break;
358
359 default:
360 break;
361 }
362}
363
364
Note: See TracBrowser for help on using the repository browser.