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

Last change on this file since 34 was 6, checked in by f.jahn, 8 months ago
File size: 9.6 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
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.