Ian Wolf / Mbed OS TestBenchFlow1

Dependencies:   KellerDruck_pressure PID PWM-Coil-driver Sensirion_SF04 VL6180

Fork of TestBenchFlow by Ian Wolf

Files at this revision

API Documentation at this revision

Comitter:
iwolf32
Date:
Wed Jul 26 14:03:10 2017 +0000
Parent:
3:9ff79ea3a294
Child:
5:e3eff8a04b25
Commit message:
REV2;

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Mon Jul 24 15:38:39 2017 +0000
+++ b/main.cpp	Wed Jul 26 14:03:10 2017 +0000
@@ -1,5 +1,37 @@
 #include "main.h"
+//---------------------------
+void dutycycleincrease()
+{
+    dutycycle=dutycycle+0.01;
+}
 
+void dutycycledecrease()
+{
+    dutycycle=dutycycle-0.01;
+}
+
+void frequencyincrease()
+{
+    frequency=frequency+1;
+}
+void frequencydecrease()
+{
+    frequency=frequency-1;
+}
+void injectorvalvecontrol(){
+
+while(true){
+float openvalue=(((1/frequency)*dutycycle));
+float offvalue=(1/frequency)-openvalue;
+    
+injector.on();
+wait(openvalue);
+injector.off();
+wait(offvalue);
+}
+}
+
+//-----------------------------
 void pumpTachTrigger()
 {
     pumpTachCounts++;
@@ -16,7 +48,7 @@
 {
     pump.period(.001); // 1kHz PWM
     pump = 0;
-    ledGrn.period(.001);
+    //ledGrn.period(.001);
 
     InterruptIn pumpTach(pumpTachPin);
     pumpTach.rise(&pumpTachTrigger);
@@ -40,7 +72,7 @@
         //PID calculation and set the new output value.
         pump = pump_control_PID.compute();
         //pump = 0.1;
-        ledGrn = ((float)1.0-pump.read());
+        //ledGrn = ((float)1.0-pump.read());
     }
 }
 
@@ -53,7 +85,7 @@
         i2c1_m.lock();
         timer.reset();
         error = pumpPressure.readPT();
-        error |= mixerPressure.readPT();
+        //error |= mixerPressure.readPT();
         int wait = (200 - timer.read_ms());
         i2c1_m.unlock();
         Thread::wait(wait);
@@ -61,7 +93,7 @@
     }
 }
 
-void update_airflow()
+void update_flow1()
 {
     Timer timer;
     timer.start();
@@ -69,35 +101,29 @@
     while (true) {
         i2c2_m.lock();
         timer.reset();
-        error = sfm7033.Measure(FLOW);
+        error = mainflow.Measure(FLOW);
         int wait = (200 - timer.read_ms());
         i2c2_m.unlock();
         Thread::wait(wait);
     }
 }
 
-void update_level()
+//------------------------------------------------
+void update_flow2()
 {
     Timer timer;
     timer.start();
+    char error;
     while (true) {
-        i2c1_m.lock();
+        i2c3_m.lock();
         timer.reset();
-        agentlevel = (float)level;
-        int wait = (1000 - timer.read_ms());
-        i2c1_m.unlock();
+        error = loopflow.Measure(FLOW);
+        int wait = (200 - timer.read_ms());
+        i2c3_m.unlock();
         Thread::wait(wait);
     }
 }
-
-//float get_level()
-//{
-//    i2c1_m.lock();
-//    float value = (float)level;
-//    i2c1_m.unlock();
-//    return value;
-//}
-
+//------------------------------------------------   
 
 void print_process_values()
 {
@@ -108,12 +134,12 @@
         stdio_m.lock();
         timer.reset();
 
-        pc.printf("%.02fkPa %.02fpsi %.02fC %.02fF %02X %.02fkPa %.02fpsi %.02fC %.02fF %02X %.2f%% %.0fRPM %u %.0f %s %.1f %.3f\r\n",
-                  pumpPressure.pressureKPA, pumpPressure.pressurePSI, pumpPressure.temperatureC, pumpPressure.temperatureF, pumpPressure.status,
-                  mixerPressure.pressureKPA, mixerPressure.pressurePSI, mixerPressure.temperatureC, mixerPressure.temperatureF, mixerPressure.status,
+        pc.printf("%.02fkPa %.02fpsi %.02fC %02X %.2f%% %.0fRPM %u %.0f %s %u %.0f %s %.3f %.02fHz %.02f\r\n",
+                  pumpPressure.pressureKPA, pumpPressure.pressurePSI, pumpPressure.temperatureC, pumpPressure.status,
                   pump.read()*100, pumpRpm,
-                  sfm7033.flow.u16, (((float)sfm7033.flow.i16 / 2) / sfm7033.scaleFactor.u16), sfm7033.flowUnitStr,
-                  (double)pot1*18, ((double)pot2)*pumpMaxPSI);//, agentlevel;
+                  mainflow.flow.u16, (((float)mainflow.flow.i16) / mainflow.scaleFactor.u16), mainflow.flowUnitStr, 
+                  loopflow.flow.u16, (((float)loopflow.flow.i16) / loopflow.scaleFactor.u16), loopflow.flowUnitStr,
+                  ((double)pot2)*pumpMaxPSI, frequency, dutycycle);//, agentlevel;
         int wait = (1000 - timer.read_ms());
 
         stdio_m.unlock();
@@ -121,97 +147,42 @@
     }
 }
 
