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

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