Mosfet Driver

Dependencies:   mbed

Revision:
3:af6a6f498276
Parent:
2:bdd944abaf86
Child:
4:8c89e422bed7
--- a/main.cpp	Mon May 06 18:47:34 2013 +0000
+++ b/main.cpp	Tue May 07 01:30:58 2013 +0000
@@ -37,17 +37,20 @@
 
 // Brennstoffzellen Parameter
 float bz_max      =  30.5;    //Brennstoffzelle Spannung Abs. max.
-float bz_p_oben   =  10.0;    //Brennstoffzelle Prozent Load bei bz_max
+float bz_p_oben   =  15.0;    //Brennstoffzelle Prozent Load bei bz_max
 float bz_on       =  29.0;    //Brennstoffzelle Spannung für Ladefreigabe)
 float bz_min      =  26.0;    //Brennstoffzelle Spannung min. Laden beenden
 float bz_p_unten  = -20.0;    //Brennstoffzelle Prozent Load bei bz_min
 float bz_current  =   1.5;    //Brennstoffzellen Strom nominal
-float bz_cur_max  =   2.0;    //Brennstoffzellen Strom max
+float bz_cur_add  =   2.0;    //Brennstoffzellen Strom max
+float bz_c_i_max  =  20.0;    //Strom Integrale Reglung Max %
+float bz_c_i_min  = -10.0;    //Strom Integrale Reglung Min %
 
 // SuperCap Parameter
 float cap_max     =  25.0;    //CAP Spannung max. (Abschaltung)
+float cap_p_max   =  90.0;    //CAP Prozent Load bei 0V
 float cap_min     =  20.0;    //CAP Spannung min. (Zelle an)
-float cap_p_min   =   2.0;    //CAP Prozent Load bei 0V
+float cap_p_min   =   5.0;    //CAP Prozent Load bei 0V
 float cap_delta   =   1.5;    //Absenkung der Spannung mit Din
 
 // Pump & Purge Parameter
@@ -65,7 +68,7 @@
 bool  Load        = false;    //Laderegler aktiv
 bool  pump_on     = false;    //Pumpenzustand
 int   boost       =     0;    //Number of PWM-Cycles for Pump runup boost calc in load_cfg
-int   Zelle_Level =     0;    //% Load aus Bz Spannung
+int   Cel_Level   =     0;    //% Load aus Bz Spannung
 int   Cap_Level   =     0;    //% Load aus Cap Spannung
 int   Cur_Level   =     0;
 int   Load_Level  =     0;    //% Load aus Bz und Cap
