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

Last change on this file since 17 was 17, checked in by f.jahn, 9 days 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.