source: trunk/firmware_v2/SES/src/mode_lvp_ovp.c@ 17

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