Mosfet Driver

Dependencies:   mbed

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++; 
     }
 
 }