Hochschule München
/
PowerDriverforH2m
Mosfet Driver
Diff: main.cpp
- Revision:
- 0:4f562ff70d13
- Child:
- 1:19d350e383e6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu May 02 19:47:11 2013 +0000 @@ -0,0 +1,203 @@ +#include "mbed.h" + +LocalFileSystem local("local"); //Flashdrive for config file +FILE *fp; //Local Config File + +#define USR_POWERDOWN (0x104) //Power Down Mbed Interface (save 50% or 45 mA) + +DigitalOut myled (LED1); +DigitalOut myled1 (LED2); +DigitalOut myled2 (LED3); +DigitalOut pumpe (LED4); + +DigitalOut purge (p33); +DigitalOut pump (p34); +DigitalOut mosfet1(p35); +DigitalOut mosfet2(p36); +DigitalIn In1 (p30); +DigitalIn In2 (p29); +DigitalIn In3 (p28); +DigitalIn In4 (p27); +AnalogIn AI1 (p17); +AnalogIn AI2 (p18); +AnalogIn bz_in (p19); +AnalogIn cap_in (p20); + + +Serial pc(USBTX, USBRX); +Ticker pc_out; +Timer t; + +float bz_off = 16.0; //Brennstoffzellen Spannung min. Laden beenden +float bz_on = 17.0; //Brennstoffzellen Spannung für Ladefreigabe) +float bz_max = 18.0; //Brennstoffzellen Spannung Abs. max. +float cap_max = 13.0; //CAP Spannung max. (Abschaltung) +float cap_min = 9.0; //CAP Spannung min. (Zelle an) +int pwm_cycle = 60; //ms für PWM Period +int pwm_lo = 40; //ms für PWM high +float purge_start= 60.0; //s before starting purch +float purge_end = 60.2; //s after finishing purch +float boost_time = 0.2; //s Pump runup with 100% Duty Cycle +int boost = 25; //Number of PWM-Cycles for Pump runup boost +int debug = 1; //Serial Output on (1) +float gate_on = 3.5; //Mosfet opt. Gate Drain [V] +float gate_off = 2.8; //Mosfet min. Gate Drain [V] +float sample = 5; //Serial Output Samples per Second + + +float bz; +float cap; +int counter; + + +void send() +{ +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); +} + + +void load_cfg() +{ + char read[16][16]; + + char i = 0; + char j = 0; + int c = 0; + float temp; + + for (j = 0; j<16; j++) + { + for (i = 0; i<16; i++) + { + read[j][i] = '\0'; + } + } + + i=0; + j=0; + + fp = fopen("/local/power.cfg", "r"); + if ( fp != NULL ) + { + while((c != EOF) && (c !=10)) + { + c = fgetc(fp); + if (c == ';'){read[j][0] = i; i = 0; j++;} + else {i++; read[j][i] = c;} + } + fclose(fp); + + + sscanf(&read[ 0][1], "%f", &temp); bz_on = temp; + sscanf(&read[ 1][1], "%f", &temp); bz_off = temp; + sscanf(&read[ 2][1], "%f", &temp); bz_max = temp; + sscanf(&read[ 3][1], "%f", &temp); cap_min = temp; + sscanf(&read[ 4][1], "%f", &temp); cap_max = temp; + sscanf(&read[ 5][1], "%f", &temp); gate_on = temp; + sscanf(&read[ 6][1], "%f", &temp); gate_off = temp; + sscanf(&read[ 7][1], "%f", &temp); purge_start = temp; + sscanf(&read[ 8][1], "%f", &temp); purge_end = temp; + sscanf(&read[ 9][1], "%f", &temp); boost_time = temp; + sscanf(&read[10][1], "%f", &temp); pwm_cycle = temp; + sscanf(&read[11][1], "%f", &temp); pwm_lo = temp; + sscanf(&read[12][1], "%f", &temp); debug = temp; + sscanf(&read[13][1], "%f", &temp); sample = temp; + + + + boost = (boost_time * 1000) / pwm_cycle; + + } + + pc.printf("\n\r"); + pc.printf("Brennstoffzellenregler V0.5 \n\r"); + pc.printf("___________________________ \n\r" ); + pc.printf("BZ max [V] : %4.1f \n\r",bz_max); + pc.printf("BZ on [V] : %4.1f \n\r",bz_on); + pc.printf("BZ off [V] : %4.1f \n\r",bz_off); + pc.printf("CAP min [V] : %4.1f \n\r",cap_min); + pc.printf("CAP max [V] : %4.1f \n\r",cap_max); + pc.printf("Gate On [V] : %4.1f \n\r",gate_on); + pc.printf("Gate Off [V] : %4.1f \n\r",gate_off); + pc.printf("Purch on [s] : %4.1f \n\r",purge_start); + pc.printf("Purch off [s] : %4.1f \n\r",purge_end); + pc.printf("Boost [s] : %4.1f \n\r",boost_time); + pc.printf("PWM cycle [ms]: %4d \n\r" ,pwm_cycle); + pc.printf("PWM lo [ms]: %4d \n\r" ,pwm_lo); + pc.printf("Serial : %4d \n\r" ,debug); + pc.printf("Sample [Hz]: %4.0f \n\r",sample); + pc.printf("___________________________ \n\r" ); + pc.printf("\n\r"); +} + +int semihost_powerdown() { + uint32_t arg; + return __semihost(USR_POWERDOWN, &arg); + } + + + +int main() { + + pc.baud(115200); //config Serial Port + load_cfg(); //init config File + semihost_powerdown(); //Mbed Interface powerdown + pc_out.attach(&send, (1/sample)); //Serial output mit Timer + t.start(); //Timer für PWM starten + + while(1) + { + bz = bz_in * 46.0; //BZ RAW in Spannung umrechnen + cap = cap_in * 46.0; //CAP RAW in Spannung umrechnen + + if (bz < bz_off ) {myled = 1;} else {myled = 0;}; //LED = Spannung an der BZ IO + if (cap > cap_min) {myled1 = 1;} else {myled1 = 0;}; //LED = Spannung an den Cap´s IO + + if ((cap <= cap_min) || (pumpe == 1) ) //Pumpe Einschaltbedingung + { + if ((cap < cap_max) && (bz < bz_max)) + { + pumpe = 1; //LED Pumpe + if (t.read_ms() > pwm_lo) pump = 1 ; //Set PWM from low to high + } + else pumpe = 0; //Pumpe Ausschaltbedingung + + if (t.read_ms() > pwm_cycle) //End PWM cycle + { + t.reset(); + if ((counter > (1000 / pwm_cycle) * purge_start) || (boost > 0) || (In1 > 1)) //PWM oder Purch Betrieb + { + if (pump == 1) purge = 1; + } + else + { + pump = 0; + purge = 0; + } + + boost--; + counter++; + } + + if (counter > (1000 / pwm_cycle) * purge_end) {counter = 0; purge = 0; pump = 0;} //Purch Ende + } + else + { + pumpe = 0; pump = 0; purge = 0; boost = (boost_time * 1000) / pwm_cycle; //LED & Pumpe aus Boost für nächsten Start setzen + } + + + if (((bz-cap) >= gate_on) && (bz > bz_on) && (In2 == 0)) //Überspannung (> gate_on) oder Ladespannung der BZ in die Caps laden + { + mosfet1 = 0; myled2 = 1; //Zelle einkoppeln / Mosfet LED an *** + } + + if ((bz < bz_off) || ((bz-cap) < gate_off)) //Ladereglung Unterspannung Zelle / Gate-Mosfet + { + mosfet1 = 1; myled2 = 0; //Zelle trennen / Mosfet LED aus + } + + wait_us(5); + } + +}