![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
LEX_Threaded_Programming
Dependencies: Heater_V2 MODSERIAL Nanopb FastPWM ADS8568_ADC
Diff: main.cpp
- Revision:
- 18:376350fb7ef9
- Parent:
- 17:d86e749ae9be
- Child:
- 19:8154688252fd
--- a/main.cpp Fri Sep 20 14:54:15 2019 +0000 +++ b/main.cpp Mon Sep 23 15:42:13 2019 +0000 @@ -37,8 +37,6 @@ {{0.01887149, 10.39360225}, {0.03115874, 10.28199855}}, {{0.052545339, 10.06008621}, {0.094239471, 10.11983777}}}; -float drive_cal[2] = {0.0, 1.0}; - Heater * heater; float r_gradient; //setpoint setting @@ -58,19 +56,19 @@ float pressure_set_high; //Heater Control -FastPWM drive_main(PC_9); -FastPWM drive_lysis(PC_8); -FastPWM guard_main(PC_7); -FastPWM guard_lysis(PC_6); +FastPWM drive_1(PC_9); +FastPWM drive_2(PC_8); +FastPWM guard_1(PC_7); +FastPWM guard_2(PC_6); -int heater_ID_main = 1; -int heater_ID_lysis = 2; -int i_port_main = 0; -int i_port_lysis = 2; -int v_port_main = 1; -int v_port_lysis = 3; +//ADC channels for heater current and voltage measurements +int i_port_1 = 0; +int i_port_2 = 2; +int v_port_1 = 1; +int v_port_2 = 3; -int heater_ID = 0; +//Heater ID: heater 1 is nearer liquid sense location, heater 2 is other location +int heater_ID; //Illumination LED Control @@ -265,11 +263,14 @@ int main() { + int i_board = -1; + int i_heater; + float drive_cal_a, drive_cal_b; + pc.baud(115200); adc.init(); pc.printf("\r\nUnique ID: %08X %08X %08X \r\n", uid[0], uid[1], uid[2]); - int i_board = -1; for (int i = 0; i < UID_TABLE_LENGTH; i++) { if (uid[0]==drive_board_uid[i][0] && uid[1]==drive_board_uid[i][1] && uid[2]==drive_board_uid[i][2]) @@ -291,49 +292,51 @@ exp_config.profile.arg = &profile; //read and decode configuration - read_message(); - + read_message(); pc.printf("# Message read\n"); decode_message(); pc.printf("# Message decoded\n"); - Heater * heater_main = new Heater(i_port_main, v_port_main, & drive_main, & guard_main, & adc, adc_busy, exp_config.thermal); - Heater * heater_lysis = new Heater(i_port_lysis, v_port_lysis, & drive_lysis, & guard_lysis, & adc, adc_busy, exp_config.thermal); - //Select heater. Put control times in us for ticker functions - if (exp_config.selected_heater == memspcr_ExperimentConfiguration_Heater_HEATER_1) { - heater = heater_main; - heater_ID = heater_ID_main; - } else if (exp_config.selected_heater == memspcr_ExperimentConfiguration_Heater_HEATER_2) { - heater = heater_lysis; - heater_ID = heater_ID_lysis; - } else { + //Select heater + if (exp_config.selected_heater == memspcr_ExperimentConfiguration_Heater_HEATER_1) + i_heater = 0; + else if (exp_config.selected_heater == memspcr_ExperimentConfiguration_Heater_HEATER_2) + i_heater = 1; + else { pc.printf("# Error - no heater has been selected\n"); return 1; } + heater_ID = i_heater + 1; + + //Set drive ADC->Resistance calibration coefficients (default: no change if board not found) + drive_cal_a = drive_board_cal[i_board][i_heater][0]; + drive_cal_b = drive_board_cal[i_board][i_heater][1]; + + pc.printf("# Heater: %d\n", heater_ID); + pc.printf("# Calibration: %10.6f, %10.6f\n", drive_cal_a, drive_cal_b); - //Set drive ADC->Resistance calibration coefficients - if (i_board != -1) - for (int i=0; i<2; i++) drive_cal[i] = drive_board_cal[i_board][heater_ID-1][i]; - else { - drive_cal[0] = 0.0; - drive_cal[1] = 1.0; - } - - pc.printf("Heater: %d drive_cal[0]: %10.6f drive_cal[1]: %10.6f\n", heater_ID, drive_cal[0], drive_cal[1]); - - pc.printf("# Starting pressure control\n"); + //Define heaters + Heater * heater_1 = new Heater(i_port_1, v_port_1, drive_cal_a, drive_cal_b, & drive_1, & guard_1, & adc, adc_busy, exp_config.thermal); + Heater * heater_2 = new Heater(i_port_2, v_port_2, drive_cal_a, drive_cal_b, & drive_2, & guard_2, & adc, adc_busy, exp_config.thermal); + if (i_heater == 0) + heater = heater_1; + else + heater = heater_2; + + pc.printf("# Waiting for signal to begin pressure control (type p or press button 0)\n"); + while (pc.getcNb()!='p' && !user_0); + pc.printf("# Pressure control start signal received\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"); + pc.printf("# Waiting for signal to begin temperature control (type s or press button 0)\n"); + while (pc.getcNb()!='s' && !user_0); + pc.printf("# Temperature control start signal received\n"); + heater->Set_ref(0.0); heater_control.start(& temp_control); - heat_tick.attach_us(& temp_trigger,exp_config.thermal.control_loop_interval_ms * 1000); - - while (pc.getcNb()!='s' && !user_0); - - pc.printf("# Start signal received\n"); + heat_tick.attach_us(& temp_trigger,exp_config.thermal.control_loop_interval_ms * 1000); logging_thread.start(& log_state); log_tick.attach_us(& log_trigger,exp_config.logging_interval_ms * 1000); @@ -348,8 +351,7 @@ log_tick.detach(); wait(1); heater->turn_off(); - - + pc.printf("# Finished\n"); return 0;