source: ecs_cellMon/firmware/src/balancer.c@ 8

Last change on this file since 8 was 8, checked in by f.jahn, 3 years ago

Fixing project before activating IWDG timer in CubeMX.

File size: 9.4 KB
Line 
1/**
2 ******************************************************************************
3 * @file balancer.c
4 * @author ECS, Zed Kazharov
5 * @version V1.0.0
6 * @date 03.01.2023
7 * @brief BALANCER Modul
8 * Beschreibung in Header
9 ******************************************************************************
10 */
11
12// --- INCLUDES ----------------------------------------------------------------
13#include <stdio.h>
14#include "balancer.h"
15#include "main.h"
16#include "sysdata.h"
17#include "tim.h"
18#include "dac.h"
19#include "comp.h"
20#include "led.h"
21
22
23//--- GGF. EXTERNE VARIABLEN ---------------------------------------------------
24
25//--- LOKALE DEFINES - bitte hier dokumentieren --------------------------------
26//Imax = 20A
27//Verstrkung = 100
28//Shunt = 0,001 Ohm
29//U dac = Imax * Rshunt * Verstrkung --> 20 A * 0,001 Ohm * 100 = 2.0V
30//Dac Value = Udac / (Uref / 4096)
31//#define MAX_DAC_VALUE 3276
32//Zur Zeit reduzieren wir den max. Wert weil der Strommessverstrker langsam ist und zu spt den max Wert ausgibt
33//Daher zur Zeit nur 1,7V statt 2.0V
34#define MAX_DAC_VALUE 1500 //2300
35
36//MAX Timer Value um nicht mehr laufenden DC DC Wandler zu erkennen
37//gemessen 1500 Periode bei 5V/12 und Sysclock 64Mhz
38//um Faktor 10 vergrert
39#define MAX_TIMER_VALUE 500
40
41
42
43#define MIN_OUTPUT_VOLTAGE 10000 //mV
44#define MAX_OUTPUT_VOLTAGE 68000 //mv //Messgenauikeit ca. +- 2-3V
45#define MAX_ERROR 100 //
46#define RESTART_TIMEOUT 100 //ms
47#define BALANCER_REGULATION_TIME 10 //Alle 10mS ein Schritt
48#define CONVERTER_MIN_POWER 300 //300 von 3000 = 10%
49//--- LOKALE TYPE DEFS - bitte hier dokumentieren-------------------------------
50
51//--- DEFINATIONEN GLOBALER VARIABLEN - Bitte in Header dokumentieren ----------
52
53//--- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------
54
55uint32_t restartCounter;
56uint32_t startImpulsCounter;
57uint32_t balancer_running;
58uint32_t secondCounter;
59uint32_t balancerRegulationCounter= BALANCER_REGULATION_TIME;
60//--- LOKALE FUNKTIONS PROTOTYPEN ----------------------------------------------
61void BALANCER_SetStartImpulse(void);
62
63//--- LOKALE FUNKTIONEN - bitte hier dokumentieren -----------------------------
64
65//--- GLOBALE FUNKTIONEN - bitte in Header dokumentieren------------------------
66void BALANCER_Init(void)
67{
68
69 // Starte timer zur Messung der Charge Time und der Charge Transfer Time
70 // Charge Time bedeutet die Zeit zum Aufbau des Magnedfeldes. Also vom Einschalten
71 // des Mosfets bis zum erreichen der Maximal Stroms.
72 //HAL_TIM_Base_Start_IT(&htim16);
73 //HAL_TIM_Base_Start_IT(&htim17);
74
75 HAL_TIM_IC_Start(&htim1,TIM_CHANNEL_1);
76 HAL_TIM_IC_Start(&htim1,TIM_CHANNEL_2);
77
78
79
80
81
82 if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0) != HAL_OK)
83 {
84 /* Setting value Error */
85 printf("HAL_DAC_SetValue ERROR\n");
86 return;
87 }
88 printf("HAL_DAC_SetValue OK\n");
89
90
91 if (HAL_DAC_Start(&hdac1, DAC_CHANNEL_1) != HAL_OK)
92 {
93 /* Start Error */
94 printf("HAL_DAC_Start ERROR\n");
95 return;
96 }
97 printf("HAL_DAC_Start OK\n");
98
99
100 //Comparator fr Strom
101 if(HAL_COMP_Start(&hcomp1) != HAL_OK)
102 {
103 /* Initialization Error */
104 printf("HAL_COMP1_Start ERROR\n");
105 return;
106 }
107 printf("HAL_COMP1_Start OK\n");
108
109
110 //Comparator fr Charge Transfer
111 if(HAL_COMP_Start(&hcomp2) != HAL_OK)
112 {
113 /* Initialization Error */
114 printf("HAL_COMP2_Start ERROR\n");
115 return;
116 }
117 printf("HAL_COMP2_Start OK\n");
118 printf("BALANCER_Init OK\n");
119
120}
121uint32_t counterValue;
122
123void BALANCER_Exec()
124{
125 uint32_t val1 = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_1);
126 uint32_t val2 = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_2);
127
128
129 //Val1 representiert die gesamte Periode von Ipeak Abschaltung zu Ipeak Abschaltung (falling edge comparator 1)
130 //Val2 Periode von Ipeak Abschaltung (falling edge comparator 1) bis zu ende charge transfer (comparartor 2 rising edge )
131 uint32_t periodeTime = val1;
132 uint32_t chargeTransferTime = val2;
133 uint32_t chargeTime = periodeTime - chargeTransferTime;
134 uint32_t trafo = 2;// n2 / n1;
135 uint32_t usek = ((float)chargeTime / (float)chargeTransferTime) * trafo * sysData.s.cellVoltage;
136 sysData.s.chargeTime = chargeTime;
137 sysData.s.chargeTransferTime = chargeTransferTime;
138 sysData.s.sekVoltage = usek / 10;
139
140
141 //Wenn Balancer eingeschaltet
142 if (sysData.s.balancerPower > 0)
143 {
144 // ----- Prfe ob Flyback converter luft -----
145 counterValue = __HAL_TIM_GET_COUNTER(&htim1);
146 if (( counterValue > MAX_TIMER_VALUE) && (sysData.s.converterError == CONVERTER_ERROR_NONE) )
147 {
148 restartCounter++;
149 balancer_running=0;
150 }
151 else
152 {
153 if (restartCounter>0) restartCounter--;
154 }
155
156
157 if (restartCounter >= RESTART_TIMEOUT)
158 {
159 BALANCER_SetStartImpulse();
160 restartCounter = 0;
161 balancer_running=1;
162 startImpulsCounter++;
163 }
164 else
165 {
166
167 }
168
169 if (startImpulsCounter > 10)
170 {
171 sysData.s.balancerPower=0;
172 HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0);
173 sysData.s.converterError = CONVERTER_ERROR_STARTUP_ERROR;
174 printf("CONVERTER ERROR: CONVERTER_STARTUP ERROR!\n");
175 startImpulsCounter = 0;
176
177 }
178
179
180 secondCounter++;
181 if (secondCounter > 999)
182 {
183 if (startImpulsCounter > 0) startImpulsCounter--;
184 secondCounter = 0;
185 }
186
187
188
189 // ----- Prfe ob Flyback converter Ausgangsspannung zu hoch -----
190 if ((usek > MAX_OUTPUT_VOLTAGE) && (balancer_running == 1))
191 {
192 sysData.s.SekHvErrorCounter++;
193 }
194 else
195 {
196 if (sysData.s.SekHvErrorCounter>0) sysData.s.SekHvErrorCounter--;
197 }
198
199 if (sysData.s.SekHvErrorCounter > MAX_ERROR)
200 {
201 sysData.s.balancerPower=0;
202 HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0);
203 sysData.s.converterError = CONVERTER_ERROR_OUTPUT_VOLT_TOO_HIGH;
204 printf("CONVERTER ERROR: CONVERTER_ERROR_OUTPUT_VOLT_TOO_HIGH\n");
205 sysData.s.SekHvErrorCounter=0;
206 }
207
208 // ----- Prfe ob Flyback converter Ausgangsspannung zu niedrig -----
209 if ((usek < MIN_OUTPUT_VOLTAGE) && (balancer_running == 1))
210 {
211 sysData.s.SekLvErrorCounter++;
212 }
213 else
214 {
215 if (sysData.s.SekLvErrorCounter>0) sysData.s.SekLvErrorCounter--;
216 }
217
218 if (sysData.s.SekLvErrorCounter > MAX_ERROR)
219 {
220 sysData.s.balancerPower=0;
221 HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0);
222 sysData.s.converterError = CONVERTER_ERROR_OUTPUT_VOLT_TOO_LOW;
223 printf("CONVERTER ERROR: CONVERTER_ERROR_OUTPUT_VOLT_TOO_LOW\n");
224 sysData.s.SekLvErrorCounter=0;
225 }
226 }
227 else
228 {
229 //Balancer ist ausgeschaltet
230 sysData.s.sekVoltage=0;
231 }
232
233 if (balancerRegulationCounter > 0) balancerRegulationCounter--;
234
235 if ((sysData.s.mode == 0) && (balancerRegulationCounter == 0)) //AUTO MODE
236 {
237 balancerRegulationCounter = BALANCER_REGULATION_TIME;
238 if (sysData.s.cellVoltageUnfiltered > sysData.s.balancerVoltage)
239 {
240 if ((sysData.s.balancerPower < MAX_DAC_VALUE) && (sysData.s.converterError == CONVERTER_ERROR_NONE ))
241 {
242 sysData.s.balancerPower++;
243 if (sysData.s.balancerPower < CONVERTER_MIN_POWER )
244 {
245 sysData.s.balancerPower = CONVERTER_MIN_POWER;
246 startImpulsCounter = 0;
247 }
248 HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, sysData.s.balancerPower);
249 }
250 }
251 if (sysData.s.cellVoltageUnfiltered < sysData.s.balancerVoltage)
252 {
253 if (sysData.s.balancerPower > 0)
254 {
255 sysData.s.balancerPower--;
256 if( sysData.s.balancerPower < CONVERTER_MIN_POWER) sysData.s.balancerPower = 0;
257 HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, sysData.s.balancerPower);
258
259 }
260 }
261 }
262
263 if (sysData.s.mode == 1)
264 {
265 if ((sysData.s.balancerPower < MAX_DAC_VALUE) && (sysData.s.converterError == CONVERTER_ERROR_NONE ))
266 {
267 HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, sysData.s.balancerPower);
268 }
269 }
270
271
272
273 if (sysData.s.balancerPower > 0)
274 {
275 LED_FunctionSetTimes(900,100);
276 }
277 else
278 {
279 LED_FunctionSetTimes(100,900);
280 }
281
282
283}
284
285
286
287
288void BALANCER_SetStartImpulse()
289{
290
291 //Balancer arbeitet nicht. Schalte Ausgang von Comparator um auf normalen GPIO,
292 //setze ausgang auf 0, und schalte dann wieder auf Comparator, dadurch wird ein neuer Setz Impuls auf das Flip Flop gegeben.
293 printf("DC DC Wandler not running, start impuls\n");
294 GPIO_InitTypeDef GPIO_InitStruct = {0};
295 GPIO_InitStruct.Pin = COMP2_OUT_DISCHARGE_Pin;
296 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
297 GPIO_InitStruct.Pull = GPIO_NOPULL;
298 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
299 HAL_GPIO_Init(COMP2_OUT_DISCHARGE_GPIO_Port, &GPIO_InitStruct);
300 HAL_GPIO_WritePin(COMP2_OUT_DISCHARGE_GPIO_Port, COMP2_OUT_DISCHARGE_Pin, GPIO_PIN_RESET);
301
302 //Ausgang zurck auf Comparator
303 GPIO_InitStruct.Pin = COMP2_OUT_DISCHARGE_Pin;
304 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
305 GPIO_InitStruct.Pull = GPIO_NOPULL;
306 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
307 GPIO_InitStruct.Alternate = GPIO_AF7_COMP2;
308 HAL_GPIO_Init(COMP2_OUT_DISCHARGE_GPIO_Port, &GPIO_InitStruct);
309
310}
Note: See TracBrowser for help on using the repository browser.