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

Last change on this file since 6 was 6, checked in by f.jahn, 3 months ago
File size: 9.8 KB
RevLine 
[6]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* @brief        Prüfen ob LVP Signal abgeschaltet werden muss
46*               LVP Signal kommt vom BMS und schaltet die Lasten ab. Wird hier auch abgeschaltet wenn der Laststrom zu hoch ist,
47*               oder wenn die Geräte Temperatur zu hoch oder zu niedrig ist.
48* @param        kein
49* @retval       kein
50*/
51void OUTPUTS_CheckLVP(void)
52{
53        static uint16_t lastMode;
54
55        if (sys_data.s.parameter.lvpMode == OUTPUTS_LVP_MODE_AUTO)
56        {
57                if (lastMode != OUTPUTS_LVP_MODE_AUTO)
58                {
59                        sys_data.s.values.lvpState = OUTPUTS_LVP_UNKNOWN;
60                }
61
62                if ((sys_data.s.values.lvpState == OUTPUTS_LVP_OK) || (sys_data.s.values.lvpState == OUTPUTS_LVP_UNKNOWN))
63                {
64                        if(sys_data.s.values.batteryVoltage < sys_data.s.parameter.lvpStart)
65                        {
66                                printf("OUTPUTS_LVP_BATTERY_UNDERVOLTAGE\n");
67                                sys_data.s.values.lvpState = OUTPUTS_LVP_BATTERY_UNDERVOLTAGE;
68                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
69                        }
70                        else if(sys_data.s.values.batteryCurrent < ((int32_t)sys_data.s.parameter.loadCurrentLimit*1000))
71                        {
72                                printf("OUTPUTS_LVP_OVERCURRENT\n");
73                                sys_data.s.values.lvpState = OUTPUTS_LVP_OVERCURRENT;
74                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
75                        }
76                        else if(sys_data.s.values.shuntTemperature > sys_data.s.parameter.dischargeStopHighTemperatureStart)
77                        {
78                                printf("OUTPUTS_LVP_SHUNT_OVERTEMPERATURE\n");
79                                sys_data.s.values.lvpState = OUTPUTS_LVP_SHUNT_OVERTEMPERATURE;
80                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
81                        }
82                        else if(sys_data.s.values.chipTemperature > sys_data.s.parameter.dischargeStopHighTemperatureStart)
83                        {
84                                printf("OUTPUTS_LVP_CHIP_OVERTEMPERATURE\n");
85                                sys_data.s.values.lvpState = OUTPUTS_LVP_CHIP_OVERTEMPERATURE;
86                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
87                        }
88                        else if(sys_data.s.values.shuntTemperature < sys_data.s.parameter.dischargeStopLowTemperatureStart)
89                        {
90                                printf("OUTPUTS_LVP_SHUNT_UNDERTEMPERATURE\n");
91                                sys_data.s.values.lvpState = OUTPUTS_LVP_SHUNT_UNDERTEMPERATURE;
92                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
93                        }
94                        else if(sys_data.s.values.chipTemperature < sys_data.s.parameter.dischargeStopLowTemperatureStart)
95                        {
96                                printf("OUTPUTS_LVP_CHIP_OVERTEMPERATURE\n");
97                                sys_data.s.values.lvpState = OUTPUTS_LVP_CHIP_UNDERTEMPERATURE;
98                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
99                        }
100                }
101
102                if ((sys_data.s.values.lvpState != OUTPUTS_LVP_OK) &&
103                        (sys_data.s.values.batteryVoltage > sys_data.s.parameter.lvpStop) &&
104                        (sys_data.s.values.batteryCurrent > ((int32_t)sys_data.s.parameter.loadCurrentLimit * 1000)) &&
105                        (sys_data.s.values.shuntTemperature < sys_data.s.parameter.dischargeStopHighTemperatureStop) &&
106                        (sys_data.s.values.chipTemperature < sys_data.s.parameter.dischargeStopHighTemperatureStop) &&
107                        (sys_data.s.values.shuntTemperature > sys_data.s.parameter.dischargeStopLowTemperatureStop) &&
108                        (sys_data.s.values.chipTemperature > sys_data.s.parameter.dischargeStopLowTemperatureStop))
109                {
110                        //Abschaltkriterien für LVP liegen nicht mehr vor
111                        //Wenn Abschaltung aufgrund zu hohem Lade/Lastrom erfolgt ist, muss Fehler durch Geräte Reset zurück gesetzt werden
112                        //Andere Fehler automatisches Reset, wenn Fehler nicht mehr vorliegt.
113                        //Kunde könnte automatische Reset verhindern, indem er die Stop Werte anders programmiert
114                        //z.B.
115                        //Temperabschaltung Start 80°C
116                        //Temperaturabschaltung Stop -99°C
117                        if (sys_data.s.values.lvpState != OUTPUTS_LVP_OVERCURRENT)
118                        {
119                                //Andere Fehler, automatisches zurücksetzen, wenn keine Fehlerbedingungen mehr vorliegen
120                                printf("OUTPUT LVP OK\n");
121                                sys_data.s.values.lvpState = OUTPUTS_LVP_OK;
122                                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_ALLOWED);
123                        }
124                }
125        }
126        else if (sys_data.s.parameter.lvpMode == OUTPUTS_LVP_MODE_MANUAL_ON)
127        {
128                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_ALLOWED);
129        }
130        else if (sys_data.s.parameter.lvpMode == OUTPUTS_LVP_MODE_MANUAL_OFF)
131        {
132                HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
133        }
134        else HAL_GPIO_WritePin(LVP_ENABLE_GPIO_Port, LVP_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
135
136        lastMode = sys_data.s.parameter.lvpMode;
137}
138
139/*
140* @brief        Prüfen ob OVP Signal abgeschaltet werden muss
141*               OVP Signal kommt vom BMS und schaltet die Ladequellen ab. Wird hier auch abgeschaltet wenn der Ladestrom zu hoch ist,
142*               oder wenn die Geräte Temperatur zu hoch oder zu niedrig ist.
143* @param        kein
144* @retval       kein
145*/
146void OUTPUTS_CheckOVP(void)
147{
148        static uint16_t lastMode;
149
150        if (sys_data.s.parameter.ovpMode == OUTPUTS_OVP_MODE_AUTO)
151        {
152                if (lastMode != OUTPUTS_OVP_MODE_AUTO)
153                {
154                        sys_data.s.values.ovpState = OUTPUTS_OVP_UNKNOWN;
155                }
156
157                if ((sys_data.s.values.ovpState == OUTPUTS_OVP_OK) || (sys_data.s.values.ovpState == OUTPUTS_OVP_UNKNOWN))
158                {
159                        if(sys_data.s.values.batteryVoltage > sys_data.s.parameter.ovpStart)
160                        {
161                                printf("OUTPUTS_OVP_BATTERY_OVERVOLTAGE\n");
162                                sys_data.s.values.ovpState = OUTPUTS_OVP_BATTERY_OVERVOLTAGE;
163                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
164                        }
165                        else if(sys_data.s.values.batteryCurrent > ((int32_t) sys_data.s.parameter.chargeCurrentLimit * 1000))
166                        {
167                                printf("OUTPUTS_OVP_OVERCURRENT\n");
168                                sys_data.s.values.ovpState = OUTPUTS_OVP_OVERCURRENT;
169                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
170                        }
171                        else if(sys_data.s.values.shuntTemperature > sys_data.s.parameter.chargeStopHighTemperatureStart)
172                        {
173                                printf("OUTPUTS_OVP_SHUNT_OVERTEMPERATURE\n");
174                                sys_data.s.values.ovpState = OUTPUTS_OVP_SHUNT_OVERTEMPERATURE;
175                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
176                        }
177                        else if(sys_data.s.values.chipTemperature > sys_data.s.parameter.chargeStopHighTemperatureStart)
178                        {
179                                printf("OUTPUTS_OVP_CHIP_OVERTEMPERATURE\n");
180                                sys_data.s.values.ovpState = OUTPUTS_OVP_CHIP_OVERTEMPERATURE;
181                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
182                        }
183                        else if(sys_data.s.values.shuntTemperature < sys_data.s.parameter.chargeStopLowTemperatureStart)
184                        {
185                                printf("OUTPUTS_OVP_SHUNT_UNDERTEMPERATURE\n");
186                                sys_data.s.values.ovpState = OUTPUTS_OVP_SHUNT_UNDERTEMPERATURE;
187                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
188                        }
189                        else if(sys_data.s.values.chipTemperature < sys_data.s.parameter.chargeStopLowTemperatureStart)
190                        {
191                                printf("OUTPUTS_OVP_CHIP_UNDETEMPERATURE\n");
192                                sys_data.s.values.ovpState = OUTPUTS_OVP_CHIP_UNDERTEMPERATURE;
193                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
194                        }
195                }
196
197                if ((sys_data.s.values.ovpState != OUTPUTS_OVP_OK) &&
198                        (sys_data.s.values.batteryVoltage < sys_data.s.parameter.ovpStop) &&
199                        (sys_data.s.values.batteryCurrent < ( (int32_t) sys_data.s.parameter.chargeCurrentLimit*1000)) &&
200                        (sys_data.s.values.shuntTemperature < sys_data.s.parameter.chargeStopHighTemperatureStop) &&
201                        (sys_data.s.values.chipTemperature < sys_data.s.parameter.chargeStopHighTemperatureStop) &&
202                        (sys_data.s.values.shuntTemperature > sys_data.s.parameter.chargeStopLowTemperatureStop) &&
203                        (sys_data.s.values.chipTemperature > sys_data.s.parameter.chargeStopLowTemperatureStop))
204                {
205                        //Abschaltkriterien für OVP liegen nicht mehr vor
206                        //Wenn Abschaltung aufgrund zu hohem Lade/Lastrom erfolgt ist, dann muss Rücksetzen durch Reset Button erfolgen
207                        //Andere Fehler, automatisches zurücksetzen, wenn keine Fehlerbedingungen mehr vorliegen
208                        if (sys_data.s.values.ovpState != OUTPUTS_OVP_OVERCURRENT)
209                        {
210                                printf("OUTPUT OVP OK\n");
211                                sys_data.s.values.ovpState = OUTPUTS_OVP_OK;
212                                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_ALLOWED);
213                        }
214                }
215        }
216        else if (sys_data.s.parameter.ovpMode == OUTPUTS_OVP_MODE_MANUAL_ON)
217        {
218                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_ALLOWED);
219        }
220        else if (sys_data.s.parameter.ovpMode == OUTPUTS_OVP_MODE_MANUAL_OFF)
221        {
222                HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
223        }
224        else HAL_GPIO_WritePin(OVP_ENABLE_GPIO_Port, OVP_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
225
226        lastMode = sys_data.s.parameter.ovpMode;
227}
228/*************************** End of file ****************************/
Note: See TracBrowser for help on using the repository browser.