Mosfet Driver

Dependencies:   mbed

Committer:
HMFK03LST1
Date:
Tue May 07 01:30:58 2013 +0000
Revision:
3:af6a6f498276
Parent:
2:bdd944abaf86
Child:
4:8c89e422bed7
v1.3

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 2:bdd944abaf86 8 float version = 0.8; //Program Version
HMFK03LST1 2:bdd944abaf86 9
HMFK03LST1 2:bdd944abaf86 10 bool mosfet1_open = true ; //Mosfet1 geschlossen
HMFK03LST1 2:bdd944abaf86 11 bool mosfet1_close = false; //Mosfet1 offen
HMFK03LST1 1:19d350e383e6 12
HMFK03LST1 0:4f562ff70d13 13 DigitalOut myled (LED1);
HMFK03LST1 0:4f562ff70d13 14 DigitalOut myled1 (LED2);
HMFK03LST1 0:4f562ff70d13 15 DigitalOut myled2 (LED3);
HMFK03LST1 1:19d350e383e6 16 DigitalOut myled3 (LED4);
HMFK03LST1 0:4f562ff70d13 17
HMFK03LST1 0:4f562ff70d13 18 DigitalOut purge (p33);
HMFK03LST1 0:4f562ff70d13 19 DigitalOut pump (p34);
HMFK03LST1 0:4f562ff70d13 20 DigitalOut mosfet1(p35);
HMFK03LST1 0:4f562ff70d13 21 DigitalOut mosfet2(p36);
HMFK03LST1 0:4f562ff70d13 22 DigitalIn In1 (p30);
HMFK03LST1 0:4f562ff70d13 23 DigitalIn In2 (p29);
HMFK03LST1 0:4f562ff70d13 24 DigitalIn In3 (p28);
HMFK03LST1 0:4f562ff70d13 25 DigitalIn In4 (p27);
HMFK03LST1 0:4f562ff70d13 26 AnalogIn AI1 (p17);
HMFK03LST1 2:bdd944abaf86 27 AnalogIn cur_in (p18);
HMFK03LST1 0:4f562ff70d13 28 AnalogIn bz_in (p19);
HMFK03LST1 0:4f562ff70d13 29 AnalogIn cap_in (p20);
HMFK03LST1 0:4f562ff70d13 30
HMFK03LST1 0:4f562ff70d13 31 Serial pc(USBTX, USBRX);
HMFK03LST1 2:bdd944abaf86 32 Ticker PC_OUT_timer; // Output Monitoring to Serial
HMFK03LST1 2:bdd944abaf86 33 Ticker LED_timer; // Set Status LED´s
HMFK03LST1 1:19d350e383e6 34
HMFK03LST1 0:4f562ff70d13 35 Timer t;
HMFK03LST1 0:4f562ff70d13 36
HMFK03LST1 2:bdd944abaf86 37
HMFK03LST1 2:bdd944abaf86 38 // Brennstoffzellen Parameter
HMFK03LST1 2:bdd944abaf86 39 float bz_max = 30.5; //Brennstoffzelle Spannung Abs. max.
HMFK03LST1 3:af6a6f498276 40 float bz_p_oben = 15.0; //Brennstoffzelle Prozent Load bei bz_max
HMFK03LST1 2:bdd944abaf86 41 float bz_on = 29.0; //Brennstoffzelle Spannung für Ladefreigabe)
HMFK03LST1 2:bdd944abaf86 42 float bz_min = 26.0; //Brennstoffzelle Spannung min. Laden beenden
HMFK03LST1 2:bdd944abaf86 43 float bz_p_unten = -20.0; //Brennstoffzelle Prozent Load bei bz_min
HMFK03LST1 2:bdd944abaf86 44 float bz_current = 1.5; //Brennstoffzellen Strom nominal
HMFK03LST1 3:af6a6f498276 45 float bz_cur_add = 2.0; //Brennstoffzellen Strom max
HMFK03LST1 3:af6a6f498276 46 float bz_c_i_max = 20.0; //Strom Integrale Reglung Max %
HMFK03LST1 3:af6a6f498276 47 float bz_c_i_min = -10.0; //Strom Integrale Reglung Min %
HMFK03LST1 2:bdd944abaf86 48
HMFK03LST1 2:bdd944abaf86 49 // SuperCap Parameter
HMFK03LST1 2:bdd944abaf86 50 float cap_max = 25.0; //CAP Spannung max. (Abschaltung)
HMFK03LST1 3:af6a6f498276 51 float cap_p_max = 90.0; //CAP Prozent Load bei 0V
HMFK03LST1 2:bdd944abaf86 52 float cap_min = 20.0; //CAP Spannung min. (Zelle an)
HMFK03LST1 3:af6a6f498276 53 float cap_p_min = 5.0; //CAP Prozent Load bei 0V
HMFK03LST1 2:bdd944abaf86 54 float cap_delta = 1.5; //Absenkung der Spannung mit Din
HMFK03LST1 0:4f562ff70d13 55
HMFK03LST1 2:bdd944abaf86 56 // Pump & Purge Parameter
HMFK03LST1 2:bdd944abaf86 57 float purge_start = 3.0; //s before starting purch
HMFK03LST1 2:bdd944abaf86 58 float purge_end = 3.2; //s after finishing purch
HMFK03LST1 2:bdd944abaf86 59 float boost_time = 0.2; //s Pump runup with 100% Duty Cycle
HMFK03LST1 2:bdd944abaf86 60 int pwm_cycle = 20; //ms für PWM Period
HMFK03LST1 2:bdd944abaf86 61 int pwm_on = 12; //ms für PWM high
HMFK03LST1 2:bdd944abaf86 62
HMFK03LST1 2:bdd944abaf86 63 // Monitoring Parameter
HMFK03LST1 2:bdd944abaf86 64 int debug = 1; //Serial Output on (1)
HMFK03LST1 2:bdd944abaf86 65 float sample = 5; //Serial Output Samples per Second
HMFK03LST1 0:4f562ff70d13 66
HMFK03LST1 2:bdd944abaf86 67 // Temp Variable
HMFK03LST1 2:bdd944abaf86 68 bool Load = false; //Laderegler aktiv
HMFK03LST1 2:bdd944abaf86 69 bool pump_on = false; //Pumpenzustand
HMFK03LST1 2:bdd944abaf86 70 int boost = 0; //Number of PWM-Cycles for Pump runup boost calc in load_cfg
HMFK03LST1 3:af6a6f498276 71 int Cel_Level = 0; //% Load aus Bz Spannung
HMFK03LST1 2:bdd944abaf86 72 int Cap_Level = 0; //% Load aus Cap Spannung
HMFK03LST1 2:bdd944abaf86 73 int Cur_Level = 0;
HMFK03LST1 2:bdd944abaf86 74 int Load_Level = 0; //% Load aus Bz und Cap
HMFK03LST1 2:bdd944abaf86 75 float bz = 0; //Spannung Brennstoffzelle
HMFK03LST1 2:bdd944abaf86 76 float cap = 0; //Spannung SuperCap
HMFK03LST1 2:bdd944abaf86 77 float current = 0; //Strom in den Mosfet
HMFK03LST1 2:bdd944abaf86 78 unsigned int counter_cycle = 0; //Counter PWM-Cycles for Pump-Purge
HMFK03LST1 2:bdd944abaf86 79 unsigned int counter_ms = 0; //Counter for PWM Pump
HMFK03LST1 0:4f562ff70d13 80
HMFK03LST1 2:bdd944abaf86 81
HMFK03LST1 0:4f562ff70d13 82 void load_cfg()
HMFK03LST1 0:4f562ff70d13 83 {
HMFK03LST1 3:af6a6f498276 84 char read[24][5];
HMFK03LST1 0:4f562ff70d13 85
HMFK03LST1 0:4f562ff70d13 86 char i = 0;
HMFK03LST1 0:4f562ff70d13 87 char j = 0;
HMFK03LST1 0:4f562ff70d13 88 int c = 0;
HMFK03LST1 0:4f562ff70d13 89 float temp;
HMFK03LST1 0:4f562ff70d13 90
HMFK03LST1 3:af6a6f498276 91 for (j = 0; j<24; j++)
HMFK03LST1 0:4f562ff70d13 92 {
HMFK03LST1 2:bdd944abaf86 93 for (i = 0; i<8; i++)
HMFK03LST1 0:4f562ff70d13 94 {
HMFK03LST1 0:4f562ff70d13 95 read[j][i] = '\0';
HMFK03LST1 0:4f562ff70d13 96 }
HMFK03LST1 0:4f562ff70d13 97 }
HMFK03LST1 0:4f562ff70d13 98
HMFK03LST1 0:4f562ff70d13 99 i=0;
HMFK03LST1 0:4f562ff70d13 100 j=0;
HMFK03LST1 0:4f562ff70d13 101
HMFK03LST1 0:4f562ff70d13 102 fp = fopen("/local/power.cfg", "r");
HMFK03LST1 0:4f562ff70d13 103 if ( fp != NULL )
HMFK03LST1 0:4f562ff70d13 104 {
HMFK03LST1 0:4f562ff70d13 105 while((c != EOF) && (c !=10))
HMFK03LST1 0:4f562ff70d13 106 {
HMFK03LST1 0:4f562ff70d13 107 c = fgetc(fp);
HMFK03LST1 0:4f562ff70d13 108 if (c == ';'){read[j][0] = i; i = 0; j++;}
HMFK03LST1 0:4f562ff70d13 109 else {i++; read[j][i] = c;}
HMFK03LST1 0:4f562ff70d13 110 }
HMFK03LST1 0:4f562ff70d13 111 fclose(fp);
HMFK03LST1 0:4f562ff70d13 112
HMFK03LST1 0:4f562ff70d13 113
HMFK03LST1 2:bdd944abaf86 114 sscanf(&read[ 0][1], "%f", &temp); bz_max = temp;
HMFK03LST1 2:bdd944abaf86 115 sscanf(&read[ 1][1], "%f", &temp); bz_p_oben = temp;
HMFK03LST1 2:bdd944abaf86 116 sscanf(&read[ 2][1], "%f", &temp); bz_on = temp;
HMFK03LST1 2:bdd944abaf86 117 sscanf(&read[ 3][1], "%f", &temp); bz_min = temp;
HMFK03LST1 2:bdd944abaf86 118 sscanf(&read[ 4][1], "%f", &temp); bz_p_unten = temp;
HMFK03LST1 3:af6a6f498276 119 sscanf(&read[ 5][1], "%f", &temp); bz_current = temp;
HMFK03LST1 3:af6a6f498276 120 sscanf(&read[ 6][1], "%f", &temp); bz_cur_add = temp;
HMFK03LST1 3:af6a6f498276 121 sscanf(&read[ 7][1], "%f", &temp); bz_c_i_max = temp;
HMFK03LST1 3:af6a6f498276 122 sscanf(&read[ 8][1], "%f", &temp); bz_c_i_min = temp;
HMFK03LST1 3:af6a6f498276 123
HMFK03LST1 3:af6a6f498276 124 sscanf(&read[ 9][1], "%f", &temp); cap_max = temp;
HMFK03LST1 3:af6a6f498276 125 sscanf(&read[10][1], "%f", &temp); cap_p_max = temp;
HMFK03LST1 3:af6a6f498276 126 sscanf(&read[11][1], "%f", &temp); cap_min = temp;
HMFK03LST1 3:af6a6f498276 127 sscanf(&read[12][1], "%f", &temp); cap_p_min = temp;
HMFK03LST1 3:af6a6f498276 128 sscanf(&read[13][1], "%f", &temp); cap_delta = temp;
HMFK03LST1 3:af6a6f498276 129
HMFK03LST1 3:af6a6f498276 130 sscanf(&read[14][1], "%f", &temp); purge_start = temp;
HMFK03LST1 3:af6a6f498276 131 sscanf(&read[15][1], "%f", &temp); purge_end = temp;
HMFK03LST1 3:af6a6f498276 132 sscanf(&read[16][1], "%f", &temp); boost_time = temp;
HMFK03LST1 3:af6a6f498276 133 sscanf(&read[17][1], "%f", &temp); pwm_cycle = temp;
HMFK03LST1 3:af6a6f498276 134 sscanf(&read[18][1], "%f", &temp); pwm_on = temp;
HMFK03LST1 3:af6a6f498276 135
HMFK03LST1 3:af6a6f498276 136 sscanf(&read[19][1], "%f", &temp); debug = temp;
HMFK03LST1 3:af6a6f498276 137 sscanf(&read[20][1], "%f", &temp); sample = temp;
HMFK03LST1 0:4f562ff70d13 138
HMFK03LST1 2:bdd944abaf86 139 boost = (boost_time * 1000) / pwm_cycle;
HMFK03LST1 2:bdd944abaf86 140 }
HMFK03LST1 0:4f562ff70d13 141
HMFK03LST1 2:bdd944abaf86 142 pc.printf("\n\r" );
HMFK03LST1 3:af6a6f498276 143 pc.printf("******************************** \n\r" );
HMFK03LST1 2:bdd944abaf86 144 pc.printf("* Brennstoffzellenregler V%03.1f * \n\r",version);
HMFK03LST1 3:af6a6f498276 145 pc.printf("******************************** \n\r" );
HMFK03LST1 3:af6a6f498276 146 pc.printf("--------------BZ---------------- \n\r" );
HMFK03LST1 3:af6a6f498276 147 pc.printf(" BZ max [V] : %4.1f \n\r",bz_max );
HMFK03LST1 3:af6a6f498276 148 pc.printf(" BZ max [%c] : %4.1f \n\r",37,bz_p_oben );
HMFK03LST1 3:af6a6f498276 149 pc.printf(" BZ Laden on [V] : %4.1f \n\r",bz_on );
HMFK03LST1 3:af6a6f498276 150 pc.printf(" BZ Laden off [V] : %4.1f \n\r",bz_min );
HMFK03LST1 3:af6a6f498276 151 pc.printf(" BZ Laden off [%c] : %4.1f \n\r",37,bz_p_unten );
HMFK03LST1 3:af6a6f498276 152 pc.printf(" BZ Strom norm [A] : %4.1f \n\r",bz_current );
HMFK03LST1 3:af6a6f498276 153 pc.printf(" BZ Strom max. [A] : %4.1f \n\r",bz_cur_add );
HMFK03LST1 3:af6a6f498276 154 pc.printf(" BZ Strom I max.[%c] : %4.1f \n\r",37,bz_c_i_max );
HMFK03LST1 3:af6a6f498276 155 pc.printf(" BZ Strom I min.[%c] : %4.1f \n\r",37,bz_c_i_min );
HMFK03LST1 3:af6a6f498276 156 pc.printf("-------------CAP---------------- \n\r" );
HMFK03LST1 3:af6a6f498276 157 pc.printf(" CAP max [V] : %4.1f \n\r",cap_max );
HMFK03LST1 3:af6a6f498276 158 pc.printf(" CAP max [%c] : %4.1f \n\r",37,cap_p_max );
HMFK03LST1 3:af6a6f498276 159 pc.printf(" CAP min [V] : %4.1f \n\r",cap_min );
HMFK03LST1 3:af6a6f498276 160 pc.printf(" CAP min [%c] : %4.1f \n\r",37,cap_p_min );
HMFK03LST1 3:af6a6f498276 161 pc.printf(" CAP lo on Din [-V]: %4.1f \n\r",cap_delta );
HMFK03LST1 3:af6a6f498276 162 pc.printf("----------Pump & Purge---------- \n\r" );
HMFK03LST1 3:af6a6f498276 163 pc.printf(" Purge on [s] : %4.1f \n\r",purge_start );
HMFK03LST1 3:af6a6f498276 164 pc.printf(" Purge off [s] : %4.1f \n\r",purge_end );
HMFK03LST1 3:af6a6f498276 165 pc.printf(" Boost [s] : %4.1f \n\r",boost_time );
HMFK03LST1 3:af6a6f498276 166 pc.printf(" PWM cycle [ms]: %4d \n\r" ,pwm_cycle );
HMFK03LST1 3:af6a6f498276 167 pc.printf(" PWM on [ms]: %4d \n\r" ,pwm_on );
HMFK03LST1 3:af6a6f498276 168 pc.printf("------------Monitor------------- \n\r" );
HMFK03LST1 3:af6a6f498276 169 pc.printf(" Serial output [bool]: %4d \n\r" ,debug );
HMFK03LST1 3:af6a6f498276 170 pc.printf(" Samplerate [Hz] : %4.0f \n\r",sample );
HMFK03LST1 3:af6a6f498276 171 pc.printf("******************************** \n\r" );
HMFK03LST1 3:af6a6f498276 172 pc.printf("\n\r" );
HMFK03LST1 0:4f562ff70d13 173 }
HMFK03LST1 0:4f562ff70d13 174
HMFK03LST1 2:bdd944abaf86 175
HMFK03LST1 1:19d350e383e6 176 int semihost_powerdown()
HMFK03LST1 1:19d350e383e6 177 {
HMFK03LST1 1:19d350e383e6 178 uint32_t arg;
HMFK03LST1 1:19d350e383e6 179 return __semihost(USR_POWERDOWN, &arg);
HMFK03LST1 1:19d350e383e6 180 }
HMFK03LST1 1:19d350e383e6 181
HMFK03LST1 2:bdd944abaf86 182
HMFK03LST1 1:19d350e383e6 183 void SEND()
HMFK03LST1 1:19d350e383e6 184 {
HMFK03LST1 3:af6a6f498276 185 bool status= false;
HMFK03LST1 3:af6a6f498276 186 if (debug == 1)
HMFK03LST1 2:bdd944abaf86 187 {
HMFK03LST1 3:af6a6f498276 188 if (mosfet1 == (mosfet1_close)) status = true;
HMFK03LST1 2:bdd944abaf86 189 mosfet1 = mosfet1_open;
HMFK03LST1 2:bdd944abaf86 190 pc.printf("BZ: %4.1f/%4.1f-%4.1f+%4.1f CAP: %4.1f/%4.1f-%4.1f Purge: %4.1f/%4.1f-%4.1f Load: %03d Current: %4.2f \n\r"
HMFK03LST1 2:bdd944abaf86 191 ,bz,bz_min,bz_on,bz_max,cap,cap_min,cap_max,float(counter_cycle)/(1000/pwm_cycle),purge_start,purge_end,Load_Level, current);
HMFK03LST1 3:af6a6f498276 192 if (status == true) mosfet1 = mosfet1_close;
HMFK03LST1 2:bdd944abaf86 193 }
HMFK03LST1 1:19d350e383e6 194 }
HMFK03LST1 1:19d350e383e6 195
HMFK03LST1 1:19d350e383e6 196
HMFK03LST1 1:19d350e383e6 197 void LED()
HMFK03LST1 1:19d350e383e6 198 {
HMFK03LST1 2:bdd944abaf86 199 if (bz < bz_min ) myled = 1; else myled = 0; //LED = Spannung an der BZ IO
HMFK03LST1 1:19d350e383e6 200 if (cap > cap_min) myled1 = 1; else myled1 = 0; //LED = Spannung an den Cap´s IO
HMFK03LST1 1:19d350e383e6 201 if (mosfet1 == mosfet1_close) myled2 = 1; else myled2 = 0; //LED = Gate Zustand Mosfet 1
HMFK03LST1 3:af6a6f498276 202 if (pump_on == 1) myled3 = 1; else myled3 = 0; //LED = Pumpe an
HMFK03LST1 1:19d350e383e6 203 }
HMFK03LST1 0:4f562ff70d13 204
HMFK03LST1 0:4f562ff70d13 205
HMFK03LST1 1:19d350e383e6 206 void PUMPE()
HMFK03LST1 1:19d350e383e6 207 {
HMFK03LST1 2:bdd944abaf86 208 counter_ms++;
HMFK03LST1 3:af6a6f498276 209
HMFK03LST1 3:af6a6f498276 210 if ((bz > bz_max) && (cap > (cap_max - (In1 * cap_delta))))
HMFK03LST1 3:af6a6f498276 211 {
HMFK03LST1 3:af6a6f498276 212 pump_on = false;
HMFK03LST1 3:af6a6f498276 213 }
HMFK03LST1 3:af6a6f498276 214
HMFK03LST1 3:af6a6f498276 215
HMFK03LST1 3:af6a6f498276 216 if ((cap <= cap_min) || (pump_on == true)) //Pumpe Einschaltbedingung
HMFK03LST1 2:bdd944abaf86 217 {
HMFK03LST1 1:19d350e383e6 218 pump_on = true;
HMFK03LST1 2:bdd944abaf86 219 if (counter_ms > (pwm_cycle - pwm_on)) pump = 1 ; //Set PWM from low to high
HMFK03LST1 1:19d350e383e6 220
HMFK03LST1 2:bdd944abaf86 221 if (counter_ms >= pwm_cycle) //End PWM cycle
HMFK03LST1 1:19d350e383e6 222 {
HMFK03LST1 2:bdd944abaf86 223 counter_cycle++;
HMFK03LST1 2:bdd944abaf86 224 counter_ms = 0;
HMFK03LST1 2:bdd944abaf86 225
HMFK03LST1 1:19d350e383e6 226 if (boost > 0) boost--;
HMFK03LST1 1:19d350e383e6 227
HMFK03LST1 2:bdd944abaf86 228 if ((counter_cycle < (1000 / pwm_cycle) * purge_start) || (boost <= 0) || (In1 == 0))
HMFK03LST1 1:19d350e383e6 229 {
HMFK03LST1 2:bdd944abaf86 230 pump = 0; //PWM Betrieb
HMFK03LST1 1:19d350e383e6 231 purge = 0;
HMFK03LST1 1:19d350e383e6 232 }
HMFK03LST1 1:19d350e383e6 233 else
HMFK03LST1 1:19d350e383e6 234 {
HMFK03LST1 2:bdd944abaf86 235 if (pump == 1) purge = 1; //Purge Betrieb
HMFK03LST1 1:19d350e383e6 236 }
HMFK03LST1 1:19d350e383e6 237
HMFK03LST1 2:bdd944abaf86 238 if (counter_cycle > (1000 / pwm_cycle) * purge_end) //Purge Ende
HMFK03LST1 1:19d350e383e6 239 {
HMFK03LST1 2:bdd944abaf86 240 counter_cycle = 0;
HMFK03LST1 1:19d350e383e6 241 purge = 0;
HMFK03LST1 1:19d350e383e6 242 pump = 0;
HMFK03LST1 1:19d350e383e6 243 }
HMFK03LST1 1:19d350e383e6 244 }
HMFK03LST1 1:19d350e383e6 245 }
HMFK03LST1 1:19d350e383e6 246 else
HMFK03LST1 1:19d350e383e6 247 {
HMFK03LST1 1:19d350e383e6 248 pump_on = 0; pump = 0; purge = 0; //Pumpe aus
HMFK03LST1 1:19d350e383e6 249 boost = (boost_time * 1000) / pwm_cycle; // Boost für nächsten Start setzen
HMFK03LST1 1:19d350e383e6 250 }
HMFK03LST1 0:4f562ff70d13 251
HMFK03LST1 1:19d350e383e6 252 }
HMFK03LST1 1:19d350e383e6 253
HMFK03LST1 1:19d350e383e6 254 int main()
HMFK03LST1 2:bdd944abaf86 255 {
HMFK03LST1 0:4f562ff70d13 256 pc.baud(115200); //config Serial Port
HMFK03LST1 0:4f562ff70d13 257 load_cfg(); //init config File
HMFK03LST1 0:4f562ff70d13 258 semihost_powerdown(); //Mbed Interface powerdown
HMFK03LST1 1:19d350e383e6 259 PC_OUT_timer.attach(&SEND , (1/sample)); //Serial output Timer
HMFK03LST1 1:19d350e383e6 260 LED_timer.attach (&LED , 0.200 ); //LED Status Timer
HMFK03LST1 0:4f562ff70d13 261 t.start(); //Timer für PWM starten
HMFK03LST1 2:bdd944abaf86 262 float bz_faktor; //Temp Variable
HMFK03LST1 2:bdd944abaf86 263
HMFK03LST1 2:bdd944abaf86 264 bz_faktor = ((bz_p_oben - bz_p_unten)/(bz_max - bz_min)); //Prozent Umrechnung BZ
HMFK03LST1 2:bdd944abaf86 265
HMFK03LST1 2:bdd944abaf86 266
HMFK03LST1 0:4f562ff70d13 267
HMFK03LST1 0:4f562ff70d13 268 while(1)
HMFK03LST1 0:4f562ff70d13 269 {
HMFK03LST1 2:bdd944abaf86 270 bz = ((bz_in * 92.0) + bz )/3; //BZ RAW in Spannung umrechnen (2*neu zu 1*alt Glättung)
HMFK03LST1 2:bdd944abaf86 271 cap = ((cap_in * 92.0) + cap)/3; //CAP RAW in Spannung umrechnen (2*neu zu 1*alt Glättung)
HMFK03LST1 3:af6a6f498276 272 current = (cur_in * 23.75) - 4.12;
HMFK03LST1 3:af6a6f498276 273 t.reset(); // Timer für 1 kHz starten
HMFK03LST1 2:bdd944abaf86 274 PUMPE(); //Pumpen PWM aufrufen
HMFK03LST1 3:af6a6f498276 275
HMFK03LST1 3:af6a6f498276 276 //***Regulate Cell Level***
HMFK03LST1 3:af6a6f498276 277 Cel_Level = (bz_faktor * (bz - bz_min) + bz_p_unten) * 10; //%Load aus Zellenspannung berechnen
HMFK03LST1 3:af6a6f498276 278
HMFK03LST1 3:af6a6f498276 279 //***Regulate Cap´s Level***
HMFK03LST1 3:af6a6f498276 280 Cap_Level = (((cap / cap_max) *(cap_p_max - cap_p_min)) + cap_p_min) * 10; //%Load aus Cap Level
HMFK03LST1 3:af6a6f498276 281
HMFK03LST1 3:af6a6f498276 282 //***Regulate Current Level***
HMFK03LST1 3:af6a6f498276 283 if ((current-(bz_current + (In2 * bz_cur_add))) > 0)
HMFK03LST1 3:af6a6f498276 284 {if (Cur_Level > (bz_c_i_min*10)) Cur_Level--;} //to much Load
HMFK03LST1 3:af6a6f498276 285 else
HMFK03LST1 3:af6a6f498276 286 {if (Cur_Level < (bz_c_i_max*10)) Cur_Level++;} //less Load
HMFK03LST1 3:af6a6f498276 287
HMFK03LST1 3:af6a6f498276 288 //*** Sum all Regulators
HMFK03LST1 3:af6a6f498276 289
HMFK03LST1 3:af6a6f498276 290 //Load_Level = Cur_Level;
HMFK03LST1 3:af6a6f498276 291 Load_Level = Cap_Level;
HMFK03LST1 3:af6a6f498276 292 //Load_Level = Load_Level + Cel_Level;
HMFK03LST1 3:af6a6f498276 293
HMFK03LST1 2:bdd944abaf86 294
HMFK03LST1 2:bdd944abaf86 295 if (Load == true) // Laden aktiv
HMFK03LST1 2:bdd944abaf86 296 {
HMFK03LST1 3:af6a6f498276 297
HMFK03LST1 3:af6a6f498276 298 if (bz > bz_min || bz > bz_max) // Zelle über min. Spannung oder über max Spannung zum Entladen
HMFK03LST1 2:bdd944abaf86 299 {
HMFK03LST1 3:af6a6f498276 300 while (t.read_us() <= 920) // während der PWM (1khz Periode)
HMFK03LST1 2:bdd944abaf86 301 {
HMFK03LST1 2:bdd944abaf86 302 if (t.read_us() < Load_Level) // %Load PWM zu Timer vergleich
HMFK03LST1 2:bdd944abaf86 303 {mosfet1 = mosfet1_close;} // %Load PWM nicht erreicht Mosfet an
HMFK03LST1 2:bdd944abaf86 304 else
HMFK03LST1 2:bdd944abaf86 305 {mosfet1 = mosfet1_open;} // %Load PWM erreicht Mosfet aus
HMFK03LST1 2:bdd944abaf86 306 }
HMFK03LST1 2:bdd944abaf86 307 }
HMFK03LST1 2:bdd944abaf86 308 else
HMFK03LST1 2:bdd944abaf86 309 {
HMFK03LST1 2:bdd944abaf86 310 mosfet1 = mosfet1_open ; // Mosfet wegen Unterspannung BZ auskoppeln
HMFK03LST1 2:bdd944abaf86 311 Load = false; // Laden beenden bis BZ > BZ on (Sicherungsschaltung)
HMFK03LST1 2:bdd944abaf86 312 }
HMFK03LST1 2:bdd944abaf86 313 }
HMFK03LST1 2:bdd944abaf86 314 else
HMFK03LST1 2:bdd944abaf86 315 {
HMFK03LST1 2:bdd944abaf86 316 if (bz >= cap){mosfet1 = mosfet1_open ;} // Mosfet im nicht Ladebetrieb auskoppeln
HMFK03LST1 2:bdd944abaf86 317 else {mosfet1 = mosfet1_close;} // Mosfet im nicht Ladebetrieb einkoppeln (Treiber stromfrei = Stromsparen)
HMFK03LST1 3:af6a6f498276 318 while (t.read_us() <= 920){};
HMFK03LST1 0:4f562ff70d13 319 }
HMFK03LST1 2:bdd944abaf86 320
HMFK03LST1 0:4f562ff70d13 321
HMFK03LST1 3:af6a6f498276 322 if (( cap < cap_min) && (bz > bz_on)) Load = true; // Cap unter Minimum oder BZ über Maximum = Laden beginnen
HMFK03LST1 3:af6a6f498276 323 if ( cap >= cap_max ) Load = false; //
HMFK03LST1 3:af6a6f498276 324 if ( bz > bz_max ) Load = true; // Überladung abführen
HMFK03LST1 0:4f562ff70d13 325 }
HMFK03LST1 0:4f562ff70d13 326
HMFK03LST1 0:4f562ff70d13 327 }