Mosfet Driver

Dependencies:   mbed

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