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

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