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

Last change on this file was 24, checked in by f.jahn, 4 days ago
LVP, OVP, LVP
OVP modes implementiert
  • Lüftersteuerung in eigenes Modul verlagert
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// 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 "chip_temperature.h"
25#include "voltage_meas.h"
26
27
28typedef enum SECONDARYPROTECTION_State_enum
29{
30  SECONDARYPROTECTION_OFF, 
31  SECONDARYPROTECTION_ON,
32 // SECONDARYPROTECTION_MANUAL_ON,
33  SECONDARYPROTECTION_ERROR
34} SECONDARYPROTECTION_state_t;
35
36
37static SECONDARYPROTECTION_state_t smState;
38
39
40static void SECONDARYPROTECTION_SM_Off(void)
41{
42  int faultInput;
43  int lvpAndOvpInput;
44
45  if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
46  {
47    faultInput = 1;
48  }
49  else
50  {
51    faultInput = 0;
52  }
53
54  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))
55  {
56    lvpAndOvpInput = 1;
57  }else {
58    lvpAndOvpInput = 0;
59  }
60
61 
62
63
64  //Prüfe auf Wechsel des Modus AUTO / SM ON
65  if (BUTTON_GetMode() == BUTTON_AUTO)
66  {
67    if (faultInput == 0) 
68    {
69      RELAIS_SetPuls();
70      BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
71      LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
72      printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
73      smState = SECONDARYPROTECTION_ON;
74
75    }
76    else   
77    {
78      //Wechsel nicht möglich. Fehler Eingang aktiv
79      BUZZER_Beep(BUZZER_ON_TIME_REJECT);
80      BUTTON_SetModeOff();
81      //LEDS_RT_Blink_Start(LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_GN_OFF_TIME); //Fehler Anzeigen
82          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
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_BlinkCode_Start(BLINK_CODE_WARN_MANUAL, LED_RT_ON_TIME_WARN_MANUAL_MODE, LED_RT_OFF_TIME, LED_RT_OFF_TIME * 5); //Fehler Anzeigen
98  //    printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
99  //    smState = SECONDARYPROTECTION_MANUAL_ON;
100  //}
101
102
103
104}
105
106static void 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 (VOLTAGE_MEAS_GetLimitAlarm() == 1)
157  {
158          RELAIS_ResetPuls();
159          BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
160          LEDS_GN_Off();
161          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
162          BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
163          printf("FAULT VOLTAGE DROP DETECTED!\n");
164          printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
165          smState = SECONDARYPROTECTION_ERROR; 
166          VOLTAGE_MEAS_ResetCounter(); // Damit Fehlerzähler bei Neustart auf 0
167  }
168
169
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: SECONDARYPROTECTION_ERROR\n");
179    smState = SECONDARYPROTECTION_ERROR;
180  }
181
182  if (lvpAndOvpInput == 1)
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    BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
189    printf("BMS SECONDARY PROTECTION FAULT EVENT DETECTED (LVP & OVP )!\n");
190    printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
191    smState = SECONDARYPROTECTION_ERROR;
192  }
193
194  if (CHIP_TEMPERATURE_GetTemp() > 80)
195  {
196        RELAIS_ResetPuls();
197        BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
198        LEDS_GN_Off();
199        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
200        BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
201        printf("NEW_STATE: MAINSWITCH_ERROR, Temp too high\n");
202        smState = SECONDARYPROTECTION_ERROR;         
203  }
204
205
206
207}
208
209//static void SECONDARYPROTECTION_SM_ManualOn(void)
210//{
211//  // Prüfe Wechsel in off mode
212//  if (BUTTON_GetMode() == BUTTON_OFF)
213//  {
214//    //Ausschalten muss immer möglich sein
215//    RELAIS_ResetPuls();
216//    BUZZER_Alarm_Stop();
217//    LEDS_GN_Off();
218//    LEDS_RT_Off();
219//    printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
220//    smState = SECONDARYPROTECTION_OFF;
221//  }
222
223//}
224
225static void SECONDARYPROTECTION_SM_Error(void)
226{
227  int faultInput;
228  int lvpAndOvpInput;
229
230  if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
231  {
232    faultInput = 1;
233  }
234  else
235  {
236    faultInput = 0;
237  }
238
239
240
241  //Prüfe auf Wechsel des Modus AUTO / SM ON
242  if (BUTTON_GetMode() == BUTTON_AUTO)
243  {
244    if (faultInput == 0) 
245    {
246      RELAIS_SetPuls();
247      BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
248      LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
249      LEDS_RT_Off(); //Fehler löschen
250      printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
251      smState = SECONDARYPROTECTION_ON;
252    }
253    else
254    {
255      //Wechsel nicht möglich. Fehler Eingang weiterhin aktiv
256      BUZZER_Beep(BUZZER_ON_TIME_REJECT);
257      BUTTON_SetModeOff();
258    }
259  }
260
261  //Prüfe auf Wechsel in MANUAL ON Mode
262  //Keine Fehlerüberprüfungen. In diesem Modus werdem alle Alarme ignoriert.
263  //if (BUTTON_GetMode() == BUTTON_MANUAL_ON)
264  //{
265     
266  //    RELAIS_SetPuls();
267  //    BUZZER_Alarm_Start(BUZZER_ON_TIME_ALARM_MANUAL_MODE, BUZZER_OFF_TIME);
268  //    LEDS_GN_On();
269  //    LEDS_RT_Off();
270  //    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
271  //    printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
272  //    smState = SECONDARYPROTECTION_MANUAL_ON;
273  //}
274
275
276
277}
278
279
280
281void MODE_SECONDARYPROTECTION_PLUS_Exec(void)
282{
283
284 
285
286  switch (smState)
287  {
288    case SECONDARYPROTECTION_OFF:
289      SECONDARYPROTECTION_SM_Off();
290    break;
291
292    case SECONDARYPROTECTION_ON:
293      SECONDARYPROTECTION_SM_On();
294    break;
295
296    //case SECONDARYPROTECTION_MANUAL_ON:
297      //SECONDARYPROTECTION_SM_ManualOn();
298    //break;
299
300    case SECONDARYPROTECTION_ERROR:
301      SECONDARYPROTECTION_SM_Error();
302    break;
303
304    default:
305    break;
306  }
307}
308
309
Note: See TracBrowser for help on using the repository browser.