Mosfet Driver

Dependencies:   mbed

Committer:
HMFK03LST1
Date:
Tue May 14 23:10:35 2013 +0000
Revision:
5:d814001b8aae
Parent:
4:8c89e422bed7
Child:
6:4af29761b1f0
RTM

Who changed what in which revision?

UserRevisionLine numberNew contents of line
HMFK03LST1 0:4f562ff70d13 1 #include "mbed.h"
HMFK03LST1 0:4f562ff70d13 2
HMFK03LST1 2:bdd944abaf86 3 LocalFileSystem local("local"); //init Flashdrive for reading config file
HMFK03LST1 2:bdd944abaf86 4 FILE *fp; //Pointer to local Config File
HMFK03LST1 0:4f562ff70d13 5
HMFK03LST1 0:4f562ff70d13 6 #define USR_POWERDOWN (0x104) //Power Down Mbed Interface (save 50% or 45 mA)
HMFK03LST1 0:4f562ff70d13 7
HMFK03LST1 5:d814001b8aae 8 float version = 0.9; //Program Version
HMFK03LST1 2:bdd944abaf86 9
HMFK03LST1 5:d814001b8aae 10 bool mosfet_open = true ; //Mosfet1 geschlossen
HMFK03LST1 5:d814001b8aae 11 bool mosfet_close = false; //Mosfet1 offen
HMFK03LST1 5:d814001b8aae 12
HMFK03LST1 1:19d350e383e6 13
HMFK03LST1 0:4f562ff70d13 14 DigitalOut myled (LED1);
HMFK03LST1 0:4f562ff70d13 15 DigitalOut myled1 (LED2);
HMFK03LST1 0:4f562ff70d13 16 DigitalOut myled2 (LED3);
HMFK03LST1 1:19d350e383e6 17 DigitalOut myled3 (LED4);
HMFK03LST1 0:4f562ff70d13 18
HMFK03LST1 5:d814001b8aae 19 DigitalOut pump (p36);
HMFK03LST1 5:d814001b8aae 20 DigitalOut purge (p35);
HMFK03LST1 5:d814001b8aae 21 DigitalOut h2_blow(p34);
HMFK03LST1 5:d814001b8aae 22 DigitalOut waterp (p33);
HMFK03LST1 5:d814001b8aae 23 DigitalOut mosfet (p21);
HMFK03LST1 5:d814001b8aae 24
HMFK03LST1 5:d814001b8aae 25 DigitalIn In1 (p22); // Caps Down
HMFK03LST1 5:d814001b8aae 26 DigitalIn In2 (p23); // Power UP
HMFK03LST1 5:d814001b8aae 27 DigitalIn In3 (p24);
HMFK03LST1 5:d814001b8aae 28 DigitalIn In4 (p25);
HMFK03LST1 5:d814001b8aae 29 DigitalIn In5 (p29);
HMFK03LST1 5:d814001b8aae 30 DigitalIn In6 (p30);
HMFK03LST1 5:d814001b8aae 31
HMFK03LST1 5:d814001b8aae 32 AnalogIn cap_in (p15); // AI 1 Faktor /14.8
HMFK03LST1 5:d814001b8aae 33 AnalogIn bz_in (p16); // AI 2 Faktor /14.8
HMFK03LST1 5:d814001b8aae 34 AnalogIn mos_in (p17); // AI 3 Faktor /1.5
HMFK03LST1 5:d814001b8aae 35 AnalogIn temp_in(p18); // AI 4 Faktor /1.5
HMFK03LST1 5:d814001b8aae 36 AnalogIn AI_5 (p19); // AI 5 Faktor * 2
HMFK03LST1 5:d814001b8aae 37 AnalogIn cur_in (p20); // AI 6 Faktor * 2 zum Strommesser
HMFK03LST1 0:4f562ff70d13 38
HMFK03LST1 0:4f562ff70d13 39 Serial pc(USBTX, USBRX);
HMFK03LST1 2:bdd944abaf86 40 Ticker PC_OUT_timer; // Output Monitoring to Serial
HMFK03LST1 2:bdd944abaf86 41 Ticker LED_timer; // Set Status LED´s
HMFK03LST1 1:19d350e383e6 42
HMFK03LST1 0:4f562ff70d13 43 Timer t;
HMFK03LST1 0:4f562ff70d13 44
HMFK03LST1 2:bdd944abaf86 45 // Brennstoffzellen Parameter
HMFK03LST1 2:bdd944abaf86 46 float bz_max = 30.5; //Brennstoffzelle Spannung Abs. max.
HMFK03LST1 3:af6a6f498276 47 float bz_p_oben = 15.0; //Brennstoffzelle Prozent Load bei bz_max
HMFK03LST1 2:bdd944abaf86 48 float bz_on = 29.0; //Brennstoffzelle Spannung für Ladefreigabe)
HMFK03LST1 2:bdd944abaf86 49 float bz_min = 26.0; //Brennstoffzelle Spannung min. Laden beenden
HMFK03LST1 2:bdd944abaf86 50 float bz_p_unten = -20.0; //Brennstoffzelle Prozent Load bei bz_min
HMFK03LST1 2:bdd944abaf86 51 float bz_current = 1.5; //Brennstoffzellen Strom nominal
HMFK03LST1 3:af6a6f498276 52 float bz_cur_add = 2.0; //Brennstoffzellen Strom max
HMFK03LST1 3:af6a6f498276 53 float bz_c_i_max = 20.0; //Strom Integrale Reglung Max %
HMFK03LST1 3:af6a6f498276 54 float bz_c_i_min = -10.0; //Strom Integrale Reglung Min %
HMFK03LST1 5:d814001b8aae 55 float bz_temp_max = 55.0; //Maximale Wassertemperatur °C
HMFK03LST1 5:d814001b8aae 56 int load_fail = 0; //Kein Strom trotz Imax
HMFK03LST1 2:bdd944abaf86 57
HMFK03LST1 2:bdd944abaf86 58 // SuperCap Parameter
HMFK03LST1 2:bdd944abaf86 59 float cap_max = 25.0; //CAP Spannung max. (Abschaltung)
HMFK03LST1 3:af6a6f498276 60 float cap_p_max = 90.0; //CAP Prozent Load bei 0V
HMFK03LST1 2:bdd944abaf86 61 float cap_min = 20.0; //CAP Spannung min. (Zelle an)
HMFK03LST1 3:af6a6f498276 62 float cap_p_min = 5.0; //CAP Prozent Load bei 0V
HMFK03LST1 2:bdd944abaf86 63 float cap_delta = 1.5; //Absenkung der Spannung mit Din
HMFK03LST1 0:4f562ff70d13 64
HMFK03LST1 2:bdd944abaf86 65 // Pump & Purge Parameter
HMFK03LST1 2:bdd944abaf86 66 float purge_start = 3.0; //s before starting purch
HMFK03LST1 2:bdd944abaf86 67 float purge_end = 3.2; //s after finishing purch
HMFK03LST1 2:bdd944abaf86 68 float boost_time = 0.2; //s Pump runup with 100% Duty Cycle
HMFK03LST1 5:d814001b8aae 69 float pump_red = 30.0; //% Pumpen PWM red. zwischen BZ_on und BZ_max linear
HMFK03LST1 5:d814001b8aae 70 float pwm_cycle = 20.0; //ms für PWM Period
HMFK03LST1 5:d814001b8aae 71 float pwm_on = 12.0; //ms für PWM high
HMFK03LST1 5:d814001b8aae 72 float pwm_pro = 0; //PWM Taktung
HMFK03LST1 2:bdd944abaf86 73
HMFK03LST1 2:bdd944abaf86 74 // Monitoring Parameter
HMFK03LST1 2:bdd944abaf86 75 int debug = 1; //Serial Output on (1)
HMFK03LST1 2:bdd944abaf86 76 float sample = 5; //Serial Output Samples per Second
HMFK03LST1 5:d814001b8aae 77 char com_in[8] ; //Serial input
HMFK03LST1 5:d814001b8aae 78
HMFK03LST1 5:d814001b8aae 79
HMFK03LST1 5:d814001b8aae 80 // Mosfet Parameter
HMFK03LST1 5:d814001b8aae 81 int Cel_Level = 0; //% Load aus Bz Spannung
HMFK03LST1 5:d814001b8aae 82 int Cap_Level = 0; //% Load aus Cap Spannung
HMFK03LST1 5:d814001b8aae 83 int Cur_Level = 0;
HMFK03LST1 5:d814001b8aae 84 int Load_Level = 0; //% Load aus Bz und Cap
HMFK03LST1 5:d814001b8aae 85 float mos_temp = 0; //°C Mosfet
HMFK03LST1 0:4f562ff70d13 86
HMFK03LST1 2:bdd944abaf86 87 // Temp Variable
HMFK03LST1 2:bdd944abaf86 88 bool Load = false; //Laderegler aktiv
HMFK03LST1 2:bdd944abaf86 89 bool pump_on = false; //Pumpenzustand
HMFK03LST1 2:bdd944abaf86 90 int boost = 0; //Number of PWM-Cycles for Pump runup boost calc in load_cfg
HMFK03LST1 5:d814001b8aae 91 char input_c = 0; //Serial comand input
HMFK03LST1 5:d814001b8aae 92
HMFK03LST1 2:bdd944abaf86 93 float bz = 0; //Spannung Brennstoffzelle
HMFK03LST1 2:bdd944abaf86 94 float cap = 0; //Spannung SuperCap
HMFK03LST1 2:bdd944abaf86 95 float current = 0; //Strom in den Mosfet
HMFK03LST1 5:d814001b8aae 96 float bz_temp = 0; //BZ Temperatur
HMFK03LST1 5:d814001b8aae 97 bool temp_1_2 = false; //Auswahl Temperaturkanal
HMFK03LST1 5:d814001b8aae 98 int pump_block = 2;
HMFK03LST1 5:d814001b8aae 99
HMFK03LST1 5:d814001b8aae 100 unsigned int counter_cycle = 0; //Counter PWM-Cycles for Pump-Purge
HMFK03LST1 5:d814001b8aae 101 unsigned int counter_takt = 0; //Counter for PWM Pump
HMFK03LST1 0:4f562ff70d13 102
HMFK03LST1 5:d814001b8aae 103
HMFK03LST1 5:d814001b8aae 104 float Regler_Hz = 1000.0;
HMFK03LST1 5:d814001b8aae 105
HMFK03LST1 5:d814001b8aae 106
HMFK03LST1 5:d814001b8aae 107
HMFK03LST1 5:d814001b8aae 108
HMFK03LST1 0:4f562ff70d13 109 void load_cfg()
HMFK03LST1 0:4f562ff70d13 110 {
HMFK03LST1 5:d814001b8aae 111 char read[25][5];
HMFK03LST1 0:4f562ff70d13 112
HMFK03LST1 0:4f562ff70d13 113 char i = 0;
HMFK03LST1 0:4f562ff70d13 114 char j = 0;
HMFK03LST1 0:4f562ff70d13 115 int c = 0;
HMFK03LST1 0:4f562ff70d13 116 float temp;
HMFK03LST1 0:4f562ff70d13 117
HMFK03LST1 5:d814001b8aae 118 for (j = 0; j<26; j++)
HMFK03LST1 0:4f562ff70d13 119 {
HMFK03LST1 5:d814001b8aae 120 for (i = 0; i<6; i++)
HMFK03LST1 0:4f562ff70d13 121 {
HMFK03LST1 0:4f562ff70d13 122 read[j][i] = '\0';
HMFK03LST1 0:4f562ff70d13 123 }
HMFK03LST1 0:4f562ff70d13 124 }
HMFK03LST1 0:4f562ff70d13 125
HMFK03LST1 0:4f562ff70d13 126 i=0;
HMFK03LST1 0:4f562ff70d13 127 j=0;
HMFK03LST1 0:4f562ff70d13 128
HMFK03LST1 0:4f562ff70d13 129 fp = fopen("/local/power.cfg", "r");
HMFK03LST1 0:4f562ff70d13 130 if ( fp != NULL )
HMFK03LST1 0:4f562ff70d13 131 {
HMFK03LST1 0:4f562ff70d13 132 while((c != EOF) && (c !=10))
HMFK03LST1 0:4f562ff70d13 133 {
HMFK03LST1 0:4f562ff70d13 134 c = fgetc(fp);
HMFK03LST1 0:4f562ff70d13 135 if (c == ';'){read[j][0] = i; i = 0; j++;}
HMFK03LST1 0:4f562ff70d13 136 else {i++; read[j][i] = c;}
HMFK03LST1 0:4f562ff70d13 137 }
HMFK03LST1 5:d814001b8aae 138 fclose(fp);
HMFK03LST1 0:4f562ff70d13 139
HMFK03LST1 0:4f562ff70d13 140
HMFK03LST1 2:bdd944abaf86 141 sscanf(&read[ 0][1], "%f", &temp); bz_max = temp;
HMFK03LST1 2:bdd944abaf86 142 sscanf(&read[ 1][1], "%f", &temp); bz_p_oben = temp;
HMFK03LST1 2:bdd944abaf86 143 sscanf(&read[ 2][1], "%f", &temp); bz_on = temp;
HMFK03LST1 2:bdd944abaf86 144 sscanf(&read[ 3][1], "%f", &temp); bz_min = temp;
HMFK03LST1 2:bdd944abaf86 145 sscanf(&read[ 4][1], "%f", &temp); bz_p_unten = temp;
HMFK03LST1 3:af6a6f498276 146 sscanf(&read[ 5][1], "%f", &temp); bz_current = temp;
HMFK03LST1 3:af6a6f498276 147 sscanf(&read[ 6][1], "%f", &temp); bz_cur_add = temp;
HMFK03LST1 3:af6a6f498276 148 sscanf(&read[ 7][1], "%f", &temp); bz_c_i_max = temp;
HMFK03LST1 3:af6a6f498276 149 sscanf(&read[ 8][1], "%f", &temp); bz_c_i_min = temp;
HMFK03LST1 5:d814001b8aae 150 sscanf(&read[ 9][1], "%f", &temp); bz_temp_max = temp;
HMFK03LST1 5:d814001b8aae 151
HMFK03LST1 5:d814001b8aae 152 sscanf(&read[10][1], "%f", &temp); cap_max = temp;
HMFK03LST1 5:d814001b8aae 153 sscanf(&read[11][1], "%f", &temp); cap_p_max = temp;
HMFK03LST1 5:d814001b8aae 154 sscanf(&read[12][1], "%f", &temp); cap_min = temp;
HMFK03LST1 5:d814001b8aae 155 sscanf(&read[13][1], "%f", &temp); cap_p_min = temp;
HMFK03LST1 5:d814001b8aae 156 sscanf(&read[14][1], "%f", &temp); cap_delta = temp;
HMFK03LST1 3:af6a6f498276 157
HMFK03LST1 5:d814001b8aae 158 sscanf(&read[15][1], "%f", &temp); purge_start = temp;
HMFK03LST1 5:d814001b8aae 159 sscanf(&read[16][1], "%f", &temp); purge_end = temp;
HMFK03LST1 5:d814001b8aae 160 sscanf(&read[17][1], "%f", &temp); boost_time = temp;
HMFK03LST1 5:d814001b8aae 161 sscanf(&read[18][1], "%f", &temp); pump_red = temp;
HMFK03LST1 5:d814001b8aae 162 sscanf(&read[19][1], "%f", &temp); pwm_cycle = temp;
HMFK03LST1 5:d814001b8aae 163 sscanf(&read[20][1], "%f", &temp); pwm_on = temp;
HMFK03LST1 3:af6a6f498276 164
HMFK03LST1 5:d814001b8aae 165 sscanf(&read[21][1], "%f", &temp); Regler_Hz = temp;
HMFK03LST1 5:d814001b8aae 166 sscanf(&read[22][1], "%f", &temp); debug = temp;
HMFK03LST1 5:d814001b8aae 167 sscanf(&read[23][1], "%f", &temp); sample = temp;
HMFK03LST1 0:4f562ff70d13 168
HMFK03LST1 5:d814001b8aae 169 boost = boost_time * 1000 / pwm_cycle;
HMFK03LST1 5:d814001b8aae 170 pump_block = 5 / purge_end;
HMFK03LST1 2:bdd944abaf86 171 }
HMFK03LST1 0:4f562ff70d13 172
HMFK03LST1 5:d814001b8aae 173 pc.printf("\n\r" );
HMFK03LST1 3:af6a6f498276 174 pc.printf("******************************** \n\r" );
HMFK03LST1 2:bdd944abaf86 175 pc.printf("* Brennstoffzellenregler V%03.1f * \n\r",version);
HMFK03LST1 3:af6a6f498276 176 pc.printf("******************************** \n\r" );
HMFK03LST1 3:af6a6f498276 177 pc.printf("--------------BZ---------------- \n\r" );
HMFK03LST1 4:8c89e422bed7 178 pc.printf(" BZ max [V] : %5.1f \n\r",bz_max );
HMFK03LST1 4:8c89e422bed7 179 pc.printf(" BZ max [%c] : %5.1f \n\r",37,bz_p_oben );
HMFK03LST1 4:8c89e422bed7 180 pc.printf(" BZ Laden on [V] : %5.1f \n\r",bz_on );
HMFK03LST1 4:8c89e422bed7 181 pc.printf(" BZ Laden off [V] : %5.1f \n\r",bz_min );
HMFK03LST1 4:8c89e422bed7 182 pc.printf(" BZ Laden off [%c] : %5.1f \n\r",37,bz_p_unten );
HMFK03LST1 4:8c89e422bed7 183 pc.printf(" BZ Strom norm [A] : %5.1f \n\r",bz_current );
HMFK03LST1 4:8c89e422bed7 184 pc.printf(" BZ Strom max. [A] : %5.1f \n\r",bz_cur_add );
HMFK03LST1 4:8c89e422bed7 185 pc.printf(" BZ Strom I max.[%c] : %5.1f \n\r",37,bz_c_i_max );
HMFK03LST1 4:8c89e422bed7 186 pc.printf(" BZ Strom I min.[%c] : %5.1f \n\r",37,bz_c_i_min );
HMFK03LST1 5:d814001b8aae 187 pc.printf(" BZ Temp max. [%cC]: %5.1f \n\r",176,bz_temp_max);
HMFK03LST1 3:af6a6f498276 188 pc.printf("-------------CAP---------------- \n\r" );
HMFK03LST1 4:8c89e422bed7 189 pc.printf(" CAP max [V] : %5.1f \n\r",cap_max );
HMFK03LST1 4:8c89e422bed7 190 pc.printf(" CAP max [%c] : %5.1f \n\r",37,cap_p_max );
HMFK03LST1 4:8c89e422bed7 191 pc.printf(" CAP min [V] : %5.1f \n\r",cap_min );
HMFK03LST1 4:8c89e422bed7 192 pc.printf(" CAP min [%c] : %5.1f \n\r",37,cap_p_min );
HMFK03LST1 4:8c89e422bed7 193 pc.printf(" CAP lo on Din [-V]: %5.1f \n\r",cap_delta );
HMFK03LST1 3:af6a6f498276 194 pc.printf("----------Pump & Purge---------- \n\r" );
HMFK03LST1 4:8c89e422bed7 195 pc.printf(" Purge on [s] : %5.1f \n\r",purge_start );
HMFK03LST1 4:8c89e422bed7 196 pc.printf(" Purge off [s] : %5.1f \n\r",purge_end );
HMFK03LST1 4:8c89e422bed7 197 pc.printf(" Boost [s] : %5.1f \n\r",boost_time );
HMFK03LST1 5:d814001b8aae 198 pc.printf(" Pumpe abregeln [%c] : %5.1f \n\r",37,pump_red );
HMFK03LST1 5:d814001b8aae 199 pc.printf(" PWM cycle [ms]: %5.0f \n\r" ,pwm_cycle );
HMFK03LST1 5:d814001b8aae 200 pc.printf(" PWM on [ms]: %5.0f \n\r" ,pwm_on );
HMFK03LST1 3:af6a6f498276 201 pc.printf("------------Monitor------------- \n\r" );
HMFK03LST1 5:d814001b8aae 202 pc.printf(" Regler Frequenz[Hz] :%4.0f \n\r" ,Regler_Hz );
HMFK03LST1 5:d814001b8aae 203 pc.printf(" Serial output [bool]: %3d \n\r" ,debug );
HMFK03LST1 5:d814001b8aae 204 pc.printf(" Samplerate [Hz] : %3.0f \n\r",sample );
HMFK03LST1 3:af6a6f498276 205 pc.printf("******************************** \n\r" );
HMFK03LST1 3:af6a6f498276 206 pc.printf("\n\r" );
HMFK03LST1 0:4f562ff70d13 207 }
HMFK03LST1 0:4f562ff70d13 208
HMFK03LST1 5:d814001b8aae 209 void LED()
HMFK03LST1 5:d814001b8aae 210 {
HMFK03LST1 5:d814001b8aae 211 if (bz < bz_min ) myled = 1; else myled = 0; //LED = Spannung an der BZ IO
HMFK03LST1 5:d814001b8aae 212 if (cap > cap_min) myled1 = 1; else myled1 = 0; //LED = Spannung an den Cap´s IO
HMFK03LST1 5:d814001b8aae 213 if ((mosfet == mosfet_close)
HMFK03LST1 5:d814001b8aae 214 &&(Load == true)) myled2 = 1; else myled2 = 0; //LED = Gate Zustand Mosfet 1
HMFK03LST1 5:d814001b8aae 215 if (pump_on == 1) myled3 = 1; else myled3 = 0; //LED = Pumpe an
HMFK03LST1 5:d814001b8aae 216 }
HMFK03LST1 5:d814001b8aae 217
HMFK03LST1 5:d814001b8aae 218 void led_beep()
HMFK03LST1 5:d814001b8aae 219 {
HMFK03LST1 5:d814001b8aae 220 LED_timer.detach();
HMFK03LST1 5:d814001b8aae 221 mosfet = mosfet_open;
HMFK03LST1 5:d814001b8aae 222 myled = 0; myled1 = 0; myled2 = 0; myled3 = 0;
HMFK03LST1 5:d814001b8aae 223 wait(0.1);
HMFK03LST1 5:d814001b8aae 224 myled = 1;
HMFK03LST1 5:d814001b8aae 225 wait(0.1);
HMFK03LST1 5:d814001b8aae 226 myled1 = 1;
HMFK03LST1 5:d814001b8aae 227 wait(0.1);
HMFK03LST1 5:d814001b8aae 228 myled2 = 1;
HMFK03LST1 5:d814001b8aae 229 wait(0.1);
HMFK03LST1 5:d814001b8aae 230 myled3 = 1;
HMFK03LST1 5:d814001b8aae 231 wait(0.1);
HMFK03LST1 5:d814001b8aae 232 LED_timer.attach (&LED , 0.200);
HMFK03LST1 5:d814001b8aae 233 myled3 = 1;
HMFK03LST1 5:d814001b8aae 234 }
HMFK03LST1 5:d814001b8aae 235
HMFK03LST1 5:d814001b8aae 236
HMFK03LST1 5:d814001b8aae 237 void do_command()
HMFK03LST1 5:d814001b8aae 238 {
HMFK03LST1 5:d814001b8aae 239 switch(com_in[0])
HMFK03LST1 5:d814001b8aae 240 {
HMFK03LST1 5:d814001b8aae 241 case 'r': load_cfg();
HMFK03LST1 5:d814001b8aae 242 led_beep();
HMFK03LST1 5:d814001b8aae 243 break;
HMFK03LST1 5:d814001b8aae 244 }
HMFK03LST1 5:d814001b8aae 245 }
HMFK03LST1 5:d814001b8aae 246
HMFK03LST1 5:d814001b8aae 247
HMFK03LST1 5:d814001b8aae 248 void get_input()
HMFK03LST1 5:d814001b8aae 249 {
HMFK03LST1 5:d814001b8aae 250 char wert;
HMFK03LST1 5:d814001b8aae 251
HMFK03LST1 5:d814001b8aae 252 while (pc.readable() == true)
HMFK03LST1 5:d814001b8aae 253 {
HMFK03LST1 5:d814001b8aae 254 wert = pc.getc(); //Char lesen
HMFK03LST1 5:d814001b8aae 255 if ((wert == 'c') && ((input_c == 0))) {input_c = 1;} //Command Char 1 prüfen
HMFK03LST1 5:d814001b8aae 256 if ( wert == 10) {input_c = 0; do_command(); com_in[0] =' ';} //Command End prüfen
HMFK03LST1 5:d814001b8aae 257
HMFK03LST1 5:d814001b8aae 258 if (input_c == 2)
HMFK03LST1 5:d814001b8aae 259 {
HMFK03LST1 5:d814001b8aae 260 com_in[0] = wert;
HMFK03LST1 5:d814001b8aae 261 }
HMFK03LST1 5:d814001b8aae 262
HMFK03LST1 5:d814001b8aae 263 if ((input_c == 1) && (wert == '_')){input_c = 2;} //Command Char 2 prüfen
HMFK03LST1 5:d814001b8aae 264 }
HMFK03LST1 5:d814001b8aae 265 }
HMFK03LST1 5:d814001b8aae 266
HMFK03LST1 5:d814001b8aae 267
HMFK03LST1 5:d814001b8aae 268
HMFK03LST1 5:d814001b8aae 269
HMFK03LST1 2:bdd944abaf86 270
HMFK03LST1 1:19d350e383e6 271 int semihost_powerdown()
HMFK03LST1 1:19d350e383e6 272 {
HMFK03LST1 1:19d350e383e6 273 uint32_t arg;
HMFK03LST1 1:19d350e383e6 274 return __semihost(USR_POWERDOWN, &arg);
HMFK03LST1 1:19d350e383e6 275 }
HMFK03LST1 1:19d350e383e6 276
HMFK03LST1 2:bdd944abaf86 277
HMFK03LST1 5:d814001b8aae 278 int port(int number)
HMFK03LST1 5:d814001b8aae 279 {
HMFK03LST1 5:d814001b8aae 280 if (number == 1) {if (In1 == 1) return 1; else return 0;}
HMFK03LST1 5:d814001b8aae 281 if (number == 2) {if (In2 == 1) return 1; else return 0;}
HMFK03LST1 5:d814001b8aae 282 if (number == 3) {if (In3 == 1) return 1; else return 0;}
HMFK03LST1 5:d814001b8aae 283 if (number == 4) {if (In4 == 1) return 1; else return 0;}
HMFK03LST1 5:d814001b8aae 284 if (number == 5) {if (In5 == 1) return 1; else return 0;}
HMFK03LST1 5:d814001b8aae 285 if (number == 6) {if (In6 == 1) return 1; else return 0;}
HMFK03LST1 5:d814001b8aae 286 return 2;
HMFK03LST1 5:d814001b8aae 287 }
HMFK03LST1 5:d814001b8aae 288
HMFK03LST1 1:19d350e383e6 289 void SEND()
HMFK03LST1 1:19d350e383e6 290 {
HMFK03LST1 5:d814001b8aae 291 float temp1 = 0;
HMFK03LST1 5:d814001b8aae 292 float temp2 = 0;
HMFK03LST1 5:d814001b8aae 293 float temp3 = 0;
HMFK03LST1 5:d814001b8aae 294 float temp4 = 0;
HMFK03LST1 5:d814001b8aae 295 float temp5 = 0;
HMFK03LST1 5:d814001b8aae 296 char temp6 = 0;
HMFK03LST1 5:d814001b8aae 297
HMFK03LST1 3:af6a6f498276 298 bool status= false;
HMFK03LST1 5:d814001b8aae 299
HMFK03LST1 5:d814001b8aae 300 switch (debug)
HMFK03LST1 5:d814001b8aae 301 {
HMFK03LST1 5:d814001b8aae 302 case 1:
HMFK03LST1 5:d814001b8aae 303 if (mosfet == mosfet_close) status = true;
HMFK03LST1 5:d814001b8aae 304 if (Load == true) mosfet = mosfet_open;
HMFK03LST1 5:d814001b8aae 305 pc.printf("BZ: %4.1f/%4.1f-%4.1f+%4.1f CAP: %4.1f/%4.1f-%4.1f Pump : %2d Purge: %3.1f/%3.1f-%3.1f Load: %02d/%02d-%02d Current: %4.2f Temp BZ: %3.1f Temp Mos: %3.1f\n\r"
HMFK03LST1 5:d814001b8aae 306 ,bz,bz_min,bz_on,bz_max,cap,cap_min,cap_max,int(pwm_pro*100),float(counter_cycle*pwm_cycle/1000),
HMFK03LST1 5:d814001b8aae 307 purge_start,purge_end,int(Load_Level),int((Cap_Level + Cel_Level) + bz_c_i_min),
HMFK03LST1 5:d814001b8aae 308 int((Cap_Level + Cel_Level) + bz_c_i_max), current, bz_temp, mos_temp);
HMFK03LST1 5:d814001b8aae 309 if (status == true) mosfet = mosfet_close;
HMFK03LST1 5:d814001b8aae 310 break;
HMFK03LST1 5:d814001b8aae 311
HMFK03LST1 5:d814001b8aae 312 case 2:
HMFK03LST1 5:d814001b8aae 313 if (mosfet == mosfet_close) status = true;
HMFK03LST1 5:d814001b8aae 314 if (Load == true) mosfet = mosfet_open;
HMFK03LST1 5:d814001b8aae 315 pc.printf("In1: %2d In2: %2d In3: %2d In4: %2d In5: %2d In6: %2d \n\r",port(1),port(2),port(3),port(4),port(5),port(6));
HMFK03LST1 5:d814001b8aae 316 if (status == true) mosfet = mosfet_close;
HMFK03LST1 5:d814001b8aae 317 break;
HMFK03LST1 5:d814001b8aae 318
HMFK03LST1 5:d814001b8aae 319 case 3:
HMFK03LST1 5:d814001b8aae 320 if (mosfet == mosfet_close) status = true;
HMFK03LST1 5:d814001b8aae 321 if (Load == true) mosfet = mosfet_open;
HMFK03LST1 5:d814001b8aae 322 pc.printf("AI1: %3.2f AI2: %3.2f AI3: %3.2f AI4: %3.2f AI5: %3.2f AI6: %3.2f \n\r",cap_in.read(),bz_in.read(),mos_in.read(),temp_in.read(),AI_5.read(),cur_in.read());
HMFK03LST1 5:d814001b8aae 323 if (status == true) mosfet = mosfet_close;
HMFK03LST1 5:d814001b8aae 324 break;
HMFK03LST1 5:d814001b8aae 325
HMFK03LST1 5:d814001b8aae 326 case 4:
HMFK03LST1 5:d814001b8aae 327 pc.printf("Change \n\r");
HMFK03LST1 5:d814001b8aae 328 pump = !pump ;
HMFK03LST1 5:d814001b8aae 329 purge = !purge;
HMFK03LST1 5:d814001b8aae 330 h2_blow = !h2_blow;
HMFK03LST1 5:d814001b8aae 331 waterp = !waterp;
HMFK03LST1 5:d814001b8aae 332 mosfet = !mosfet;
HMFK03LST1 5:d814001b8aae 333 break;
HMFK03LST1 5:d814001b8aae 334
HMFK03LST1 5:d814001b8aae 335
HMFK03LST1 5:d814001b8aae 336
HMFK03LST1 5:d814001b8aae 337 case 5:
HMFK03LST1 5:d814001b8aae 338
HMFK03LST1 5:d814001b8aae 339 if (((Cap_Level + Cel_Level) + bz_c_i_min) > 0) {temp1 = ((Cap_Level + Cel_Level) + bz_c_i_min);}
HMFK03LST1 5:d814001b8aae 340 else temp1 = 0;
HMFK03LST1 5:d814001b8aae 341
HMFK03LST1 5:d814001b8aae 342 if (((Cap_Level + Cel_Level) + bz_c_i_max) > 0) {temp2 = ((Cap_Level + Cel_Level) + bz_c_i_max);}
HMFK03LST1 5:d814001b8aae 343 else temp2 = 0;
HMFK03LST1 5:d814001b8aae 344
HMFK03LST1 5:d814001b8aae 345 if (current > 0) {temp3 = current;}
HMFK03LST1 5:d814001b8aae 346 else temp3 = 0;
HMFK03LST1 5:d814001b8aae 347
HMFK03LST1 5:d814001b8aae 348 if (bz_temp > 0) {temp4 = bz_temp;}
HMFK03LST1 5:d814001b8aae 349 else temp4 = 0;
HMFK03LST1 5:d814001b8aae 350
HMFK03LST1 5:d814001b8aae 351 if (mos_temp > 0) {temp5 = mos_temp;}
HMFK03LST1 5:d814001b8aae 352 else temp5 = 0;
HMFK03LST1 5:d814001b8aae 353
HMFK03LST1 5:d814001b8aae 354 temp6 = (purge<<7)+(pump_on<<6)+(In1<<5) + (In2<<4) + (In3<<3) + (In4<<2) + (In5<<1) + In6;
HMFK03LST1 5:d814001b8aae 355
HMFK03LST1 5:d814001b8aae 356 pc.printf("%c%c%c%c%c%c%c%c%c%c%c%c",255,128, //0,1
HMFK03LST1 5:d814001b8aae 357 char(int(bz*6)), //0-35 zu 0-250 2 0
HMFK03LST1 5:d814001b8aae 358 char(int(cap*7)), //0-38 zu 0-250 3 1
HMFK03LST1 5:d814001b8aae 359 char(int(Load_Level * 2.5)), //0-100 zu 0-250 4 2
HMFK03LST1 5:d814001b8aae 360 char(int(temp1 * 2.5)), //0-100 zu 0-250 5 3
HMFK03LST1 5:d814001b8aae 361 char(int(temp2 * 2.5)), //0-100 zu 0-250 6 4
HMFK03LST1 5:d814001b8aae 362 char(int(temp3 * 25 )), //0-10 zu 0-250 7 5
HMFK03LST1 5:d814001b8aae 363 char(int(temp4 * 2.5)), //0-100 zu 0-250 8 6
HMFK03LST1 5:d814001b8aae 364 char(int(temp5 * 2.5)), //0-100 zu 0-250 9 7
HMFK03LST1 5:d814001b8aae 365 char(int(pwm_pro * 250)), //0-100 zu 0-250 10 8
HMFK03LST1 5:d814001b8aae 366 temp6 //Statusbits Din/Pump/Purge
HMFK03LST1 5:d814001b8aae 367 );
HMFK03LST1 5:d814001b8aae 368 break;
HMFK03LST1 2:bdd944abaf86 369 }
HMFK03LST1 5:d814001b8aae 370
HMFK03LST1 1:19d350e383e6 371 }
HMFK03LST1 1:19d350e383e6 372
HMFK03LST1 1:19d350e383e6 373
HMFK03LST1 5:d814001b8aae 374
HMFK03LST1 5:d814001b8aae 375
HMFK03LST1 5:d814001b8aae 376
HMFK03LST1 5:d814001b8aae 377
HMFK03LST1 5:d814001b8aae 378 void TEMP()
HMFK03LST1 1:19d350e383e6 379 {
HMFK03LST1 5:d814001b8aae 380 if (temp_1_2 == true) bz_temp = (temp_in.read()/0.00407)- 48.3;
HMFK03LST1 5:d814001b8aae 381 else mos_temp = ( mos_in.read()/0.00407)- 50.3;
HMFK03LST1 5:d814001b8aae 382 temp_1_2 = !temp_1_2;
HMFK03LST1 1:19d350e383e6 383 }
HMFK03LST1 0:4f562ff70d13 384
HMFK03LST1 0:4f562ff70d13 385
HMFK03LST1 5:d814001b8aae 386
HMFK03LST1 1:19d350e383e6 387 void PUMPE()
HMFK03LST1 1:19d350e383e6 388 {
HMFK03LST1 5:d814001b8aae 389 float regler = 1;
HMFK03LST1 5:d814001b8aae 390
HMFK03LST1 5:d814001b8aae 391 counter_takt++; //Aufrufzähler
HMFK03LST1 3:af6a6f498276 392
HMFK03LST1 5:d814001b8aae 393
HMFK03LST1 5:d814001b8aae 394
HMFK03LST1 5:d814001b8aae 395 if (cap > (cap_max - (!In1 * cap_delta)))
HMFK03LST1 3:af6a6f498276 396 {
HMFK03LST1 3:af6a6f498276 397 pump_on = false;
HMFK03LST1 5:d814001b8aae 398 pwm_pro = 0;
HMFK03LST1 3:af6a6f498276 399 }
HMFK03LST1 3:af6a6f498276 400
HMFK03LST1 3:af6a6f498276 401
HMFK03LST1 3:af6a6f498276 402 if ((cap <= cap_min) || (pump_on == true)) //Pumpe Einschaltbedingung
HMFK03LST1 2:bdd944abaf86 403 {
HMFK03LST1 1:19d350e383e6 404 pump_on = true;
HMFK03LST1 5:d814001b8aae 405
HMFK03LST1 5:d814001b8aae 406 if (bz > bz_on) {1 - ((pump_red / ((bz_max-(!In1 * cap_delta)) - bz_on) * (bz - bz_on)) / 1000);} //Luftreduzierung wenn Spannung über BZ_on (lineare Reduzierung bis BZ_max um pump_red(%))
HMFK03LST1 5:d814001b8aae 407
HMFK03LST1 5:d814001b8aae 408 pwm_pro = ((float(pwm_on) * regler) / pwm_cycle ); //PWM Prozent für Monitoring
HMFK03LST1 5:d814001b8aae 409
HMFK03LST1 5:d814001b8aae 410
HMFK03LST1 5:d814001b8aae 411 if ((pump_block == 0) && (counter_takt > (pwm_cycle - pwm_on) * Regler_Hz / 1000.0)) {pump = 1 ;} //Set PWM from low to high
HMFK03LST1 5:d814001b8aae 412
HMFK03LST1 5:d814001b8aae 413
HMFK03LST1 5:d814001b8aae 414 if (counter_takt > (pwm_cycle * Regler_Hz / 1000)) //End PWM cycle
HMFK03LST1 1:19d350e383e6 415 {
HMFK03LST1 5:d814001b8aae 416 if (counter_cycle == (50)) TEMP(); //Temperatur messen
HMFK03LST1 5:d814001b8aae 417 counter_takt = 0;
HMFK03LST1 2:bdd944abaf86 418 counter_cycle++;
HMFK03LST1 2:bdd944abaf86 419
HMFK03LST1 5:d814001b8aae 420 if ((boost > 0) && (pump_block == 0)) {boost--;}
HMFK03LST1 1:19d350e383e6 421
HMFK03LST1 5:d814001b8aae 422 if (counter_cycle >= ((purge_start - boost_time) * 1000 / pwm_cycle)) //Vorgezogener Anlauf Purgepumpe
HMFK03LST1 5:d814001b8aae 423 {
HMFK03LST1 5:d814001b8aae 424 if (pump = 1) purge = 1;
HMFK03LST1 5:d814001b8aae 425 }
HMFK03LST1 5:d814001b8aae 426
HMFK03LST1 5:d814001b8aae 427 if (counter_cycle < ((purge_start - boost_time) * 1000 / pwm_cycle))
HMFK03LST1 5:d814001b8aae 428 {
HMFK03LST1 5:d814001b8aae 429 if (boost == 0) pump = 0; //PWM Betrieb
HMFK03LST1 1:19d350e383e6 430 purge = 0;
HMFK03LST1 1:19d350e383e6 431 }
HMFK03LST1 1:19d350e383e6 432 else
HMFK03LST1 1:19d350e383e6 433 {
HMFK03LST1 5:d814001b8aae 434 pump = 0;
HMFK03LST1 1:19d350e383e6 435 }
HMFK03LST1 1:19d350e383e6 436
HMFK03LST1 5:d814001b8aae 437 if (counter_cycle >= (purge_end * (1000 / pwm_cycle ))) //Purge Ende counter_cycle = 1 pro Mosfet (PWM 1000/Regler_Hz in [ms])
HMFK03LST1 1:19d350e383e6 438 {
HMFK03LST1 2:bdd944abaf86 439 counter_cycle = 0;
HMFK03LST1 1:19d350e383e6 440 purge = 0;
HMFK03LST1 1:19d350e383e6 441 pump = 0;
HMFK03LST1 5:d814001b8aae 442 if (pump_block > 0) pump_block--;
HMFK03LST1 1:19d350e383e6 443 }
HMFK03LST1 1:19d350e383e6 444 }
HMFK03LST1 1:19d350e383e6 445 }
HMFK03LST1 1:19d350e383e6 446 else
HMFK03LST1 1:19d350e383e6 447 {
HMFK03LST1 1:19d350e383e6 448 pump_on = 0; pump = 0; purge = 0; //Pumpe aus
HMFK03LST1 5:d814001b8aae 449 boost = (boost_time * 1000 / pwm_cycle); // Boost für nächsten Start setzen
HMFK03LST1 1:19d350e383e6 450 }
HMFK03LST1 0:4f562ff70d13 451
HMFK03LST1 1:19d350e383e6 452 }
HMFK03LST1 1:19d350e383e6 453
HMFK03LST1 1:19d350e383e6 454 int main()
HMFK03LST1 2:bdd944abaf86 455 {
HMFK03LST1 5:d814001b8aae 456 mosfet = mosfet_open; //Mosfet schließen
HMFK03LST1 0:4f562ff70d13 457 pc.baud(115200); //config Serial Port
HMFK03LST1 0:4f562ff70d13 458 load_cfg(); //init config File
HMFK03LST1 5:d814001b8aae 459 //semihost_powerdown(); //Mbed Interface powerdown
HMFK03LST1 1:19d350e383e6 460 PC_OUT_timer.attach(&SEND , (1/sample)); //Serial output Timer
HMFK03LST1 5:d814001b8aae 461 LED_timer.attach (&LED , 0.200 ); //LED Status Timer
HMFK03LST1 5:d814001b8aae 462
HMFK03LST1 0:4f562ff70d13 463 t.start(); //Timer für PWM starten
HMFK03LST1 2:bdd944abaf86 464 float bz_faktor; //Temp Variable
HMFK03LST1 5:d814001b8aae 465 unsigned int pwm_cycle_count;
HMFK03LST1 5:d814001b8aae 466 bool power_up = 0;
HMFK03LST1 5:d814001b8aae 467
HMFK03LST1 5:d814001b8aae 468 pwm_cycle_count = ((1000000/Regler_Hz));
HMFK03LST1 2:bdd944abaf86 469 bz_faktor = ((bz_p_oben - bz_p_unten)/(bz_max - bz_min)); //Prozent Umrechnung BZ
HMFK03LST1 2:bdd944abaf86 470
HMFK03LST1 2:bdd944abaf86 471
HMFK03LST1 0:4f562ff70d13 472
HMFK03LST1 0:4f562ff70d13 473 while(1)
HMFK03LST1 0:4f562ff70d13 474 {
HMFK03LST1 5:d814001b8aae 475 while (t.read_us() <= pwm_cycle_count){};
HMFK03LST1 5:d814001b8aae 476
HMFK03LST1 5:d814001b8aae 477 get_input(); //µs Timer für Mosfet PWM starten
HMFK03LST1 5:d814001b8aae 478 PUMPE(); //Pumpen PWM aufrufen
HMFK03LST1 5:d814001b8aae 479
HMFK03LST1 5:d814001b8aae 480 bz = (((24.54 * bz_in * bz_in)+(31.812 * bz_in)+0.04)*2 + bz )/3; //BZ RAW in Spannung umrechnen (2*neu zu 1*alt Glättung) (immer)
HMFK03LST1 5:d814001b8aae 481 if (counter_takt%2 == 0){cap = (((24.54 * cap_in * cap_in)+(31.812 * cap_in + 0.04))*2 + cap_in )/3;} //CAP RAW in Spannung umrechnen (2*neu zu 1*alt Glättung) (jedes 2.mal)
HMFK03LST1 5:d814001b8aae 482 else {current = (cur_in - 0.32) * 12.568;} //Current RAW in Spannung umrechnen (ohne Glättung) (jedes 2.mal)
HMFK03LST1 5:d814001b8aae 483
HMFK03LST1 5:d814001b8aae 484
HMFK03LST1 5:d814001b8aae 485
HMFK03LST1 3:af6a6f498276 486 //***Regulate Cell Level***
HMFK03LST1 5:d814001b8aae 487 Cel_Level = (bz_faktor * (bz - bz_min) + bz_p_unten); //%Load aus Zellenspannung berechnen
HMFK03LST1 3:af6a6f498276 488
HMFK03LST1 3:af6a6f498276 489 //***Regulate Cap´s Level***
HMFK03LST1 5:d814001b8aae 490 Cap_Level = (((cap / cap_max) * (cap_p_max - cap_p_min)) + cap_p_min); //%Load aus Cap Level
HMFK03LST1 3:af6a6f498276 491
HMFK03LST1 3:af6a6f498276 492 //***Regulate Current Level***
HMFK03LST1 5:d814001b8aae 493 if (cap < cap_min) {power_up = 1;};
HMFK03LST1 5:d814001b8aae 494 if (cap > 0.9*cap_max){power_up = 0;};
HMFK03LST1 5:d814001b8aae 495 if ((current-(bz_current + (power_up * bz_cur_add))) > 0)
HMFK03LST1 5:d814001b8aae 496 {if (Cur_Level > (bz_c_i_min)) Cur_Level--;} //to much Load
HMFK03LST1 3:af6a6f498276 497 else
HMFK03LST1 5:d814001b8aae 498 {if (Cur_Level < (bz_c_i_max)) Cur_Level++;} //less Load
HMFK03LST1 3:af6a6f498276 499
HMFK03LST1 3:af6a6f498276 500 //*** Sum all Regulators
HMFK03LST1 3:af6a6f498276 501
HMFK03LST1 4:8c89e422bed7 502 Load_Level = Cur_Level;
HMFK03LST1 4:8c89e422bed7 503 Load_Level = Load_Level + Cap_Level;
HMFK03LST1 4:8c89e422bed7 504 Load_Level = Load_Level + Cel_Level;
HMFK03LST1 5:d814001b8aae 505 if (Load_Level > 100) Load_Level = 100;
HMFK03LST1 5:d814001b8aae 506 if (Load_Level < 0) Load_Level = 0;
HMFK03LST1 2:bdd944abaf86 507
HMFK03LST1 5:d814001b8aae 508 t.reset();
HMFK03LST1 5:d814001b8aae 509
HMFK03LST1 5:d814001b8aae 510 if (Load == true) // Laden aktiv
HMFK03LST1 2:bdd944abaf86 511 {
HMFK03LST1 3:af6a6f498276 512
HMFK03LST1 5:d814001b8aae 513 if (bz > bz_min || bz > bz_max) // Zelle über min. Spannung oder über max Spannung zum Entladen
HMFK03LST1 2:bdd944abaf86 514 {
HMFK03LST1 5:d814001b8aae 515 while (t.read_us() <= pwm_cycle_count) // während der PWM (1khz Periode)
HMFK03LST1 2:bdd944abaf86 516 {
HMFK03LST1 5:d814001b8aae 517 if (t.read_us() < Load_Level * 10000 / Regler_Hz) // %Load PWM zu Timer vergleich
HMFK03LST1 5:d814001b8aae 518 {mosfet = mosfet_close;} // %Load PWM nicht erreicht Mosfet an
HMFK03LST1 2:bdd944abaf86 519 else
HMFK03LST1 5:d814001b8aae 520 {mosfet = mosfet_open;} // %Load PWM erreicht Mosfet aus
HMFK03LST1 2:bdd944abaf86 521 }
HMFK03LST1 2:bdd944abaf86 522 }
HMFK03LST1 2:bdd944abaf86 523 else
HMFK03LST1 2:bdd944abaf86 524 {
HMFK03LST1 5:d814001b8aae 525 mosfet = mosfet_open ; // Mosfet wegen Unterspannung BZ auskoppeln
HMFK03LST1 5:d814001b8aae 526 Load = false; // Laden beenden bis BZ > BZ on (Sicherungsschaltung)
HMFK03LST1 2:bdd944abaf86 527 }
HMFK03LST1 2:bdd944abaf86 528 }
HMFK03LST1 2:bdd944abaf86 529 else
HMFK03LST1 2:bdd944abaf86 530 {
HMFK03LST1 5:d814001b8aae 531 if (bz > cap + 0.5){mosfet = mosfet_open ;} // Mosfet im nicht Ladebetrieb auskoppeln
HMFK03LST1 5:d814001b8aae 532 else {mosfet = mosfet_close;} // Mosfet im nicht Ladebetrieb einkoppeln (Treiber stromfrei = Stromsparen)
HMFK03LST1 0:4f562ff70d13 533 }
HMFK03LST1 5:d814001b8aae 534
HMFK03LST1 5:d814001b8aae 535
HMFK03LST1 0:4f562ff70d13 536
HMFK03LST1 5:d814001b8aae 537 if ((current < 0.2) && (Cur_Level > (0.9 * bz_c_i_max)) && (Load == true)){Load = false; load_fail = 100;}
HMFK03LST1 5:d814001b8aae 538
HMFK03LST1 5:d814001b8aae 539 if (( cap < cap_min) && (bz > bz_on) && (Load == false))
HMFK03LST1 5:d814001b8aae 540 {
HMFK03LST1 5:d814001b8aae 541 Load = true;
HMFK03LST1 5:d814001b8aae 542 if (bz_c_i_min < 0) {Cur_Level = 2 * bz_c_i_min;}else {Cur_Level = -100;} // Cap unter Minimum oder BZ über Maximum = Laden beginnen / PWM vom Minimum Starten
HMFK03LST1 5:d814001b8aae 543 }
HMFK03LST1 5:d814001b8aae 544
HMFK03LST1 5:d814001b8aae 545 if ( bz > bz_max && load_fail == 0) Load = true; // Überladung abführen
HMFK03LST1 5:d814001b8aae 546
HMFK03LST1 5:d814001b8aae 547 if (load_fail > 0){load_fail--;pump_on = false;}
HMFK03LST1 5:d814001b8aae 548
HMFK03LST1 0:4f562ff70d13 549 }
HMFK03LST1 5:d814001b8aae 550
HMFK03LST1 0:4f562ff70d13 551 }