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

Last change on this file since 28 was 28, checked in by f.jahn, 8 weeks ago

24V Version implementiert

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