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

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