-void update_lcd()
-{
-    Timer timer;
-    timer.start();
-    while (true) {
-        float flow = ((((float)sfm7033.flow.i16 / 2) / sfm7033.scaleFactor.u16) < 0 ? 0 : (((float)sfm7033.flow.i16 / 2) / sfm7033.scaleFactor.u16));
-        flow = flow/1000;
-        stdio_m.lock();
-        timer.reset();
-        lcd.cls();
-        lcd.font((unsigned char*)ArialR12x14);
-        lcd.locate(0, 0);
-        lcd.printf("%.2f slpm AA: %.1f", flow, (double)pot1*18);
-        lcd.locate(0, 14);
-        lcd.printf("PV: %.1f", pumpPressure.pressurePSI);
-        lcd.locate(64, 14);
-        lcd.printf("SV: %.1f", ((double)pot2)*pumpMaxPSI);
-        int wait = (1000 - timer.read_ms());
-        stdio_m.unlock();
-        Thread::wait(wait);
-    }
-}
-
-void update_shutoff()
-{
-    Timer timer;
-    timer.start();
-    while (true) {
-        float threshold = 0.1;
-        timer.reset();
-        if((double)pot1 < 0.05) {
-            shutoff.off();
-            //pc.printf("shutoff off\r\n");
-            //Thread::wait(1000);
-        }
-        if((double)pot1 >= 0.1) {
-            shutoff.on();
-            //pc.printf("shutoff on\r\n");
-            //Thread::wait(1000);
-        }
-        int wait = (200 - timer.read_ms());
-        Thread::wait(wait);
-    }
-}
-
 // main() runs in its own thread in the OS
 int main()
 {
     pump_init();
-    ledBlu = 1;
+    //ledBlu = 1;
     pc.printf("Serenity Starting up...\n\r");
-    /*pc.printf("Pmin: %.03f Pmax: %.03f\r\n", pumpPressure.pmin, pumpPressure.pmax);
-    pc.printf("Year: %d Month: %d Day: %d Mode: %d\r\n", pumpPressure.year, pumpPressure.month, pumpPressure.day, pumpPressure.mode);
-    pc.printf("Status: 0x%x\r\n", pumpPressure.getStatus());*/
+//--------------------------------------------
+dutycycleup.rise(&dutycycleincrease);
+dutycycledown.rise(&dutycycledecrease);
+frequencyup.rise(&frequencyincrease);
+frequencydown.rise(&frequencydecrease);    
 
-
-    // Thread to turn shutoff valve on/off
-    update_shutoff_t.set_priority(osPriorityHigh);
-    update_shutoff_t.start(update_shutoff);
+    //Thread to execute injector valve control
+    Injector_Valve_Control.set_priority(osPriorityHigh);
+    Injector_Valve_Control.start(injectorvalvecontrol);
+//--------------------------------------------
 
     // Thread to poll pressure sensors
     update_pressures_t.set_priority(osPriorityNormal);
-    update_pressures_t.start(update_pressures);
-
-    // Thread to poll airflow sensor
-    update_airflow_t.set_priority(osPriorityNormal);
-    update_airflow_t.start(update_airflow);
+    update_pressures_t.start(update_pressures); 
 
-    // Thread to poll level sensor
-    //update_level_t.set_priority(osPriorityIdle);
-    //update_level_t.start(update_level);
-
-    // Thread to update lcd
-    update_lcd_t.set_priority(osPriorityIdle);
-    update_lcd_t.start(update_lcd);
+    // Thread to poll flow sensor
+    update_flow1_t.set_priority(osPriorityNormal);
+    update_flow1_t.start(update_flow1);
+    
+    //Thread to poll flow sensor
+    update_flow2_t.set_priority(osPriorityNormal);
+    update_flow2_t.start(update_flow2);
 
     // Thread to send process values to serial port
     print_process_values_t.set_priority(osPriorityLow);
     print_process_values_t.start(&print_process_values);
 
     while (true) {
-        //pc.printf("%.02fkPa %.02fpsi %.02fC %.02fF\r\n", pumpPressure.pressureKPA, pumpPressure.pressurePSI, pumpPressure.temperatureC, pumpPressure.temperatureF);
-        if((double)pot1 >= 0.1) {
-            injector.on();
-        }
-        //pc.printf("shutoff on\r\n");
-        Thread::wait(5);
-
-        injector.off();
-        //pc.printf("shutoff off\r\n");*/
-        Thread::wait(495);
+         pump_tach_update();
+        
     }
 }
 
