Ignore:
Timestamp:
Aug 23, 2025, 3:27:52 PM (4 days ago)
Author:
f.jahn
Message:
LVP, OVP, LVP
OVP modes implementiert
  • Lüftersteuerung in eigenes Modul verlagert
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/firmware_v2/SES/src/mode_lvp.c

    r17 r24  
    11
    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
     2// Wie LVP||OVP Modul
     3// Jedoch hier nur LVP
    214
    225
     
    2912#include "leds.h"
    3013#include "buzzer.h"
    31 
     14#include "chip_temperature.h"
    3215
    3316
     
    4730{
    4831  int faultInput;
    49   int lvpInput;
     32
    5033
    5134  if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
     
    5841  }
    5942
    60   if (HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_SET)
    61   {
    62     lvpInput = 1;
    63   }else {
    64     lvpInput = 0;
    65   }
    6643
    6744 
     
    7653      BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
    7754      LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
    78       printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
     55      printf("LVP_SM_Off: NEW_STATE: LVP_ON\n");
    7956      smState = LVP_ON;
    8057
     
    8764      //LEDS_RT_Blink_Start(LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_GN_OFF_TIME); //Fehler Anzeigen
    8865          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");
     66      printf("LVP_SM_Off: NEW_STATE: LVP_ERROR_FAULT_INPUT\n");
    9067      smState =LVP_ERROR;
    9168    }
     
    10279      LEDS_GN_On();
    10380      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");
     81      printf("NEW_STATE: LVP_MANUAL_ON\n");
    10582      smState = LVP_MANUAL_ON;
    10683  }
     
    11390{
    11491  int faultInput = 0;
    115   int lvpInput = 0;
    116   static int lvpInputTimeCounter = 0;
     92  static int lvpInput = 0;
     93  static int lvpTimeCounter = 0;
    11794  static int oldtime;
    11895
     
    126103  }
    127104 
    128   if (HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_RESET)
     105  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))
    129106  {
    130107    if (HAL_GetTick() != oldtime)
    131108    {
    132       lvpInputTimeCounter++;
    133       if (lvpInputTimeCounter > 30000)
     109      if (lvpTimeCounter < 5000) lvpTimeCounter++;
     110      if (lvpTimeCounter >= 5000)
    134111      {
    135         lvpInput = 0;
    136         lvpInputTimeCounter=0;
     112        lvpInput = 1;
     113        lvpTimeCounter=0;
    137114      }
    138115      oldtime = HAL_GetTick();
    139116    }
    140117  }
    141   else
    142   {
    143     lvpInputTimeCounter = 0;
    144     lvpInput = 1;
     118
     119  if (HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_RESET)
     120  {
     121//    if (HAL_GetTick() != oldtime)
     122//    {
     123//      lvpAndOvpInputTimeCounter++;
     124//      if (lvpAndOvpInputTimeCounter > 30000)
     125//      {
     126        lvpInput = 0;
     127        lvpTimeCounter=0;
     128//      }
     129//      oldtime = HAL_GetTick();
     130//    }
    145131  }
    146132
    147133 
     134
     135
     136  //Prüfe auf Fehlermode
     137  if (faultInput == 1)
     138  {
     139    RELAIS_ResetPuls();
     140    BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
     141    LEDS_GN_Off();
     142    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
     143    BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
     144    printf("FAULT INPUT EVENT DETECTED!\n");
     145    printf("NEW_STATE: LVP_ERROR\n");
     146    smState = LVP_ERROR;
     147  }
     148
     149    if (CHIP_TEMPERATURE_GetTemp() > 80)
     150  {
     151        RELAIS_ResetPuls();
     152        BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
     153        LEDS_GN_Off();
     154        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
     155        BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
     156        printf("NEW_STATE: MAINSWITCH_ERROR, Temp too high\n");
     157        smState = LVP_ERROR;         
     158  }
     159
     160
     161  //LVP oder OVP hat stattgefunden, und Relais ist ein, dann aus
     162  if ((lvpInput == 1) && (RELAIS_GetState() == 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_OVP_LVP, LED_RT_ON_TIME_WARN_OVP_AND_LVP_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
     168    printf("LVP OFF!\n");
     169    printf("NEW_STATE: LVP_Auto On, Relais off\n");
     170   
     171  }
     172
     173  //KEIN LVP und keine OVP Abschaltung, Relais ist aber noch aus, dann einschalten
     174  if ((lvpInput == 0) && (RELAIS_GetState() == 0))
     175  {
     176    RELAIS_SetPuls();
     177    BUZZER_Beep(BUZZER_ON_TIME_CONFIRM); //Warnung
     178    LEDS_GN_Off();
     179    LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
     180    printf("LVP ON!\n");
     181    printf("NEW_STATE: LVP_OVP_Auto On, Relais on\n");
     182   
     183  }
    148184
    149185  // Prüfe Wechsel in off mode
     
    155191    LEDS_GN_Off();
    156192    LEDS_RT_Off();
    157     printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
     193    printf("NEW_STATE: LVP_OFF\n");
    158194    smState = LVP_OFF;
    159   }
    160 
    161   //Prüfe auf Fehlermode
    162   if (faultInput == 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_FAULT_INPUT, LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
    168     BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
    169     printf("FAULT INPUT EVENT DETECTED!\n");
    170     printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
    171     smState = LVP_ERROR;
    172   }
    173 
    174   if ((lvpInput == 0) && ( RELAIS_GetState() == 1))
    175   {
    176     RELAIS_ResetPuls();
    177     BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
    178     LEDS_GN_Off();
    179     BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
    180     printf("LVP FALLING EVENT DETECTED!\n");
    181     printf("NEW_STATE: LVP OFF\n");
    182   }
    183 
    184 
    185   //Einkommentieren für auto Reconnect
    186   //if ((lvpInput == 1) && ( RELAIS_GetState() == 0))
    187   //{
    188   //  RELAIS_SetPuls();
    189   //  BUZZER_Beep(BUZZER_ON_TIME_CONFIRM); //Warnung
    190   //  LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
    191   //  BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
    192   //  printf("BMS SECONDARY PROTECTION FAULT EVENT DETECTED (LVP & OVP )!\n");
    193   //  printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
    194   //}
     195        //Damit beim drücken auf on erstmal eingeschaltet wird
     196        lvpTimeCounter=0;
     197        lvpInput = 0;
     198  }
    195199
    196200
     
    259263      LEDS_RT_Off();
    260264      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
    261       printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
     265      printf("NEW_STATE: LVP_MANUAL_ON\n");
    262266      smState = LVP_MANUAL_ON;
    263267  }
     
    277281  {
    278282    case LVP_OFF:
    279       LVP_SM_Off();
     283     LVP_SM_Off();
    280284    break;
    281285
Note: See TracChangeset for help on using the changeset viewer.