source: trunk/fw_g473rct/SES/src/outputs.c@ 20

Last change on this file since 20 was 20, checked in by f.jahn, 4 months ago

adc dma funktioniert und modbus funktioniert

File size: 10.0 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* @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(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_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(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_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(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_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(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_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(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_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(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_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(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_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(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_ENABLE_Pin, OUTPUTS_DISCHARGE_ALLOWED);
129 }
130 else if (sys_data.s.parameter.lvpMode == OUTPUTS_LVP_MODE_MANUAL_OFF)
131 {
132 HAL_GPIO_WritePin(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
133 }
134 else HAL_GPIO_WritePin(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_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(CHARGE_ENABLE_GPIO_Port, CHARGE_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(CHARGE_ENABLE_GPIO_Port, CHARGE_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(CHARGE_ENABLE_GPIO_Port, CHARGE_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(CHARGE_ENABLE_GPIO_Port, CHARGE_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(CHARGE_ENABLE_GPIO_Port, CHARGE_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(CHARGE_ENABLE_GPIO_Port, CHARGE_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(CHARGE_ENABLE_GPIO_Port, CHARGE_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(CHARGE_ENABLE_GPIO_Port, CHARGE_ENABLE_Pin, OUTPUTS_CHARGE_ALLOWED);
219 }
220 else if (sys_data.s.parameter.ovpMode == OUTPUTS_OVP_MODE_MANUAL_OFF)
221 {
222 HAL_GPIO_WritePin(CHARGE_ENABLE_GPIO_Port, CHARGE_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
223 }
224 else HAL_GPIO_WritePin(CHARGE_ENABLE_GPIO_Port, CHARGE_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.