i2c slave integrated

Dependencies:   mbed-rtos mbed

Fork of BAE_FRDM_INTEGRATION by green rosh

Revision:
8:667fbc82d634
Parent:
0:8b0d43fe6c05
--- a/HK.cpp	Wed Dec 10 06:34:17 2014 +0000
+++ b/HK.cpp	Mon Dec 15 05:58:23 2014 +0000
@@ -1,79 +1,139 @@
 #include "HK.h"
- 
-DigitalOut SelectLine3 (D4); // MSB of Select Lines
-DigitalOut SelectLine2 (D3);
-DigitalOut SelectLine1 (D2);
-DigitalOut SelectLine0 (D1); // LSB of Select Lines
+ MAX17048 master(A4,A5,100000);//CHECK SDA,SCL LINES,FREQUENCY
+int quantiz(float start,float step,float x);
+//GPIO pins used=> D2-D13, A0-A1
+DigitalOut SelectLinesA[]={D2,D3,D4,D5};//to mux1
+DigitalOut SelectLinesB[]={D6,D7,D8,D9};//to mux2
+DigitalOut SelectLinesC[]={D10,D11,D12,D13};//to mux3
+
+//--------------------------------------------MSB is SelectLines[0],LSB is SelectLines[3]-------------------------------- 
+
+AnalogIn CurrentInput(A0); // Input from Current
+AnalogIn VoltageInput(A1); // Input from Voltage Multiplexer
+AnalogIn TemperatureInput(A2); /*Input from Temperature Multiplexer,thermistor Multiplexer- same multiplexer for both(0-3 for thermistor,4-15 for temperature sensor)*/
+    
+SensorData Sensor;//struct variable
  
-AnalogIn CurrentInput(A1); // Input from Current Multiplexer
-AnalogIn VoltageInput(A2); // Input from Voltage Multiplexer
-AnalogIn TemperatureInput(A3); // input from Temperature Multiplexer
-
-SensorData Sensor; 
-int quantiz(float start,float step,float x)
+int quantiz(float start,float step,float x)     // accepts min and measured values and step->quantises on a scale 0-15
 {
     int y=(x-start)/step;
     if(y<=0)y=0;
     if(y>=15)y=15;
     return y;
 }
