![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
LEX_Threaded_Programming
Dependencies: Heater_V2 MODSERIAL Nanopb FastPWM ADS8568_ADC
Diff: main.cpp
- 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);