@@ -78,14 +81,14 @@
   
 void load_cfg()
 {
- char read[17][8];
+ char read[24][5];
 
  char  i = 0;
  char  j = 0;
  int   c = 0;
  float  temp;
  
- for (j = 0; j<17; j++)
+ for (j = 0; j<24; j++)
   {
    for (i = 0; i<8; i++)
     {
@@ -113,49 +116,60 @@
        sscanf(&read[ 2][1], "%f", &temp); bz_on       = temp;
        sscanf(&read[ 3][1], "%f", &temp); bz_min      = temp;
        sscanf(&read[ 4][1], "%f", &temp); bz_p_unten  = temp;
-       sscanf(&read[ 5][1], "%f", &temp); cap_max     = temp;
-       sscanf(&read[ 6][1], "%f", &temp); cap_min     = temp;
-       sscanf(&read[ 7][1], "%f", &temp); cap_p_min   = temp; 
-       sscanf(&read[ 8][1], "%f", &temp); cap_delta   = temp;
-       sscanf(&read[ 9][1], "%f", &temp); purge_start = temp;
-       sscanf(&read[10][1], "%f", &temp); purge_end   = temp;
-       sscanf(&read[11][1], "%f", &temp); boost_time  = temp;
-       sscanf(&read[12][1], "%f", &temp); pwm_cycle   = temp;
-       sscanf(&read[13][1], "%f", &temp); pwm_on      = temp;
-       sscanf(&read[14][1], "%f", &temp); debug       = temp;
-       sscanf(&read[15][1], "%f", &temp); sample      = temp;   
+       sscanf(&read[ 5][1], "%f", &temp); bz_current  = temp;
+       sscanf(&read[ 6][1], "%f", &temp); bz_cur_add  = temp;
+       sscanf(&read[ 7][1], "%f", &temp); bz_c_i_max  = temp;
+       sscanf(&read[ 8][1], "%f", &temp); bz_c_i_min  = temp;      
+      
+       sscanf(&read[ 9][1], "%f", &temp); cap_max     = temp; 
+       sscanf(&read[10][1], "%f", &temp); cap_p_max   = temp;
+       sscanf(&read[11][1], "%f", &temp); cap_min     = temp;
+       sscanf(&read[12][1], "%f", &temp); cap_p_min   = temp; 
+       sscanf(&read[13][1], "%f", &temp); cap_delta   = temp;
+       
+       sscanf(&read[14][1], "%f", &temp); purge_start = temp;
+       sscanf(&read[15][1], "%f", &temp); purge_end   = temp;
+       sscanf(&read[16][1], "%f", &temp); boost_time  = temp;
+       sscanf(&read[17][1], "%f", &temp); pwm_cycle   = temp;
+       sscanf(&read[18][1], "%f", &temp); pwm_on      = temp;
+       
+       sscanf(&read[19][1], "%f", &temp); debug       = temp;
+       sscanf(&read[20][1], "%f", &temp); sample      = temp;   
        
        boost = (boost_time * 1000) / pwm_cycle;     
      }
     
     pc.printf("\n\r"                                           );
-    pc.printf("******************************* \n\r"           );
+    pc.printf("******************************** \n\r"           );
     pc.printf("* Brennstoffzellenregler V%03.1f * \n\r",version);
-    pc.printf("******************************* \n\r"           );
-    pc.printf("--------------BZ--------------- \n\r"           );
-    pc.printf(" BZ max        [V] : %4.1f \n\r",bz_max         );
-    pc.printf(" BZ max        [%] : %4.1f \n\r",bz_p_oben      );
-    pc.printf(" BZ Laden on   [V] : %4.1f \n\r",bz_on          );
-    pc.printf(" BZ Laden off  [V] : %4.1f \n\r",bz_min         );
-    pc.printf(" BZ Laden off  [%] : %4.1f \n\r",bz_p_unten     );
-    pc.printf(" BZ Strom norm [A] : %4.1f \n\r",bz_current     );
-    pc.printf(" BZ Strom max. [A] : %4.1f \n\r",bz_cur_max     );
-    pc.printf("-------------CAP--------------- \n\r"           );
-    pc.printf(" CAP max       [V] : %4.1f \n\r",cap_max        );
-    pc.printf(" CAP min       [V] : %4.1f \n\r",cap_min        );
-    pc.printf(" CAP min       [%] : %4.1f \n\r",cap_p_min      );
-    pc.printf(" CAP lo on Din[-V] : %4.1f \n\r",cap_delta      );
-    pc.printf("----------Pump & Purge--------- \n\r"           );
-    pc.printf(" Purge on      [s] : %4.1f \n\r",purge_start    );
-    pc.printf(" Purge 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 on        [ms]: %4d \n\r"  ,pwm_on         );
-    pc.printf("------------Monitor------------ \n\r"           );
-    pc.printf(" Serial output     : %4d \n\r"  ,debug          );
-    pc.printf(" Samplerate    [Hz]: %4.0f \n\r",sample         );
-    pc.printf("******************************* \n\r"           );
-    pc.printf("\n\r"                                           );
+    pc.printf("******************************** \n\r"           );
+    pc.printf("--------------BZ---------------- \n\r"           );
+    pc.printf(" BZ max         [V] : %4.1f \n\r",bz_max         );
+    pc.printf(" BZ max         [%c] : %4.1f \n\r",37,bz_p_oben  );
+    pc.printf(" BZ Laden on    [V] : %4.1f \n\r",bz_on          );
+    pc.printf(" BZ Laden off   [V] : %4.1f \n\r",bz_min         );
+    pc.printf(" BZ Laden off   [%c] : %4.1f \n\r",37,bz_p_unten );
+    pc.printf(" BZ Strom norm  [A] : %4.1f \n\r",bz_current     );
+    pc.printf(" BZ Strom max.  [A] : %4.1f \n\r",bz_cur_add     );
+    pc.printf(" BZ Strom I max.[%c] : %4.1f \n\r",37,bz_c_i_max );
+    pc.printf(" BZ Strom I min.[%c] : %4.1f \n\r",37,bz_c_i_min ); 
+    pc.printf("-------------CAP---------------- \n\r"           );
+    pc.printf(" CAP max        [V] : %4.1f \n\r",cap_max        );
+    pc.printf(" CAP max        [%c] : %4.1f \n\r",37,cap_p_max  );
+    pc.printf(" CAP min        [V] : %4.1f \n\r",cap_min        );
+    pc.printf(" CAP min        [%c] : %4.1f \n\r",37,cap_p_min  );
+    pc.printf(" CAP lo on Din  [-V]: %4.1f \n\r",cap_delta      );
+    pc.printf("----------Pump & Purge---------- \n\r"           );
+    pc.printf(" Purge on       [s] : %4.1f \n\r",purge_start    );
+    pc.printf(" Purge 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 on         [ms]: %4d \n\r"  ,pwm_on         );
+    pc.printf("------------Monitor------------- \n\r"           );
+    pc.printf(" Serial output  [bool]: %4d \n\r"  ,debug        );
+    pc.printf(" Samplerate     [Hz]  : %4.0f \n\r",sample       );
+    pc.printf("******************************** \n\r"           );
+    pc.printf("\n\r"                                            );
 }
 
 
@@ -168,11 +182,14 @@
 
 void SEND()
 {
- if (debug == 1) 
+ bool status= false;
+ if (debug == 1)
  {
+  if (mosfet1 == (mosfet1_close)) status = true;
   mosfet1 = mosfet1_open;
   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  Load: %03d Current: %4.2f \n\r"
           ,bz,bz_min,bz_on,bz_max,cap,cap_min,cap_max,float(counter_cycle)/(1000/pwm_cycle),purge_start,purge_end,Load_Level, current);
+  if (status == true) mosfet1 = mosfet1_close; 
  }
 }
 