-ShortBeacy Shortbeacon; 
-void init_beacon(ShortBeacy x){
-   ;
+ 
+void init_beacon(ShortBeacy x)  //dummy values----------to be changed-------------------
+{
+    x.Voltage[0]=1;
+    x.AngularSpeed[0]=2;
+    x.AngularSpeed[1]=3;
+    x.SubsystemStatus[0]=145;
+    x.Temp[0]=1;
+    x.Temp[1]=2;
+    x.Temp[2]=3;
+    x.ErrorFlag[0]=3;
 }
- 
-
-void FUNC_HK_MAIN()
+ ShortBeacy Shortbeacon;//struct variable
+void FUNC_HK_MAIN()             
 {
-    printf("\nEntered function  HK MAIN\n");
     
-     Shortbeacon.Voltage[0]=1;
-   Shortbeacon.AngularSpeed[0]=2;
-    Shortbeacon.AngularSpeed[1]=3;
-    Shortbeacon.SubsystemStatus[0]=145;
-    Shortbeacon.Temp[0]=1;
-    Shortbeacon.Temp[1]=2;
-    Shortbeacon.Temp[2]=3;
-    Shortbeacon.ErrorFlag[0]=3;
     
+    init_beacon(Shortbeacon);
+    //initialise all selectlines to zeroes->1st line of mux selected
+    SelectLinesA[0]=SelectLinesA[1]=SelectLinesA[2]=SelectLinesA[3]=0;
+    SelectLinesB[0]=SelectLinesB[1]=SelectLinesB[2]=SelectLinesB[3]=0;
+    SelectLinesC[0]=SelectLinesC[1]=SelectLinesC[2]=SelectLinesC[3]=0;
     int LoopIterator;
+    float resistance_thermistor,voltage_thermistor;//for thermistor
+ 
+    for(LoopIterator=0; LoopIterator<16; LoopIterator++) 
+{
  
-    SelectLine0=0;
-    SelectLine1=0;
-    SelectLine2=0;
-    SelectLine3=0;
- 
-    for(LoopIterator=0; LoopIterator<16; LoopIterator++) {
-        
-        if(LoopIterator%2==0) {
-            Sensor.Current[LoopIterator/2]=quantiz(cstart,cstep,((CurrentInput.read()*3.18)/(50*rsens)));
+        if(LoopIterator%2==0)
+     {
+           
             Sensor.Voltage[LoopIterator/2]=quantiz(vstart,vstep,(VoltageInput.read()*3.18*5.37));
-            Sensor.Temperature[LoopIterator/2]=quantiz(tstart,tstep,(-90.7*3.18*TemperatureInput.read()+190.1543));
-        } else {
-            Sensor.Current[(LoopIterator-1)/2]=(Sensor.Current[(LoopIterator-1)/2]<<4)+quantiz(cstart,cstep,((CurrentInput.read()*3.18)/(50*rsens)));
-            Sensor.Voltage[(LoopIterator-1)/2]=(Sensor.Voltage[(LoopIterator-1)/2]<<4)+quantiz(vstart,vstep,(VoltageInput.read()*3.18*5.37));
-            Sensor.Temperature[(LoopIterator-1)/2]=(Sensor.Temperature[(LoopIterator-1)/2]<<4)+quantiz(tstart,tstep,(-90.7*3.18*TemperatureInput.read()+190.1543));
+            Sensor.Current[LoopIterator/2]=quantiz(cstart,cstep,(CurrentInput.read()*3.18/(50*rsens)));
+        if(LoopIterator>3)
+        Sensor.Temperature[(LoopIterator-4)/2]=quantiz(tstart,tstep,(-90.7*3.18*TemperatureInput.read()+190.1543));
+         else
+        {    voltage_thermistor=TemperatureInput.read()*3.18;
+            resistance_thermistor=24000*voltage_thermistor/(3.3-voltage_thermistor);
+        if(voltage_thermistor<1.378) //Temperature>12 degC
+             Sensor.PanelTemperature[(LoopIterator)/2]=quantiz(tstart_thermistor,tstep_thermistor,(3694/log(24.032242*resistance_thermistor)));
+            
+        else    {
+            Sensor.PanelTemperature[(LoopIterator)/2]=quantiz(tstart_thermistor,tstep_thermistor,(3365.4792/log(7.60404*resistance_thermistor)));
+            }
         }
+        } 
+    
+    else
+     {
+           
+            Sensor.Voltage[(LoopIterator-1)/2]=Sensor.Voltage[(LoopIterator-1)/2]<<4+quantiz(vstart,vstep,(VoltageInput.read()*3.18*5.37));
+            Sensor.Current[(LoopIterator-1)/2]=Sensor.Current[(LoopIterator-1)/2]<<4+quantiz(cstart,cstep,(CurrentInput.read()*3.18/(50*rsens)));
+            if(LoopIterator>3)
+                 Sensor.Temperature[(LoopIterator-5)/2]=Sensor.Temperature[(LoopIterator-5)/2]<<4+quantiz(tstart,tstep,(-90.7*3.18*TemperatureInput.read()+190.1543)); 
+             else
+             {   voltage_thermistor=TemperatureInput.read()*3.18;
+                    resistance_thermistor=24000*voltage_thermistor/(3.3-voltage_thermistor);
+            if(voltage_thermistor<1.378) //Temperature>12 degC 
+                        Sensor.PanelTemperature[(LoopIterator-1)/2]=Sensor.PanelTemperature[(LoopIterator-1)/2]<<4+quantiz(tstart_thermistor,tstep_thermistor,(3694/log(24.032242*resistance_thermistor)));
+                    else
+                    Sensor.PanelTemperature[(LoopIterator-1)/2]=Sensor.PanelTemperature[(LoopIterator-1)/2]<<4+quantiz(tstart_thermistor,tstep_thermistor,(3364.4792/log(7.60404*resistance_thermistor)));
+                
+        }
+      }
+    float batteryparameters[4];//to populate battery parameters of struct variable Sensor
+    FUNC_BATTERYGAUGE_MAIN(batteryparameters);//passing array to function 
+    
+    Sensor.Vcell=batteryparameters[0];
+    Sensor.soc=batteryparameters[1];
+    Sensor.crate=batteryparameters[2];
+    Sensor.alerts=batteryparameters[3];
+    
 // The following lines are used to iterate the select lines from 0 to 15
-        SelectLine0=!(SelectLine0);
- 
-        if(LoopIterator%2==1)
-            SelectLine1=!(SelectLine1);
- 
-        if(LoopIterator%4==3)
-            SelectLine2=!(SelectLine2);
- 
-        if(LoopIterator%8==7)
-            SelectLine3=!(SelectLine3);
-        
+    int SelectLineIterator;
+       //following is an algorithm similar to counting binary numbers of 4 bit
+       for(SelectLineIterator=3;SelectLineIterator>=0;SelectLineIterator--)
+        {
+            if(SelectLinesA[SelectLineIterator]==0)
+            {
+                SelectLinesA[SelectLineIterator]=1;
+                break;
+            }
+            else SelectLinesA[SelectLineIterator]=0;
+    
+       SelectLinesB[SelectLineIterator]=SelectLinesA[SelectLineIterator];
+           SelectLinesC[SelectLineIterator]=SelectLinesA[SelectLineIterator];
+        }
+    
+    
         wait_us(10.0); //  A delay of 10 microseconds between each sensor output. Can be changed.
  
     }
-   
-       printf("\nVoltage  is %u\n",Shortbeacon.Voltage[0]);
-       printf("\nCurrent  is %u\n",Shortbeacon.Temp[0]);
-       
+    
+}
+void FUNC_BATTERYGAUGE_MAIN(float array[])
+{
+    float vcell=master.vcell();
+    float soc=master.soc();
+    float crate=master.crate();
+    
+    printf("\nVcell=%f",vcell);
+    printf("\nSOC=%f",soc);
+    printf("\nC_rate=%f",crate);
     
-        
- printf("\nExited function HK MAIN\n");
-}
+    array[0]=vcell;
+    array[1]=soc;
+    array[2]=crate;
+    if (master.alerting()== true)       //alert is on
+    {   
+        array[3]=master.alertFlags();
+        master.clearAlert();//clear alert
+        master.clearAlertFlags();//clear all alert flags
+    }
+    
+    
+}
\ No newline at end of file