source: trunk/firmware_v2/SES/src/mode_secondaryprotection_plus.c@ 30

Last change on this file since 30 was 29, checked in by f.jahn, 7 weeks 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.