source: trunk/firmware/Src/outputs_Kopie.c @ 6

Last change on this file since 6 was 6, checked in by f.jahn, 3 months ago
File size: 9.6 KB
Line 
1/*******************************************************************************
2*
3* @file    outputs.c
4* @author  ECS, Falko Jahn
5* @version V1.0.0
6* @date    2020-05-01
7* @brief       
8*
9*******************************************************************************/
10
11//--- INCLUDES -----------------------------------------------------------------
12#include "outputs.h"
13#include "main.h"
14#include "stdio.h"
15#include "sysdata.h"
16//--- EXTERNE VARIABLEN --------------------------------------------------------
17
18//--- LOKALE DEFINES - bitte hier dokumentieren --------------------------------
19
20//--- LOKALE TYPE DEFS - bitte hier dokumentieren-------------------------------
21
22//--- DEFINITIONEN GLOBALER VARIABLEN - Bitte in Header dokumentieren ----------
23
24//--- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------
25
26//--- LOKALE FUNKTIONS PROTOTYPEN ----------------------------------------------
27/*
28* @brief
29* @param        kein
30* @retval       kein
31*/
32//--- LOKALE FUNKTIONEN - bitte hier dokumentieren -----------------------------
33
34
35
36//      --- GLOBALE FUNKTIONEN - bitte in Header dokumentieren----------------------
37void OUTPUTS_Init(void)
38{
39  sys_data.s.values.lvpState = OUTPUTS_LVP_UNKNOWN;
40  sys_data.s.values.ovpState = OUTPUTS_OVP_UNKNOWN;
41
42}
43
44//------------------------------------------------------------------------------
45
46/*
47* @brief        Prüfen ob LVP Signal abgeschaltet werden muss
48*               LVP Signal kommt vom BMS und schaltet die Lasten ab. Wird hier
49*                               auch abgeschaltet wenn der Laststrom zu hoch ist, oder wenn die
50*                               Geräte Temperatur zu hoch oder zu niedrig ist.
51* @param        kein
52* @retval       kein
53*/
54void OUTPUTS_CheckLVP(void)
55{
56        if (sys_data.s.parameter.lvpMode == OUTPUTS_LVP_MODE_AUTO)
57        {
58                if ((sys_data.s.values.lvpState == OUTPUTS_LVP_OK) || (sys_data.s.values.lvpState == OUTPUTS_LVP_UNKNOWN))
59                {
60                        if(sys_data.s.values.batteryVoltage < sys_data.s.parameter.lvpStart)
61                        {
62                                printf("OUTPUTS_LVP_BATTERY_UNDERVOLTAGE\n");
63                                sys_data.s.values.lvpState = OUTPUTS_LVP_BATTERY_UNDERVOLTAGE;
64                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
65                        }
66                        else if(sys_data.s.values.batteryCurrent < ((int32_t)sys_data.s.parameter.loadCurrentLimit*1000))
67                        {
68                                printf("OUTPUTS_LVP_OVERCURRENT\n");
69                                sys_data.s.values.lvpState = OUTPUTS_LVP_OVERCURRENT;
70                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
71                        }
72                        else if(sys_data.s.values.shuntTemperature > sys_data.s.parameter.dischargeStopHighTemperatureStart)
73                        {
74                                printf("OUTPUTS_LVP_SHUNT_OVERTEMPERATURE\n");
75                                sys_data.s.values.lvpState = OUTPUTS_LVP_SHUNT_OVERTEMPERATURE;
76                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
77                        }
78                        else if(sys_data.s.values.chipTemperature > sys_data.s.parameter.dischargeStopHighTemperatureStart)
79                        {
80                                printf("OUTPUTS_LVP_CHIP_OVERTEMPERATURE\n");
81                                sys_data.s.values.lvpState = OUTPUTS_LVP_CHIP_OVERTEMPERATURE;
82                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
83                        }
84                        else if(sys_data.s.values.shuntTemperature < sys_data.s.parameter.dischargeStopLowTemperatureStart)
85                        {
86                                printf("OUTPUTS_LVP_SHUNT_UNDERTEMPERATURE\n");
87                                sys_data.s.values.lvpState = OUTPUTS_LVP_SHUNT_UNDERTEMPERATURE;
88                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
89                        }
90                        else if(sys_data.s.values.chipTemperature < sys_data.s.parameter.dischargeStopLowTemperatureStart)
91                        {
92                                printf("OUTPUTS_LVP_CHIP_OVERTEMPERATURE\n");
93                                sys_data.s.values.lvpState = OUTPUTS_LVP_CHIP_UNDERTEMPERATURE;
94                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
95                        }
96                }
97
98                if ((sys_data.s.values.lvpState != OUTPUTS_LVP_OK) &&
99                        (sys_data.s.values.batteryVoltage > sys_data.s.parameter.lvpStop) &&
100                        (sys_data.s.values.batteryCurrent > ((int32_t)sys_data.s.parameter.loadCurrentLimit * 1000)) &&
101                        (sys_data.s.values.shuntTemperature < sys_data.s.parameter.dischargeStopHighTemperatureStop) &&
102                        (sys_data.s.values.chipTemperature < sys_data.s.parameter.dischargeStopHighTemperatureStop) &&
103                        (sys_data.s.values.shuntTemperature > sys_data.s.parameter.dischargeStopLowTemperatureStop) &&
104                        (sys_data.s.values.chipTemperature > sys_data.s.parameter.dischargeStopLowTemperatureStop))
105                {
106                        //Abschaltkriterien für LVP liegen nicht mehr vor
107                        //Wenn Abschaltung aufgrund zu hohem Lade/Lastrom erfolgt ist, muss Fehler durch Geräte Reset zurück gesetzt werden
108                        //Andere Fehler automatisches Reset, wenn Fehler nicht mehr vorliegt.
109                        //Kunde könnte automatische Reset verhindern, indem er die Stop Werte anders programmiert
110                        //z.B.
111                        //Temperabschaltung Start 80°C
112                        //Temperaturabschaltung Stop -99°C
113                        if (sys_data.s.values.lvpState != OUTPUTS_LVP_OVERCURRENT)
114                        {
115                                //Andere Fehler, automatisches zurücksetzen, wenn keine Fehlerbedingungen mehr vorliegen
116                                printf("OUTPUT LVP OK\n");
117                                sys_data.s.values.lvpState = OUTPUTS_LVP_OK;
118                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_ALLOWED);
119                        }
120                }
121        }
122        else if (sys_data.s.parameter.lvpMode == OUTPUTS_LVP_MODE_MANUAL_ON) HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_ALLOWED);
123        else if (sys_data.s.parameter.lvpMode == OUTPUTS_LVP_MODE_MANUAL_OFF) HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
124        else HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
125}
126
127//------------------------------------------------------------------------------
128
129/*
130* @brief        Prüfen ob OVP Signal abgeschaltet werden muss
131*               OVP Signal kommt vom BMS und schaltet die Ladequellen ab.
132*                               Wird hier auch abgeschaltet wenn der Ladestrom zu hoch ist,
133*               oder wenn die Geräte Temperatur zu hoch oder zu niedrig ist.
134* @param        kein
135* @retval       kein
136*/
137void OUTPUTS_CheckOVP(void)
138{
139        if (sys_data.s.parameter.ovpMode == OUTPUTS_OVP_MODE_AUTO)
140        {
141                if ((sys_data.s.values.ovpState == OUTPUTS_OVP_OK) || (sys_data.s.values.ovpState == OUTPUTS_OVP_UNKNOWN))
142                {
143                        if(sys_data.s.values.batteryVoltage > sys_data.s.parameter.ovpStart)
144                        {
145                                printf("OUTPUTS_OVP_BATTERY_OVERVOLTAGE\n");
146                                sys_data.s.values.ovpState = OUTPUTS_OVP_BATTERY_OVERVOLTAGE;
147                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
148                        }
149                        else if(sys_data.s.values.batteryCurrent > ((int32_t) sys_data.s.parameter.chargeCurrentLimit * 1000))
150                        {
151                                printf("OUTPUTS_OVP_OVERCURRENT\n");
152                                sys_data.s.values.ovpState = OUTPUTS_OVP_OVERCURRENT;
153                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
154                        }
155                        else if(sys_data.s.values.shuntTemperature > sys_data.s.parameter.chargeStopHighTemperatureStart)
156                        {
157                                printf("OUTPUTS_OVP_SHUNT_OVERTEMPERATURE\n");
158                                sys_data.s.values.ovpState = OUTPUTS_OVP_SHUNT_OVERTEMPERATURE;
159                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
160                        }
161                        else if(sys_data.s.values.chipTemperature > sys_data.s.parameter.chargeStopHighTemperatureStart)
162                        {
163                                printf("OUTPUTS_OVP_CHIP_OVERTEMPERATURE\n");
164                                sys_data.s.values.ovpState = OUTPUTS_OVP_CHIP_OVERTEMPERATURE;
165                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
166                        }
167                        else if(sys_data.s.values.shuntTemperature < sys_data.s.parameter.chargeStopLowTemperatureStart)
168                        {
169                                printf("OUTPUTS_OVP_SHUNT_UNDERTEMPERATURE\n");
170                                sys_data.s.values.ovpState = OUTPUTS_OVP_SHUNT_UNDERTEMPERATURE;
171                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
172                        }
173                        else if(sys_data.s.values.chipTemperature < sys_data.s.parameter.chargeStopLowTemperatureStart)
174                        {
175                                printf("OUTPUTS_OVP_CHIP_UNDETEMPERATURE\n");
176                                sys_data.s.values.ovpState = OUTPUTS_OVP_CHIP_UNDERTEMPERATURE;
177                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
178                        }
179                }
180
181                if ((sys_data.s.values.ovpState != OUTPUTS_OVP_OK) &&
182                        (sys_data.s.values.batteryVoltage < sys_data.s.parameter.ovpStop) &&
183                        (sys_data.s.values.batteryCurrent < ( (int32_t) sys_data.s.parameter.chargeCurrentLimit*1000)) &&
184                        (sys_data.s.values.shuntTemperature < sys_data.s.parameter.chargeStopHighTemperatureStop) &&
185                        (sys_data.s.values.chipTemperature < sys_data.s.parameter.chargeStopHighTemperatureStop) &&
186                        (sys_data.s.values.shuntTemperature > sys_data.s.parameter.chargeStopLowTemperatureStop) &&
187                        (sys_data.s.values.chipTemperature > sys_data.s.parameter.chargeStopLowTemperatureStop))
188                {
189                        //Abschaltkriterien für OVP liegen nicht mehr vor
190                        //Wenn Abschaltung aufgrund zu hohem Lade/Lastrom erfolgt ist, dann muss Rücksetzen durch Reset Button erfolgen
191                        //Andere Fehler, automatisches zurücksetzen, wenn keine Fehlerbedingungen mehr vorliegen
192                        if (sys_data.s.values.ovpState != OUTPUTS_OVP_OVERCURRENT)
193                        {
194                                printf("OUTPUT OVP OK\n");
195                                sys_data.s.values.ovpState = OUTPUTS_OVP_OK;
196                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_ALLOWED);
197                        }
198                }
199        }
200        else if (sys_data.s.parameter.ovpMode == OUTPUTS_OVP_MODE_MANUAL_ON) HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_ALLOWED);
201        else if (sys_data.s.parameter.ovpMode == OUTPUTS_OVP_MODE_MANUAL_OFF) HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
202        else HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
203}
204/******************************* End of file **********************************/
Note: See TracBrowser for help on using the repository browser.