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

Last change on this file since 19 was 17, checked in by f.jahn, 4 months ago
File size: 8.5 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
33
34typedef enum SECONDARYPROTECTION_State_enum
35{
36 SECONDARYPROTECTION_OFF,
37 SECONDARYPROTECTION_ON,
38 SECONDARYPROTECTION_MANUAL_ON,
39 SECONDARYPROTECTION_ERROR
40} SECONDARYPROTECTION_state_t;
41
42
43static SECONDARYPROTECTION_state_t smState;
44
45
46static void SECONDARYPROTECTION_SM_Off(void)
47{
48 int faultInput;
49 int lvpAndOvpInput;
50
51 if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)
52 {
53 faultInput = 1;
54 }
55 else
56 {
57 faultInput = 0;
58 }
59
60 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))
61 {
62 lvpAndOvpInput = 1;
63 }else {
64 lvpAndOvpInput = 0;
65 }
66
67
68
69
70 //Prüfe auf Wechsel des Modus AUTO / SM ON
71 if (BUTTON_GetMode() == BUTTON_AUTO)
72 {
73 if (faultInput == 0)
74 {
75 RELAIS_SetPuls();
76 BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
77 LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
78 printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
79 smState = SECONDARYPROTECTION_ON;
80
81 }
82 else
83 {
84 //Wechsel nicht möglich. Fehler Eingang aktiv
85 BUZZER_Beep(BUZZER_ON_TIME_REJECT);
86 BUTTON_SetModeOff();
87 //LEDS_RT_Blink_Start(LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_GN_OFF_TIME); //Fehler Anzeigen
88 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
89 printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
90 smState =SECONDARYPROTECTION_ERROR;
91 }
92 }
93
94
95 //Prüfe auf Wechsel in MANUAL ON Mode
96 //Keine Fehlerüberprüfungen. In diesem Modus werdem alle Alarme ignoriert.
97 if (BUTTON_GetMode() == BUTTON_MANUAL_ON)
98 {
99
100 RELAIS_SetPuls();
101 BUZZER_Alarm_Start(BUZZER_ON_TIME_ALARM_MANUAL_MODE, BUZZER_OFF_TIME);
102 LEDS_GN_On();
103 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
104 printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
105 smState = SECONDARYPROTECTION_MANUAL_ON;
106 }
107
108
109
110}
111
112static void SECONDARYPROTECTION_SM_On(void)
113{
114 int faultInput = 0;
115 int lvpAndOvpInput = 0;
116 static int lvpAndOvpInputTimeCounter = 0;
117 static int oldtime;
118
119 if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)
120 {
121 faultInput = 1;
122 }
123 else
124 {
125 faultInput = 0;
126 }
127
128 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))
129 {
130 if (HAL_GetTick() != oldtime)
131 {
132 lvpAndOvpInputTimeCounter++;
133 if (lvpAndOvpInputTimeCounter > 30000)
134 {
135 lvpAndOvpInput = 1;
136 lvpAndOvpInputTimeCounter=0;
137 }
138 oldtime = HAL_GetTick();
139 }
140 }
141 else
142 {
143 lvpAndOvpInputTimeCounter = 0;
144 lvpAndOvpInput = 0;
145 }
146
147
148
149 // Prüfe Wechsel in off mode
150 if (BUTTON_GetMode() == BUTTON_OFF)
151 {
152 //Ausschalten muss immer möglich sein
153 RELAIS_ResetPuls();
154 BUZZER_Beep(BUZZER_ON_TIME_CONFIRM); //Bestätigung
155 LEDS_GN_Off();
156 LEDS_RT_Off();
157 printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
158 smState = SECONDARYPROTECTION_OFF;
159 }
160
161 //Prüfe auf Fehlermode
162 if (VOLTAGE_MEAS_GetLimitAlarm() == 1)
163 {
164 RELAIS_ResetPuls();
165 BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
166 LEDS_GN_Off();
167 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
168 BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
169 printf("FAULT VOLTAGE DROP DETECTED!\n");
170 printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
171 smState = SECONDARYPROTECTION_ERROR;
172 VOLTAGE_MEAS_ResetCounter(); // Damit Fehlerzähler bei Neustart auf 0
173 }
174
175
176 if (faultInput == 1)
177 {
178 RELAIS_ResetPuls();
179 BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
180 LEDS_GN_Off();
181 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
182 BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
183 printf("FAULT INPUT EVENT DETECTED!\n");
184 printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
185 smState = SECONDARYPROTECTION_ERROR;
186 }
187
188 if (lvpAndOvpInput == 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_OVP_LVP, LED_RT_ON_TIME_WARN_OVP_AND_LVP_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
194 BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
195 printf("BMS SECONDARY PROTECTION FAULT EVENT DETECTED (LVP & OVP )!\n");
196 printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
197 smState = SECONDARYPROTECTION_ERROR;
198 }
199
200
201}
202
203static void SECONDARYPROTECTION_SM_ManualOn(void)
204{
205 // Prüfe Wechsel in off mode
206 if (BUTTON_GetMode() == BUTTON_OFF)
207 {
208 //Ausschalten muss immer möglich sein
209 RELAIS_ResetPuls();
210 BUZZER_Alarm_Stop();
211 LEDS_GN_Off();
212 LEDS_RT_Off();
213 printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
214 smState = SECONDARYPROTECTION_OFF;
215 }
216
217}
218
219static void SECONDARYPROTECTION_SM_Error(void)
220{
221 int faultInput;
222 int lvpAndOvpInput;
223
224 if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)
225 {
226 faultInput = 1;
227 }
228 else
229 {
230 faultInput = 0;
231 }
232
233
234
235 //Prüfe auf Wechsel des Modus AUTO / SM ON
236 if (BUTTON_GetMode() == BUTTON_AUTO)
237 {
238 if (faultInput == 0)
239 {
240 RELAIS_SetPuls();
241 BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
242 LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
243 LEDS_RT_Off(); //Fehler löschen
244 printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
245 smState = SECONDARYPROTECTION_ON;
246 }
247 else
248 {
249 //Wechsel nicht möglich. Fehler Eingang weiterhin aktiv
250 BUZZER_Beep(BUZZER_ON_TIME_REJECT);
251 BUTTON_SetModeOff();
252 }
253 }
254
255 //Prüfe auf Wechsel in MANUAL ON Mode
256 //Keine Fehlerüberprüfungen. In diesem Modus werdem alle Alarme ignoriert.
257 if (BUTTON_GetMode() == BUTTON_MANUAL_ON)
258 {
259
260 RELAIS_SetPuls();
261 BUZZER_Alarm_Start(BUZZER_ON_TIME_ALARM_MANUAL_MODE, BUZZER_OFF_TIME);
262 LEDS_GN_On();
263 LEDS_RT_Off();
264 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
265 printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
266 smState = SECONDARYPROTECTION_MANUAL_ON;
267 }
268
269
270
271}
272
273
274
275void MODE_SECONDARYPROTECTION_Exec(void)
276{
277
278
279
280 switch (smState)
281 {
282 case SECONDARYPROTECTION_OFF:
283 SECONDARYPROTECTION_SM_Off();
284 break;
285
286 case SECONDARYPROTECTION_ON:
287 SECONDARYPROTECTION_SM_On();
288 break;
289
290 case SECONDARYPROTECTION_MANUAL_ON:
291 SECONDARYPROTECTION_SM_ManualOn();
292 break;
293
294 case SECONDARYPROTECTION_ERROR:
295 SECONDARYPROTECTION_SM_Error();
296 break;
297
298 default:
299 break;
300 }
301}
302
303
Note: See TracBrowser for help on using the repository browser.