Hochschule München
/
PowerDriverforH2m
Mosfet Driver
Diff: main.cpp
- Revision:
- 1:19d350e383e6
- Parent:
- 0:4f562ff70d13
- Child:
- 2:bdd944abaf86
--- a/main.cpp Thu May 02 19:47:11 2013 +0000 +++ b/main.cpp Sun May 05 17:59:15 2013 +0000 @@ -5,10 +5,13 @@ #define USR_POWERDOWN (0x104) //Power Down Mbed Interface (save 50% or 45 mA) +bool mosfet1_open = true ; +bool mosfet1_close = false; + DigitalOut myled (LED1); DigitalOut myled1 (LED2); DigitalOut myled2 (LED3); -DigitalOut pumpe (LED4); +DigitalOut myled3 (LED4); DigitalOut purge (p33); DigitalOut pump (p34); @@ -25,35 +28,32 @@ Serial pc(USBTX, USBRX); -Ticker pc_out; +Ticker PC_OUT_timer; +Ticker LED_timer; +Ticker PUMPE_timer; + 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_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 +bool pump_on = false; //Pumpenzustand 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); -} +unsigned int counter; void load_cfg() @@ -130,74 +130,100 @@ pc.printf("\n\r"); } -int semihost_powerdown() { - uint32_t arg; - return __semihost(USR_POWERDOWN, &arg); - } +int semihost_powerdown() +{ + uint32_t arg; + return __semihost(USR_POWERDOWN, &arg); +} + +void SEND() +{ + mosfet1 = mosfet1_open; + 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 LED() +{ + 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 (mosfet1 == mosfet1_close) myled2 = 1; else myled2 = 0; //LED = Gate Zustand Mosfet 1 + if (pump == 1) myled3 = 1; else myled3 = 0; //LED = Pumpe an +} +void PUMPE() +{ + if (((cap <= cap_min) || (pump_on == true)) + && (bz < bz_max) && (cap < cap_max)) //Pumpe Einschaltbedingung + { + pump_on = true; + if (t.read_ms() > pwm_lo) pump = 1 ; //Set PWM from low to high + + if (t.read_ms() >= pwm_cycle) //End PWM cycle + { + counter++; + t.reset(); + if (boost > 0) boost--; + + if ((counter < (1000 / pwm_cycle) * purge_start) || (boost <= 0) || (In1 == 0)) + { + pump = 0; //PWM Betrieb + purge = 0; + } + else + { + if (pump == 1) purge = 1; //Purge Betrieb + } + + if (counter > (1000 / pwm_cycle) * purge_end) //Purge Ende + { + counter = 0; + purge = 0; + pump = 0; + } + } + } + else + { + pump_on = 0; pump = 0; purge = 0; //Pumpe aus + boost = (boost_time * 1000) / pwm_cycle; // Boost für nächsten Start setzen + } -int main() { +} + +int main() +{ + int gate_pwm = 0; 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 + PC_OUT_timer.attach(&SEND , (1/sample)); //Serial output Timer + LED_timer.attach (&LED , 0.200 ); //LED Status Timer + PUMPE_timer.attach (&PUMPE , 0.001 ); //Pumpen PWM 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 *** + //bz = ((bz_in * 92.0) + bz )/3; //BZ RAW in Spannung umrechnen + //cap = ((cap_in * 92.0) + cap)/3; //CAP RAW in Spannung umrechnen + + if (((bz-cap) >= gate_on) && (bz > bz_on) && (In2 == 0)) //Überspannung (> gate_on) oder Ladespannung der BZ in die Caps laden ***(cap > 13) + { + // if (gate_pwm%2==0) mosfet1 = mosfet1_close; //Spule einkoppeln (mit PWM anteil für StepDown) + // else mosfet1 = mosfet1_close; //Spule auskoppeln + mosfet1 = !mosfet1; } - if ((bz < bz_off) || ((bz-cap) < gate_off)) //Ladereglung Unterspannung Zelle / Gate-Mosfet + if ((bz < bz_off) || ((bz-cap) < gate_off)) //Ladereglung Unterspannung Zelle / Gate-Mosfet { - mosfet1 = 1; myled2 = 0; //Zelle trennen / Mosfet LED aus + //mosfet1 = mosfet1_open; //Zelle trennen + mosfet1 = !mosfet1; } - wait_us(5); + if (gate_pwm > 99) gate_pwm = 0; else gate_pwm++; } }