Mosfet Driver

Dependencies:   mbed

Committer:
HMFK03LST1
Date:
Thu May 02 19:47:11 2013 +0000
Revision:
0:4f562ff70d13
Child:
1:19d350e383e6
H2M Power Driver

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 0:4f562ff70d13 8 DigitalOut myled (LED1);
HMFK03LST1 0:4f562ff70d13 9 DigitalOut myled1 (LED2);
HMFK03LST1 0:4f562ff70d13 10 DigitalOut myled2 (LED3);
HMFK03LST1 0:4f562ff70d13 11 DigitalOut pumpe (LED4);
HMFK03LST1 0:4f562ff70d13 12
HMFK03LST1 0:4f562ff70d13 13 DigitalOut purge (p33);
HMFK03LST1 0:4f562ff70d13 14 DigitalOut pump (p34);
HMFK03LST1 0:4f562ff70d13 15 DigitalOut mosfet1(p35);
HMFK03LST1 0:4f562ff70d13 16 DigitalOut mosfet2(p36);
HMFK03LST1 0:4f562ff70d13 17 DigitalIn In1 (p30);
HMFK03LST1 0:4f562ff70d13 18 DigitalIn In2 (p29);
HMFK03LST1 0:4f562ff70d13 19 DigitalIn In3 (p28);
HMFK03LST1 0:4f562ff70d13 20 DigitalIn In4 (p27);
HMFK03LST1 0:4f562ff70d13 21 AnalogIn AI1 (p17);
HMFK03LST1 0:4f562ff70d13 22 AnalogIn AI2 (p18);
HMFK03LST1 0:4f562ff70d13 23 AnalogIn bz_in (p19);
HMFK03LST1 0:4f562ff70d13 24 AnalogIn cap_in (p20);
HMFK03LST1 0:4f562ff70d13 25
HMFK03LST1 0:4f562ff70d13 26
HMFK03LST1 0:4f562ff70d13 27 Serial pc(USBTX, USBRX);
HMFK03LST1 0:4f562ff70d13 28 Ticker pc_out;
HMFK03LST1 0:4f562ff70d13 29 Timer t;
HMFK03LST1 0:4f562ff70d13 30
HMFK03LST1 0:4f562ff70d13 31 float bz_off = 16.0; //Brennstoffzellen Spannung min. Laden beenden
HMFK03LST1 0:4f562ff70d13 32 float bz_on = 17.0; //Brennstoffzellen Spannung für Ladefreigabe)
HMFK03LST1 0:4f562ff70d13 33 float bz_max = 18.0; //Brennstoffzellen Spannung Abs. max.
HMFK03LST1 0:4f562ff70d13 34 float cap_max = 13.0; //CAP Spannung max. (Abschaltung)
HMFK03LST1 0:4f562ff70d13 35 float cap_min = 9.0; //CAP Spannung min. (Zelle an)
HMFK03LST1 0:4f562ff70d13 36 int pwm_cycle = 60; //ms für PWM Period
HMFK03LST1 0:4f562ff70d13 37 int pwm_lo = 40; //ms für PWM high
HMFK03LST1 0:4f562ff70d13 38 float purge_start= 60.0; //s before starting purch
HMFK03LST1 0:4f562ff70d13 39 float purge_end = 60.2; //s after finishing purch
HMFK03LST1 0:4f562ff70d13 40 float boost_time = 0.2; //s Pump runup with 100% Duty Cycle
HMFK03LST1 0:4f562ff70d13 41 int boost = 25; //Number of PWM-Cycles for Pump runup boost
HMFK03LST1 0:4f562ff70d13 42 int debug = 1; //Serial Output on (1)
HMFK03LST1 0:4f562ff70d13 43 float gate_on = 3.5; //Mosfet opt. Gate Drain [V]
HMFK03LST1 0:4f562ff70d13 44 float gate_off = 2.8; //Mosfet min. Gate Drain [V]
HMFK03LST1 0:4f562ff70d13 45 float sample = 5; //Serial Output Samples per Second
HMFK03LST1 0:4f562ff70d13 46
HMFK03LST1 0:4f562ff70d13 47
HMFK03LST1 0:4f562ff70d13 48 float bz;
HMFK03LST1 0:4f562ff70d13 49 float cap;
HMFK03LST1 0:4f562ff70d13 50 int counter;
HMFK03LST1 0:4f562ff70d13 51
HMFK03LST1 0:4f562ff70d13 52
HMFK03LST1 0:4f562ff70d13 53 void send()
HMFK03LST1 0:4f562ff70d13 54 {
HMFK03LST1 0:4f562ff70d13 55 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",bz,bz_off,bz_on,bz_max,cap,cap_min,cap_max,float(counter)/(1000/pwm_cycle),purge_start,purge_end);
HMFK03LST1 0:4f562ff70d13 56 }
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 0:4f562ff70d13 133 int semihost_powerdown() {
HMFK03LST1 0:4f562ff70d13 134 uint32_t arg;
HMFK03LST1 0:4f562ff70d13 135 return __semihost(USR_POWERDOWN, &arg);
HMFK03LST1 0:4f562ff70d13 136 }
HMFK03LST1 0:4f562ff70d13 137
HMFK03LST1 0:4f562ff70d13 138
HMFK03LST1 0:4f562ff70d13 139
HMFK03LST1 0:4f562ff70d13 140 int main() {
HMFK03LST1 0:4f562ff70d13 141
HMFK03LST1 0:4f562ff70d13 142 pc.baud(115200); //config Serial Port
HMFK03LST1 0:4f562ff70d13 143 load_cfg(); //init config File
HMFK03LST1 0:4f562ff70d13 144 semihost_powerdown(); //Mbed Interface powerdown
HMFK03LST1 0:4f562ff70d13 145 pc_out.attach(&send, (1/sample)); //Serial output mit Timer
HMFK03LST1 0:4f562ff70d13 146 t.start(); //Timer für PWM starten
HMFK03LST1 0:4f562ff70d13 147
HMFK03LST1 0:4f562ff70d13 148 while(1)
HMFK03LST1 0:4f562ff70d13 149 {
HMFK03LST1 0:4f562ff70d13 150 bz = bz_in * 46.0; //BZ RAW in Spannung umrechnen
HMFK03LST1 0:4f562ff70d13 151 cap = cap_in * 46.0; //CAP RAW in Spannung umrechnen
HMFK03LST1 0:4f562ff70d13 152
HMFK03LST1 0:4f562ff70d13 153 if (bz < bz_off ) {myled = 1;} else {myled = 0;}; //LED = Spannung an der BZ IO
HMFK03LST1 0:4f562ff70d13 154 if (cap > cap_min) {myled1 = 1;} else {myled1 = 0;}; //LED = Spannung an den Cap´s IO
HMFK03LST1 0:4f562ff70d13 155
HMFK03LST1 0:4f562ff70d13 156 if ((cap <= cap_min) || (pumpe == 1) ) //Pumpe Einschaltbedingung
HMFK03LST1 0:4f562ff70d13 157 {
HMFK03LST1 0:4f562ff70d13 158 if ((cap < cap_max) && (bz < bz_max))
HMFK03LST1 0:4f562ff70d13 159 {
HMFK03LST1 0:4f562ff70d13 160 pumpe = 1; //LED Pumpe
HMFK03LST1 0:4f562ff70d13 161 if (t.read_ms() > pwm_lo) pump = 1 ; //Set PWM from low to high
HMFK03LST1 0:4f562ff70d13 162 }
HMFK03LST1 0:4f562ff70d13 163 else pumpe = 0; //Pumpe Ausschaltbedingung
HMFK03LST1 0:4f562ff70d13 164
HMFK03LST1 0:4f562ff70d13 165 if (t.read_ms() > pwm_cycle) //End PWM cycle
HMFK03LST1 0:4f562ff70d13 166 {
HMFK03LST1 0:4f562ff70d13 167 t.reset();
HMFK03LST1 0:4f562ff70d13 168 if ((counter > (1000 / pwm_cycle) * purge_start) || (boost > 0) || (In1 > 1)) //PWM oder Purch Betrieb
HMFK03LST1 0:4f562ff70d13 169 {
HMFK03LST1 0:4f562ff70d13 170 if (pump == 1) purge = 1;
HMFK03LST1 0:4f562ff70d13 171 }
HMFK03LST1 0:4f562ff70d13 172 else
HMFK03LST1 0:4f562ff70d13 173 {
HMFK03LST1 0:4f562ff70d13 174 pump = 0;
HMFK03LST1 0:4f562ff70d13 175 purge = 0;
HMFK03LST1 0:4f562ff70d13 176 }
HMFK03LST1 0:4f562ff70d13 177
HMFK03LST1 0:4f562ff70d13 178 boost--;
HMFK03LST1 0:4f562ff70d13 179 counter++;
HMFK03LST1 0:4f562ff70d13 180 }
HMFK03LST1 0:4f562ff70d13 181
HMFK03LST1 0:4f562ff70d13 182 if (counter > (1000 / pwm_cycle) * purge_end) {counter = 0; purge = 0; pump = 0;} //Purch Ende
HMFK03LST1 0:4f562ff70d13 183 }
HMFK03LST1 0:4f562ff70d13 184 else
HMFK03LST1 0:4f562ff70d13 185 {
HMFK03LST1 0:4f562ff70d13 186 pumpe = 0; pump = 0; purge = 0; boost = (boost_time * 1000) / pwm_cycle; //LED & Pumpe aus Boost für nächsten Start setzen
HMFK03LST1 0:4f562ff70d13 187 }
HMFK03LST1 0:4f562ff70d13 188
HMFK03LST1 0:4f562ff70d13 189
HMFK03LST1 0:4f562ff70d13 190 if (((bz-cap) >= gate_on) && (bz > bz_on) && (In2 == 0)) //Überspannung (> gate_on) oder Ladespannung der BZ in die Caps laden
HMFK03LST1 0:4f562ff70d13 191 {
HMFK03LST1 0:4f562ff70d13 192 mosfet1 = 0; myled2 = 1; //Zelle einkoppeln / Mosfet LED an ***
HMFK03LST1 0:4f562ff70d13 193 }
HMFK03LST1 0:4f562ff70d13 194
HMFK03LST1 0:4f562ff70d13 195 if ((bz < bz_off) || ((bz-cap) < gate_off)) //Ladereglung Unterspannung Zelle / Gate-Mosfet
HMFK03LST1 0:4f562ff70d13 196 {
HMFK03LST1 0:4f562ff70d13 197 mosfet1 = 1; myled2 = 0; //Zelle trennen / Mosfet LED aus
HMFK03LST1 0:4f562ff70d13 198 }
HMFK03LST1 0:4f562ff70d13 199
HMFK03LST1 0:4f562ff70d13 200 wait_us(5);
HMFK03LST1 0:4f562ff70d13 201 }
HMFK03LST1 0:4f562ff70d13 202
HMFK03LST1 0:4f562ff70d13 203 }