LEX_Threaded_Programming

Dependencies:   Heater_V2 MODSERIAL Nanopb FastPWM ADS8568_ADC

Revision:
13:b2e00297b465
Parent:
12:cadcea541fbf
Child:
14:39a5eb99fbdb
diff -r cadcea541fbf -r b2e00297b465 main.cpp
--- a/main.cpp	Tue Sep 17 17:17:47 2019 +0000
+++ b/main.cpp	Wed Sep 18 16:44:04 2019 +0000
@@ -25,14 +25,17 @@
 DigitalIn adc_busy(PA_8);                   //Busy interrupt sig#
 
 //Pressure Control
-DigitalOut pump(PA_0);
-//AnalogIn pressure_1(PA_3);
-//AnalogIn pressure_2(PA_5);
+DigitalOut pump(PA_2);
+AnalogIn pressure_1(PA_5);
+//set up pressure read averaging
+
+float pressure_fAvg = 0.1;    // rolling average
+
 float pressure_in = 0.0;
 float pressure_out = 0.0;
 
-float pressure_set = 0.5;
-float pressure_hys = 0.005;
+float pressure_set = 0.46;
+float pressure_hys = 0.02;
 float pressure_set_low = pressure_set - pressure_hys/2;
 float pressure_set_high = pressure_set + pressure_hys/2;
 
@@ -54,9 +57,9 @@
 //Illumination LED Control
 
 //Indicator LEDs
-DigitalOut hb_led(PC_13);       //Green
-DigitalOut led_0(PC_4);         //Red
-DigitalOut led_1(PC_5);         //Green
+DigitalOut hb_led(PC_13);       //Red
+DigitalOut led_0(PC_4);         //Green
+DigitalOut led_1(PC_5);         //Red
 
 //Camera and LED drive
 DigitalOut camTrigger(PB_2);     //Trigger camera
@@ -71,6 +74,7 @@
 //Threads
 Thread heater_control(osPriorityHigh);
 Thread logging_thread(osPriorityAboveNormal);
+Thread pressure_thread(osPriorityAboveNormal);
 
 //Tickers
 Ticker heat_tick;
@@ -82,6 +86,7 @@
 EventFlags flags; //Flags:
                   //        0 => update heater
                   //        1 => log state
+                  //        2 => read pressure
 bool triggered_flag;
 bool status = true;
 
@@ -160,21 +165,9 @@
     flags.set(0x2);
 }
 
-void pressure_control()
+void pressure_trigger()
 {
-    //Read pressure values from ADC
-    //Float 0.0 to 1.0 maps to 0 to Vcc
-//    pressure_in = pressure_1.read();
-//    pressure_out = pressure_2.read();
-//    if (pressure_1 < pressure_set_low) {
-//        pump = 1;
-//        }
-//    else if (pressure_1 > pressure_set_high) {
-//        pump = 0;
-//        }
-    led_1 = !led_1;
-    pump = !pump;
-
+    flags.set(0x3);
 }
 
 
@@ -198,6 +191,28 @@
     }
 }
 
+void pressure_control() {
+    while(1){
+        flags.wait_any(0x3,osWaitForever,true);
+        pressure_in = pressure_in*(1.0-pressure_fAvg) + pressure_1.read()*pressure_fAvg;
+        //pressure_in = 0;
+        //for (int i = 0; i < pressure_nAvg; i++) pressure_in += pressure_1.read();  //read pressure
+        //pressure_in = pressure_in / pressure_nAvg;
+//        pc.printf("%10.6f %10.6f %10.6f\n", pressure_set_low, pressure_set_high, pressure_in);
+        if (pressure_in < pressure_set_low) {
+            led_1 = 1;
+            pump = 1;
+//            pc.printf(" pump on\n");
+        }
+        else if (pressure_in > pressure_set_high) {
+            led_1 = 0;
+            pump = 0;
+//            pc.printf(" pump off\n");
+        }
+    }
+}
+
+
 void set_point_routine(std::vector<memspcr_ThermalStep> profile) {
     int curr_time;
     vector <memspcr_ThermalStep>::iterator it_prev, it = profile.begin();
@@ -222,14 +237,12 @@
                 camTrigger = 1;
                 led_0 = 1;
                 ledDrive = 1;
-//                ledDrive.pulsewidth_ticks(LED_PULSE_WIDTH);
                 triggered_flag = true;
             }
             wait_us(200);
         }
         //Stop camera exposure and turn off LED at end of time segment
         camTrigger = 0;
- //       ledDrive.pulsewidth_ticks(0);
         led_0 = 0;
         ledDrive = 0;
     }
@@ -243,11 +256,6 @@
 
     buffer_length = sizeof(buffer)/sizeof(uint8_t);
     pc.printf("# Input configuration file\n");
-
-    //set up LED PWM drive
-//    ledDrive.prescaler(1);
-//    ledDrive.period_ticks(LED_PULSE_PERIOD);   
-//    ledDrive.pulsewidth_ticks(0);
         
     //set up nanopb
     std::vector<memspcr_ThermalStep> profile;
@@ -275,8 +283,10 @@
         return 1;
     }
 
-    pc.printf("# Starting pressure control\n");
-    pressure_tick.attach(& pressure_control, 1);
+    pc.printf("# Starting pressure control\n");    
+    pressure_thread.start(& pressure_control);
+    pressure_tick.attach_us(& pressure_trigger, 500000);
+
     pc.printf("# Waiting for start signal to begin temperature control (type in an s or press button 0)\n");
     heater->Set_ref(0.0);
     heater_control.start(& temp_control);
@@ -289,7 +299,7 @@
     logging_thread.start(& log_state);
     log_tick.attach_us(& log_trigger,exp_config.logging_interval_ms * 1000);
 
-    pc.printf("# Starting routine...\n");
+    pc.printf("# Starting routine\n");
     pc.printf("#   heater,  time(ms),         r,      rSet,       pIn,      pOut\n");
     timer.start();
     set_point_routine(profile);