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

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