@@ -182,14 +199,21 @@
   if (bz  < bz_min )            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
+  if (pump_on == 1)             myled3 = 1; else myled3 = 0;                //LED = Pumpe an
 }
 
 
 void PUMPE()
 {
  counter_ms++;
- if (((cap <= cap_min) || (pump_on == true)) && (bz < bz_max) && (cap < (cap_max - (In1 * cap_delta)))) //Pumpe Einschaltbedingung
+ 
+ if ((bz > bz_max) && (cap > (cap_max - (In1 * cap_delta))))
+ {
+  pump_on = false;
+ }
+ 
+ 
+ if ((cap <= cap_min) || (pump_on == true)) //Pumpe Einschaltbedingung
   {  
    pump_on = true;
    if (counter_ms > (pwm_cycle - pwm_on))  pump = 1 ;                               //Set PWM from low to high 
@@ -245,21 +269,35 @@
     {
      bz  = ((bz_in  * 92.0) + bz )/3;                                    //BZ  RAW in Spannung umrechnen (2*neu zu 1*alt Glättung)
      cap = ((cap_in * 92.0) + cap)/3;                                    //CAP RAW in Spannung umrechnen (2*neu zu 1*alt Glättung)
-     current = (cur_in * 23.82) - 4.00; 
-
+     current = (cur_in * 23.75) - 4.12; 
+     t.reset();                                                          // Timer für 1 kHz starten 
      PUMPE();                                                            //Pumpen PWM aufrufen         
-     
-     Zelle_Level = (bz_faktor * (bz - bz_min) + bz_p_unten) * 10;        //%Load aus Zellenspannung berechnen
-     Cap_Level   = ((cap / cap_max) + cap_p_min) * 10;                   //%Load aus Cap Level
-     Cur_Level   = (current/bz_current)*100; 
-     Load_Level  = Zelle_Level + Cap_Level - Cur_Level;                              //%Load Summe Cap + Bz
+
+//***Regulate Cell Level***     
+     Cel_Level = (bz_faktor * (bz - bz_min) + bz_p_unten) * 10;                  //%Load aus Zellenspannung berechnen
+
+//***Regulate Cap´s Level*** 
+     Cap_Level   = (((cap / cap_max) *(cap_p_max - cap_p_min)) + cap_p_min) * 10;  //%Load aus Cap Level
+
+//***Regulate Current Level***     
+     if ((current-(bz_current + (In2 * bz_cur_add))) > 0)
+      {if (Cur_Level > (bz_c_i_min*10)) Cur_Level--;}                     //to much Load
+     else
+      {if (Cur_Level < (bz_c_i_max*10)) Cur_Level++;}                     //less Load  
+           
+//*** Sum all Regulators     
+ 
+     //Load_Level  = Cur_Level;   
+     Load_Level  =  Cap_Level;
+     //Load_Level  = Load_Level + Cel_Level;
+
 
      if (Load == true)                                                   // Laden aktiv
       {
-                                                            // Timer für 1 kHz starten 
-       if (bz > bz_min)                                                  // Zelle über min. Spannung
+                                                                       
+       if (bz > bz_min || bz > bz_max)                                   // Zelle über min. Spannung oder über max Spannung zum Entladen
         { 
-         while (t.read_us() <= 1000)                                     // während der PWM (1khz Periode)
+         while (t.read_us() <= 920)                                      // während der PWM (1khz Periode)
           {
            if (t.read_us() < Load_Level)                                 // %Load PWM zu Timer vergleich
             {mosfet1 = mosfet1_close;}                                   // %Load PWM nicht erreicht Mosfet an
@@ -277,13 +315,13 @@
       {
        if (bz >= cap){mosfet1 = mosfet1_open ;}                         // Mosfet im nicht Ladebetrieb auskoppeln 
        else          {mosfet1 = mosfet1_close;}                         // Mosfet im nicht Ladebetrieb einkoppeln (Treiber stromfrei = Stromsparen) 
-       while (t.read_us() <= 1000){};
+       while (t.read_us() <= 920){};
       }  
        
      
-     if (((cap < cap_min) && (bz > bz_on))||(bz > bz_max)) Load = true ;// Cap unter Minimum oder BZ über Maximum = Laden beginnen
-     if (  cap >= cap_max                                ) Load = false;//  
-     t.reset(); 
+     if (( cap < cap_min) && (bz > bz_on)) Load = true;   // Cap unter Minimum oder BZ über Maximum = Laden beginnen
+     if (  cap >= cap_max                ) Load = false;  //  
+     if (  bz  > bz_max                  ) Load = true;   // Überladung abführen
     }
 
 }