--- a/main.h	Mon Jul 24 15:38:39 2017 +0000
+++ b/main.h	Wed Jul 26 14:03:10 2017 +0000
@@ -7,9 +7,25 @@
 #include "PID.h"
 #include "coil-driver.h"
 #include "VL6180.h"
+/*Start of Where Additional Code was Added
+--------------------------------------------------------------------------------------------------*/
+//Coil shutoff(A1, 5000, 40, 6); // Shutoff valve, 5ms spike time, 25kHz PWM at 15% duty cycle
+Coil injector(A0, 200, 40, 3); // Injector valve, 200us spike time, 25kHz PWM at 7.5% duty cycle
 
-Coil shutoff(PE_5, 5000, 40, 6); // Shutoff valve, 5ms spike time, 25kHz PWM at 15% duty cycle
-Coil injector(PF_8, 200, 40, 3); // Injector valve, 200us spike time, 25kHz PWM at 7.5% duty cycle
+InterruptIn dutycycleup(A2);
+InterruptIn dutycycledown(D4);
+InterruptIn frequencyup(A5);
+InterruptIn frequencydown(A4);
+
+Thread Injector_Valve_Control;
+
+double frequency=5.00;
+double dutycycle=0.75;
+float openvalue=(((1/frequency)*dutycycle));
+float offvalue=(1/frequency)-openvalue;
+
+/*
+--------------------------------------------------------------------------------------------------*/
 
 
 // Mbed application shield display
@@ -30,6 +46,7 @@
 
 // Gas flow sensor defines
 #define SFM7033_ADDR 0x40
+#define SFM7034_ADDR 0x40
 // End gas flow sensor defines
 
 // Liquid pump defines
@@ -41,12 +58,12 @@
 
 #define pumpPwmFrequency 1000 // Frequency of PWM signal supplied to pump
 #define pumpTachPoles 6 // 6 pulses per revolution
-#define pumpTachPin PE_7 // Pump tach input (green wire)
-#define pumpCtrlPin PE_10 // Pump control (white wire)
+#define pumpTachPin PB_15 // Pump tach input (green wire)
+#define pumpCtrlPin PB_13 // Pump control (white wire)
 // End Liquid pump defines
 
-Thread print_process_values_t, update_pressures_t, update_airflow_t, update_level_t, update_lcd_t, update_shutoff_t;
-Mutex i2c1_m, i2c2_m, stdio_m;
+Thread print_process_values_t, update_pressures_t, update_flow1_t, update_flow2_t, update_level_t, update_lcd_t, update_shutoff_t;
+Mutex i2c1_m, i2c2_m, i2c3_m, stdio_m;
 
 //DigitalOut myled(LED2);
 Serial pc(USBTX, USBRX, 250000); // tx, rx, baud
@@ -62,19 +79,17 @@
 
 //I2CPreInit gI2C1(I2C_SDA, I2C_SCL, I2C frequency);
 I2CPreInit i2c1(PB_9, PB_8, 100000);
-I2CPreInit i2c2(PB_11, PB_10, 100000);
+I2CPreInit i2c2(PB_3, PB_10, 100000);
+I2CPreInit i2c3(PB_4, PA_8, 100000);
 
 KELLER_PRESSURE pumpPressure(i2c1, 0x40);
-KELLER_PRESSURE mixerPressure(i2c1, 0x41);
-
-
 
 // Sensirion gas flow sensor object (i2c object, i2c address, calibration field, resolution 9-16 bit)
 // calibration field 1: Air, 2: O2, 3: N2O
-SF04 sfm7033(i2c2, SFM7033_ADDR, 1, 14); // Gas flow sensor (SFM7033)
-
+SF04 mainflow(i2c2, SFM7033_ADDR, 0, 9); // Gas flow sensor (SFM7033)
+SF04 loopflow(i2c3, SFM7034_ADDR, 0, 9);
 // Mbed application shield
-AnalogIn pot1(A0);
+//AnalogIn pot1(A0);
 AnalogIn pot2(A1);
 
 PwmOut pump(pumpCtrlPin);
@@ -86,11 +101,11 @@
 volatile int pumpTachCounts = 0;
 volatile float pumpRpm = 0;
 
-PwmOut ledRed(PE_11);
-PwmOut ledGrn(PD_15);
-DigitalOut ledBlu(PF_12);
+//PwmOut ledRed(PE_11);
+//PwmOut ledGrn(PD_15);
+//DigitalOut ledBlu(PF_12);
 
 // Level sensor
-VL6180 level(i2c1); //I2C object
-float agentlevel = 0;
+//VL6180 level(i2c1); //I2C object
+//float agentlevel = 0;
 #endif
\ No newline at end of file