Mosfet Driver

Dependencies:   mbed

Committer:
HMFK03LST1
Date:
Sun May 05 17:59:15 2013 +0000
Revision:
1:19d350e383e6
Parent:
0:4f562ff70d13
Child:
2:bdd944abaf86
v1.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
HMFK03LST1 0:4f562ff70d13 1 #include "mbed.h"
HMFK03LST1 0:4f562ff70d13 2
HMFK03LST1 0:4f562ff70d13 3 LocalFileSystem local("local"); //Flashdrive for config file
HMFK03LST1 0:4f562ff70d13 4 FILE *fp; //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 1:19d350e383e6 8 bool mosfet1_open = true ;
HMFK03LST1 1:19d350e383e6 9 bool mosfet1_close = false;
HMFK03LST1 1:19d350e383e6 10
HMFK03LST1 0:4f562ff70d13 11 DigitalOut myled (LED1);
HMFK03LST1 0:4f562ff70d13 12 DigitalOut myled1 (LED2);
HMFK03LST1 0:4f562ff70d13 13 DigitalOut myled2 (LED3);
HMFK03LST1 1:19d350e383e6 14 DigitalOut myled3 (LED4);
HMFK03LST1 0:4f562ff70d13 15
HMFK03LST1 0:4f562ff70d13 16 DigitalOut purge (p33);
HMFK03LST1 0:4f562ff70d13 17 DigitalOut pump (p34);
HMFK03LST1 0:4f562ff70d13 18 DigitalOut mosfet1(p35);
HMFK03LST1 0:4f562ff70d13 19 DigitalOut mosfet2(p36);
HMFK03LST1 0:4f562ff70d13 20 DigitalIn In1 (p30);
HMFK03LST1 0:4f562ff70d13 21 DigitalIn In2 (p29);
HMFK03LST1 0:4f562ff70d13 22 DigitalIn In3 (p28);
HMFK03LST1 0:4f562ff70d13 23 DigitalIn In4 (p27);
HMFK03LST1 0:4f562ff70d13 24 AnalogIn AI1 (p17);
HMFK03LST1 0:4f562ff70d13 25 AnalogIn AI2 (p18);
HMFK03LST1 0:4f562ff70d13 26 AnalogIn bz_in (p19);
HMFK03LST1 0:4f562ff70d13 27 AnalogIn cap_in (p20);
HMFK03LST1 0:4f562ff70d13 28
HMFK03LST1 0:4f562ff70d13 29
HMFK03LST1 0:4f562ff70d13 30 Serial pc(USBTX, USBRX);
HMFK03LST1 1:19d350e383e6 31 Ticker PC_OUT_timer;
HMFK03LST1 1:19d350e383e6 32 Ticker LED_timer;
HMFK03LST1 1:19d350e383e6 33 Ticker PUMPE_timer;
HMFK03LST1 1:19d350e383e6 34
HMFK03LST1 0:4f562ff70d13 35 Timer t;
HMFK03LST1 0:4f562ff70d13 36
HMFK03LST1 1:19d350e383e6 37 float bz_off = 16.0; //Brennstoffzellen Spannung min. Laden beenden
HMFK03LST1 1:19d350e383e6 38 float bz_on = 17.0; //Brennstoffzellen Spannung für Ladefreigabe)
HMFK03LST1 1:19d350e383e6 39 float bz_max = 18.0; //Brennstoffzellen Spannung Abs. max.
HMFK03LST1 1:19d350e383e6 40 float cap_max = 13.0; //CAP Spannung max. (Abschaltung)
HMFK03LST1 1:19d350e383e6 41 float cap_min = 9.0; //CAP Spannung min. (Zelle an)
HMFK03LST1 1:19d350e383e6 42 int pwm_cycle = 60; //ms für PWM Period
HMFK03LST1 1:19d350e383e6 43 int pwm_lo = 40; //ms für PWM high
HMFK03LST1 1:19d350e383e6 44 float purge_start= 60.0; //s before starting purch
HMFK03LST1 1:19d350e383e6 45 float purge_end = 60.2; //s after finishing purch
HMFK03LST1 1:19d350e383e6 46 float boost_time = 0.2; //s Pump runup with 100% Duty Cycle
HMFK03LST1 1:19d350e383e6 47 int boost = 25; //Number of PWM-Cycles for Pump runup boost
HMFK03LST1 1:19d350e383e6 48 int debug = 1; //Serial Output on (1)
HMFK03LST1 1:19d350e383e6 49 float gate_on = 3.5; //Mosfet opt. Gate Drain [V]
HMFK03LST1 1:19d350e383e6 50 float gate_off = 2.8; //Mosfet min. Gate Drain [V]
HMFK03LST1 1:19d350e383e6 51 float sample = 5; //Serial Output Samples per Second
HMFK03LST1 1:19d350e383e6 52 bool pump_on = false; //Pumpenzustand
HMFK03LST1 0:4f562ff70d13 53
HMFK03LST1 0:4f562ff70d13 54 float bz;
HMFK03LST1 0:4f562ff70d13 55 float cap;
HMFK03LST1 1:19d350e383e6 56 unsigned int counter;
HMFK03LST1 0:4f562ff70d13 57
HMFK03LST1 0:4f562ff70d13 58
HMFK03LST1 0:4f562ff70d13 59 void load_cfg()
HMFK03LST1 0:4f562ff70d13 60 {
HMFK03LST1 0:4f562ff70d13 61 char read[16][16];
HMFK03LST1 0:4f562ff70d13 62
HMFK03LST1 0:4f562ff70d13 63 char i = 0;
HMFK03LST1 0:4f562ff70d13 64 char j = 0;
HMFK03LST1 0:4f562ff70d13 65 int c = 0;
HMFK03LST1 0:4f562ff70d13 66 float temp;
HMFK03LST1 0:4f562ff70d13 67
HMFK03LST1 0:4f562ff70d13 68 for (j = 0; j<16; j++)
HMFK03LST1 0:4f562ff70d13 69 {
HMFK03LST1 0:4f562ff70d13 70 for (i = 0; i<16; i++)
HMFK03LST1 0:4f562ff70d13 71 {
HMFK03LST1 0:4f562ff70d13 72 read[j][i] = '\0';
HMFK03LST1 0:4f562ff70d13 73 }
HMFK03LST1 0:4f562ff70d13 74 }
HMFK03LST1 0:4f562ff70d13 75
HMFK03LST1 0:4f562ff70d13 76 i=0;
HMFK03LST1 0:4f562ff70d13 77 j=0;
HMFK03LST1 0:4f562ff70d13 78
HMFK03LST1 0:4f562ff70d13 79 fp = fopen("/local/power.cfg", "r");
HMFK03LST1 0:4f562ff70d13 80 if ( fp != NULL )
HMFK03LST1 0:4f562ff70d13 81 {
HMFK03LST1 0:4f562ff70d13 82 while((c != EOF) && (c !=10))
HMFK03LST1 0:4f562ff70d13 83 {
HMFK03LST1 0:4f562ff70d13 84 c = fgetc(fp);
HMFK03LST1 0:4f562ff70d13 85 if (c == ';'){read[j][0] = i; i = 0; j++;}
HMFK03LST1 0:4f562ff70d13 86 else {i++; read[j][i] = c;}
HMFK03LST1 0:4f562ff70d13 87 }
HMFK03LST1 0:4f562ff70d13 88 fclose(fp);
HMFK03LST1 0:4f562ff70d13 89
HMFK03LST1 0:4f562ff70d13 90
HMFK03LST1 0:4f562ff70d13 91 sscanf(&read[ 0][1], "%f", &temp); bz_on = temp;
HMFK03LST1 0:4f562ff70d13 92 sscanf(&read[ 1][1], "%f", &temp); bz_off = temp;
HMFK03LST1 0:4f562ff70d13 93 sscanf(&read[ 2][1], "%f", &temp); bz_max = temp;
HMFK03LST1 0:4f562ff70d13 94 sscanf(&read[ 3][1], "%f", &temp); cap_min = temp;
HMFK03LST1 0:4f562ff70d13 95 sscanf(&read[ 4][1], "%f", &temp); cap_max = temp;
HMFK03LST1 0:4f562ff70d13 96 sscanf(&read[ 5][1], "%f", &temp); gate_on = temp;
HMFK03LST1 0:4f562ff70d13 97 sscanf(&read[ 6][1], "%f", &temp); gate_off = temp;
HMFK03LST1 0:4f562ff70d13 98 sscanf(&read[ 7][1], "%f", &temp); purge_start = temp;
HMFK03LST1 0:4f562ff70d13 99 sscanf(&read[ 8][1], "%f", &temp); purge_end = temp;
HMFK03LST1 0:4f562ff70d13 100 sscanf(&read[ 9][1], "%f", &temp); boost_time = temp;
HMFK03LST1 0:4f562ff70d13 101 sscanf(&read[10][1], "%f", &temp); pwm_cycle = temp;
HMFK03LST1 0:4f562ff70d13 102 sscanf(&read[11][1], "%f", &temp); pwm_lo = temp;
HMFK03LST1 0:4f562ff70d13 103 sscanf(&read[12][1], "%f", &temp); debug = temp;
HMFK03LST1 0:4f562ff70d13 104 sscanf(&read[13][1], "%f", &temp); sample = temp;
HMFK03LST1 0:4f562ff70d13 105
HMFK03LST1 0:4f562ff70d13 106
HMFK03LST1 0:4f562ff70d13 107
HMFK03LST1 0:4f562ff70d13 108 boost = (boost_time * 1000) / pwm_cycle;
HMFK03LST1 0:4f562ff70d13 109
HMFK03LST1 0:4f562ff70d13 110 }
HMFK03LST1 0:4f562ff70d13 111
HMFK03LST1 0:4f562ff70d13 112 pc.printf("\n\r");
HMFK03LST1 0:4f562ff70d13 113 pc.printf("Brennstoffzellenregler V0.5 \n\r");
HMFK03LST1 0:4f562ff70d13 114 pc.printf("___________________________ \n\r" );
HMFK03LST1 0:4f562ff70d13 115 pc.printf("BZ max [V] : %4.1f \n\r",bz_max);
HMFK03LST1 0:4f562ff70d13 116 pc.printf("BZ on [V] : %4.1f \n\r",bz_on);
HMFK03LST1 0:4f562ff70d13 117 pc.printf("BZ off [V] : %4.1f \n\r",bz_off);
HMFK03LST1 0:4f562ff70d13 118 pc.printf("CAP min [V] : %4.1f \n\r",cap_min);
HMFK03LST1 0:4f562ff70d13 119 pc.printf("CAP max [V] : %4.1f \n\r",cap_max);
HMFK03LST1 0:4f562ff70d13 120 pc.printf("Gate On [V] : %4.1f \n\r",gate_on);
HMFK03LST1 0:4f562ff70d13 121 pc.printf("Gate Off [V] : %4.1f \n\r",gate_off);
HMFK03LST1 0:4f562ff70d13 122 pc.printf("Purch on [s] : %4.1f \n\r",purge_start);
HMFK03LST1 0:4f562ff70d13 123 pc.printf("Purch off [s] : %4.1f \n\r",purge_end);
HMFK03LST1 0:4f562ff70d13 124 pc.printf("Boost [s] : %4.1f \n\r",boost_time);
HMFK03LST1 0:4f562ff70d13 125 pc.printf("PWM cycle [ms]: %4d \n\r" ,pwm_cycle);
HMFK03LST1 0:4f562ff70d13 126 pc.printf("PWM lo [ms]: %4d \n\r" ,pwm_lo);
HMFK03LST1 0:4f562ff70d13 127 pc.printf("Serial : %4d \n\r" ,debug);
HMFK03LST1 0:4f562ff70d13 128 pc.printf("Sample [Hz]: %4.0f \n\r",sample);
HMFK03LST1 0:4f562ff70d13 129 pc.printf("___________________________ \n\r" );
HMFK03LST1 0:4f562ff70d13 130 pc.printf("\n\r");
HMFK03LST1 0:4f562ff70d13 131 }
HMFK03LST1 0:4f562ff70d13 132
HMFK03LST1 1:19d350e383e6 133 int semihost_powerdown()
HMFK03LST1 1:19d350e383e6 134 {
HMFK03LST1 1:19d350e383e6 135 uint32_t arg;
HMFK03LST1 1:19d350e383e6 136 return __semihost(USR_POWERDOWN, &arg);
HMFK03LST1 1:19d350e383e6 137 }
HMFK03LST1 1:19d350e383e6 138
HMFK03LST1 1:19d350e383e6 139 void SEND()
HMFK03LST1 1:19d350e383e6 140 {
HMFK03LST1 1:19d350e383e6 141 mosfet1 = mosfet1_open;
HMFK03LST1 1:19d350e383e6 142 if (debug == 1) 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\n\r"
HMFK03LST1 1:19d350e383e6 143 ,bz,bz_off,bz_on,bz_max,cap,cap_min,cap_max,float(counter)/(1000/pwm_cycle),purge_start,purge_end);
HMFK03LST1 1:19d350e383e6 144 }
HMFK03LST1 1:19d350e383e6 145
HMFK03LST1 1:19d350e383e6 146
HMFK03LST1 1:19d350e383e6 147 void LED()
HMFK03LST1 1:19d350e383e6 148 {
HMFK03LST1 1:19d350e383e6 149 if (bz < bz_off ) myled = 1; else myled = 0; //LED = Spannung an der BZ IO
HMFK03LST1 1:19d350e383e6 150 if (cap > cap_min) myled1 = 1; else myled1 = 0; //LED = Spannung an den Cap´s IO
HMFK03LST1 1:19d350e383e6 151 if (mosfet1 == mosfet1_close) myled2 = 1; else myled2 = 0; //LED = Gate Zustand Mosfet 1
HMFK03LST1 1:19d350e383e6 152 if (pump == 1) myled3 = 1; else myled3 = 0; //LED = Pumpe an
HMFK03LST1 1:19d350e383e6 153 }
HMFK03LST1 0:4f562ff70d13 154
HMFK03LST1 0:4f562ff70d13 155
HMFK03LST1 1:19d350e383e6 156 void PUMPE()
HMFK03LST1 1:19d350e383e6 157 {
HMFK03LST1 1:19d350e383e6 158 if (((cap <= cap_min) || (pump_on == true))
HMFK03LST1 1:19d350e383e6 159 && (bz < bz_max) && (cap < cap_max)) //Pumpe Einschaltbedingung
HMFK03LST1 1:19d350e383e6 160 {
HMFK03LST1 1:19d350e383e6 161 pump_on = true;
HMFK03LST1 1:19d350e383e6 162 if (t.read_ms() > pwm_lo) pump = 1 ; //Set PWM from low to high
HMFK03LST1 1:19d350e383e6 163
HMFK03LST1 1:19d350e383e6 164 if (t.read_ms() >= pwm_cycle) //End PWM cycle
HMFK03LST1 1:19d350e383e6 165 {
HMFK03LST1 1:19d350e383e6 166 counter++;
HMFK03LST1 1:19d350e383e6 167 t.reset();
HMFK03LST1 1:19d350e383e6 168 if (boost > 0) boost--;
HMFK03LST1 1:19d350e383e6 169
HMFK03LST1 1:19d350e383e6 170 if ((counter < (1000 / pwm_cycle) * purge_start) || (boost <= 0) || (In1 == 0))
HMFK03LST1 1:19d350e383e6 171 {
HMFK03LST1 1:19d350e383e6 172 pump = 0; //PWM Betrieb
HMFK03LST1 1:19d350e383e6 173 purge = 0;
HMFK03LST1 1:19d350e383e6 174 }
HMFK03LST1 1:19d350e383e6 175 else
HMFK03LST1 1:19d350e383e6 176 {
HMFK03LST1 1:19d350e383e6 177 if (pump == 1) purge = 1; //Purge Betrieb
HMFK03LST1 1:19d350e383e6 178 }
HMFK03LST1 1:19d350e383e6 179
HMFK03LST1 1:19d350e383e6 180 if (counter > (1000 / pwm_cycle) * purge_end) //Purge Ende
HMFK03LST1 1:19d350e383e6 181 {
HMFK03LST1 1:19d350e383e6 182 counter = 0;
HMFK03LST1 1:19d350e383e6 183 purge = 0;
HMFK03LST1 1:19d350e383e6 184 pump = 0;
HMFK03LST1 1:19d350e383e6 185 }
HMFK03LST1 1:19d350e383e6 186 }
HMFK03LST1 1:19d350e383e6 187 }
HMFK03LST1 1:19d350e383e6 188 else
HMFK03LST1 1:19d350e383e6 189 {
HMFK03LST1 1:19d350e383e6 190 pump_on = 0; pump = 0; purge = 0; //Pumpe aus
HMFK03LST1 1:19d350e383e6 191 boost = (boost_time * 1000) / pwm_cycle; // Boost für nächsten Start setzen
HMFK03LST1 1:19d350e383e6 192 }
HMFK03LST1 0:4f562ff70d13 193
HMFK03LST1 1:19d350e383e6 194 }
HMFK03LST1 1:19d350e383e6 195
HMFK03LST1 1:19d350e383e6 196 int main()
HMFK03LST1 1:19d350e383e6 197 {
HMFK03LST1 0:4f562ff70d13 198
HMFK03LST1 1:19d350e383e6 199 int gate_pwm = 0;
HMFK03LST1 0:4f562ff70d13 200 pc.baud(115200); //config Serial Port
HMFK03LST1 0:4f562ff70d13 201 load_cfg(); //init config File
HMFK03LST1 0:4f562ff70d13 202 semihost_powerdown(); //Mbed Interface powerdown
HMFK03LST1 1:19d350e383e6 203 PC_OUT_timer.attach(&SEND , (1/sample)); //Serial output Timer
HMFK03LST1 1:19d350e383e6 204 LED_timer.attach (&LED , 0.200 ); //LED Status Timer
HMFK03LST1 1:19d350e383e6 205 PUMPE_timer.attach (&PUMPE , 0.001 ); //Pumpen PWM Timer
HMFK03LST1 0:4f562ff70d13 206 t.start(); //Timer für PWM starten
HMFK03LST1 0:4f562ff70d13 207
HMFK03LST1 0:4f562ff70d13 208 while(1)
HMFK03LST1 0:4f562ff70d13 209 {
HMFK03LST1 1:19d350e383e6 210 //bz = ((bz_in * 92.0) + bz )/3; //BZ RAW in Spannung umrechnen
HMFK03LST1 1:19d350e383e6 211 //cap = ((cap_in * 92.0) + cap)/3; //CAP RAW in Spannung umrechnen
HMFK03LST1 1:19d350e383e6 212
HMFK03LST1 1:19d350e383e6 213 if (((bz-cap) >= gate_on) && (bz > bz_on) && (In2 == 0)) //Überspannung (> gate_on) oder Ladespannung der BZ in die Caps laden ***(cap > 13)
HMFK03LST1 1:19d350e383e6 214 {
HMFK03LST1 1:19d350e383e6 215 // if (gate_pwm%2==0) mosfet1 = mosfet1_close; //Spule einkoppeln (mit PWM anteil für StepDown)
HMFK03LST1 1:19d350e383e6 216 // else mosfet1 = mosfet1_close; //Spule auskoppeln
HMFK03LST1 1:19d350e383e6 217 mosfet1 = !mosfet1;
HMFK03LST1 0:4f562ff70d13 218 }
HMFK03LST1 0:4f562ff70d13 219
HMFK03LST1 1:19d350e383e6 220 if ((bz < bz_off) || ((bz-cap) < gate_off)) //Ladereglung Unterspannung Zelle / Gate-Mosfet
HMFK03LST1 0:4f562ff70d13 221 {
HMFK03LST1 1:19d350e383e6 222 //mosfet1 = mosfet1_open; //Zelle trennen
HMFK03LST1 1:19d350e383e6 223 mosfet1 = !mosfet1;
HMFK03LST1 0:4f562ff70d13 224 }
HMFK03LST1 0:4f562ff70d13 225
HMFK03LST1 1:19d350e383e6 226 if (gate_pwm > 99) gate_pwm = 0; else gate_pwm++;
HMFK03LST1 0:4f562ff70d13 227 }
HMFK03LST1 0:4f562ff70d13 228
HMFK03LST1 0:4f562ff70d13 229 }