System Management code

Dependencies:   mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP

Fork of SystemManagement by Martin Deng

Files at this revision

API Documentation at this revision

Comitter:
martydd3
Date:
Fri Oct 10 21:46:52 2014 +0000
Parent:
7:5f6e31faa08e
Child:
9:ada056631cac
Commit message:
Added IMD monitoring code based on Kiran's calculations

Changed in this revision

Get_IMD/Get_IMD.h Show annotated file Show diff for this revision Revisions of this file
Get_IMD/IMD.cpp Show annotated file Show diff for this revision Revisions of this file
Get_IMD/IMD.h Show annotated file Show diff for this revision Revisions of this file
PollSwitch/PollSwitch.cpp Show annotated file Show diff for this revision Revisions of this file
SysMngmt.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Get_IMD/Get_IMD.h	Fri Oct 10 20:59:36 2014 +0000
+++ b/Get_IMD/Get_IMD.h	Fri Oct 10 21:46:52 2014 +0000
@@ -1,26 +1,13 @@
 #include "mbed.h"
 #include "string.h"
-/*
-#include "Get_IMD.h"
+
 DigitalOut myled(LED1);
 
-int main() 
-{
-    IMD_Measurement_Output IMD_Result;
-    while(1) 
-    {
-        IMD_Result=Get_Measurement();
-        pc.printf("Frequency:%f\n\r",IMD_Result.Frequency);
-        pc.printf("Duty Cycle:%f\n\r",IMD_Result.Duty_Cycle);
-        pc.printf("State:%s\n\n\r",IMD_Result.State);
-    }
-}
-*/
-
 //Serial pc(USBTX,USBRX);
 
 #ifndef GET_IMD_H
-    #define GET_IMD_H  
+#define GET_IMD_H  
+
     typedef struct
     {
         float Frequency;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Get_IMD/IMD.cpp	Fri Oct 10 21:46:52 2014 +0000
@@ -0,0 +1,68 @@
+#include "IMD.h"
+
+CANBuffer *tx_IMD_Buffer;
+
+IMD::IMD(CANBuffer *can): _p(P1_26) {
+    _p.rise(this, &IMD::rise);
+    _p.fall(this, &IMD::fall);
+    _period = 0.0;
+    _pulsewidth = 0.0;
+    
+    tx_IMD_Buffer = can;
+}
+
+void IMD::rise() {
+    _period = _t.read();
+    _t.reset();
+}
+    
+void IMD::fall() {
+    _pulsewidth = _t.read();
+}
+
+float IMD::frequency() { return 1/_period; }
+float IMD::pulse_width() { return _pulsewidth; }
+float IMD::duty() { return _pulsewidth / _period; }
+
+/*
+    Status      State
+    1           Normal
+    2           under voltage
+    3           Insulation measurement: good
+    4           Insulation measurement: bad
+    5           Device error
+    6           Connection fault earth
+*/
+void update_IMD(void const *arg){
+    IMD *instance = (IMD *)arg;
+    char data[4] = {0};
+    while(1){
+        float freq = instance->frequency();
+        float duty = instance->duty();
+        
+        if(freq >= 5 && freq <15){
+            data[0] = 1;   
+        }else if(freq >= 15 && freq < 25){
+            data[0] = 2;   
+        }else if(freq >= 25 && freq < 35){
+            if(duty <= 15){
+                data[0] = 3;
+            } else if(duty > 85 && duty < 100){
+                data[0] = 4;   
+            }   
+        }else if(freq >= 35 && freq < 45){
+            data[0] = 5;   
+        }else if(freq >= 45 && freq < 55){
+            data[0] = 6;
+        }
+        
+        CANMessage txMessage(TX_IMD_ID, data, 4);
+        tx_IMD_Buffer->txWrite(txMessage);
+        
+        Thread::wait(100);  //10 Hz update    
+    }
+}
+
+void IMD::start_update(){
+    Thread update_thread(update_IMD, this);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Get_IMD/IMD.h	Fri Oct 10 21:46:52 2014 +0000
@@ -0,0 +1,28 @@
+// copied idea from http://developer.mbed.org/forum/mbed/topic/466/?page=1#comment-2457
+
+#ifndef _FILE_IMD_H
+#define _FILE_IMD_H  
+
+#include "mbed.h"
+#include "CANBuffer.h"
+#include "rtos.h"
+
+const int TX_IMD_ID = ((4 << 8) | 7);
+
+class IMD{
+    public:
+        IMD(CANBuffer *can);
+        void start_update();
+        float frequency();
+        float pulse_width();
+        float duty();
+        
+    private:
+        InterruptIn _p;
+        Timer _t;
+        float _pulsewidth, _period;
+        void rise();
+        void fall();      
+};
+
+#endif
\ No newline at end of file
--- a/PollSwitch/PollSwitch.cpp	Fri Oct 10 20:59:36 2014 +0000
+++ b/PollSwitch/PollSwitch.cpp	Fri Oct 10 21:46:52 2014 +0000
@@ -23,9 +23,12 @@
                        
 PollSwitch::PollSwitch(CANBuffer *can){
     tx_Poll_Buffer = can;
+    
+    /*
     for(int i = 0; i < 12; i++){
         poll[i].mode(PullDown);    
     }
+    */
 }
 
 uint16_t poll_switches(){
--- a/SysMngmt.cpp	Fri Oct 10 20:59:36 2014 +0000
+++ b/SysMngmt.cpp	Fri Oct 10 21:46:52 2014 +0000
@@ -19,6 +19,7 @@
 #include "FanPump.h"
 #include "DC_DC.h"
 #include "PollSwitch.h"
+#include "IMD.h"
 
 //Possible problems in IMD coz change of counter
 //Possible problems in BatteryStatus coz change in library
@@ -278,10 +279,12 @@
     FanPump fanPump(&rxBuffer);
     DC dc_dc(&fanPump, &rxBuffer);
     PollSwitch pollSwitch(&rxBuffer);
+    IMD imdMonitor(&rxBuffer);
     
     fanPump.start_update();
     dc_dc.start_update();
     pollSwitch.start_update();
+    imdMonitor.start_update();
 
     while(1)
     {