source: trunk/firmware_v3/STM32CubeIDE/src/mode_secondaryprotection.c@ 41

Last change on this file since 41 was 41, checked in by f.jahn, 7 days ago

V3 Version soweit fertig. Relais ansteuerung, modbus, temperatursensor ist implementiert
Commit vor Änderung auf neuen Controller mit mehr Speicher

File size: 7.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// Ansonsten wie Modus 0
5
6
7
8#include "stdio.h"
9#include "mode_secondaryprotection.h"
10#include "button.h"
11#include "relais.h"
12#include "main.h"
13#include "leds.h"
14#include "buzzer.h"
15
16#define LED_RT_OFF_TIME 1000
17#define LED_RT_ON_TIME_WARN_MANUAL_MODE 200
18#define LED_RT_ON_TIME_WARN_FAULT_INPUT 500
19#define LED_RT_ON_TIME_WARN_OVP_AND_LVP_INPUT 1000
20
21#define LED_GN_OFF_TIME 1000
22#define LED_GN_ON_TIME_ON_MODE 200
23
24#define BUZZER_OFF_TIME 1000
25#define BUZZER_ON_TIME_CONFIRM 200
26#define BUZZER_ON_TIME_REJECT 500
27#define BUZZER_ON_TIME_ALARM_MANUAL_MODE 200
28
29typedef enum SECONDARYPROTECTION_State_enum
30{
31 SECONDARYPROTECTION_OFF,
32 SECONDARYPROTECTION_ON,
33 SECONDARYPROTECTION_MANUAL_ON,
34 SECONDARYPROTECTION_ERROR
35} SECONDARYPROTECTION_state_t;
36
37
38static SECONDARYPROTECTION_state_t smState;
39
40
41void 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 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_Blink_Start(LED_RT_ON_TIME_WARN_MANUAL_MODE, LED_GN_OFF_TIME);
98 printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
99 smState = SECONDARYPROTECTION_MANUAL_ON;
100 }
101
102
103
104}
105
106void 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 (faultInput == 1)
157 {
158 RELAIS_ResetPuls();
159 BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
160 LEDS_GN_Off();
161 LEDS_RT_Blink_Start(LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_RT_OFF_TIME); //Fehlercode fault
162 BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
163 printf("FAULT INPUT EVENT DETECTED!\n");
164 printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
165 smState = SECONDARYPROTECTION_ERROR;
166 }
167
168 if (lvpAndOvpInput == 1)
169 {
170 RELAIS_ResetPuls();
171 BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
172 LEDS_GN_Off();
173 LEDS_RT_Blink_Start(LED_RT_ON_TIME_WARN_OVP_AND_LVP_INPUT, LED_RT_OFF_TIME); //Fehlercode fault
174 BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
175 printf("BMS SECONDARY PROTECTION FAULT EVENT DETECTED (LVP & OVP )!\n");
176 printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
177 smState = SECONDARYPROTECTION_ERROR;
178 }
179
180
181}
182
183void SECONDARYPROTECTION_SM_ManualOn(void)
184{
185 // Prüfe Wechsel in off mode
186 if (BUTTON_GetMode() == BUTTON_OFF)
187 {
188 //Ausschalten muss immer möglich sein
189 RELAIS_ResetPuls();
190 BUZZER_Alarm_Stop();
191 LEDS_GN_Off();
192 LEDS_RT_Off();
193 printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
194 smState = SECONDARYPROTECTION_OFF;
195 }
196
197}
198
199void SECONDARYPROTECTION_SM_Error(void)
200{
201 int faultInput;
202 int lvpAndOvpInput;
203
204 if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)
205 {
206 faultInput = 1;
207 }
208 else
209 {
210 faultInput = 0;
211 }
212
213
214
215 //Prüfe auf Wechsel des Modus AUTO / SM ON
216 if (BUTTON_GetMode() == BUTTON_AUTO)
217 {
218 if (faultInput == 0)
219 {
220 RELAIS_SetPuls();
221 BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
222 LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
223 LEDS_RT_Off(); //Fehler löschen
224 printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
225 smState = SECONDARYPROTECTION_ON;
226 }
227 else
228 {
229 //Wechsel nicht möglich. Fehler Eingang weiterhin aktiv
230 BUZZER_Beep(BUZZER_ON_TIME_REJECT);
231 BUTTON_SetModeOff();
232 }
233 }
234
235 //Prüfe auf Wechsel in MANUAL ON Mode
236 //Keine Fehlerüberprüfungen. In diesem Modus werdem alle Alarme ignoriert.
237 if (BUTTON_GetMode() == BUTTON_MANUAL_ON)
238 {
239
240 RELAIS_SetPuls();
241 BUZZER_Alarm_Start(BUZZER_ON_TIME_ALARM_MANUAL_MODE, BUZZER_OFF_TIME);
242 LEDS_GN_On();
243 LEDS_RT_Off();
244 LEDS_RT_Blink_Start(LED_RT_ON_TIME_WARN_MANUAL_MODE, LED_RT_OFF_TIME);
245 printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
246 smState = SECONDARYPROTECTION_MANUAL_ON;
247 }
248
249
250
251}
252
253
254
255void MODE_SECONDARYPROTECTION_Exec(void)
256{
257
258
259
260 switch (smState)
261 {
262 case SECONDARYPROTECTION_OFF:
263 SECONDARYPROTECTION_SM_Off();
264 break;
265
266 case SECONDARYPROTECTION_ON:
267 SECONDARYPROTECTION_SM_On();
268 break;
269
270 case SECONDARYPROTECTION_MANUAL_ON:
271 SECONDARYPROTECTION_SM_ManualOn();
272 break;
273
274 case SECONDARYPROTECTION_ERROR:
275 SECONDARYPROTECTION_SM_Error();
276 break;
277
278 default:
279 break;
280 }
281}
282
283
Note: See TracBrowser for help on using the repository browser.