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

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

24V Version implementiert

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