First commit for threaded programme

Dependencies:   Heater MODSERIAL FastPWM ADS8568_ADC

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "MODSERIAL.h"
00003 #include "ADS8568_ADC.h"
00004 #include "Heater.h"
00005 #include "FastPWM.h"
00006 
00007 #define ALL_CH              15     //value of convst bus to read all chanels simultaneosly
00008 
00009 float r_gradient;
00010 float r_set_points[5] = {0.0,0.50,0.51,0.52,0.50};
00011 int time_points[5] = {0,5000,10000,15000,20000};
00012 int trig_time[5] = {0,0,50,50,50};
00013 int curr_time;
00014 //Globals
00015 int camera_read_time;
00016 
00017 MODSERIAL pc(PA_9, PA_10, 512); //mcu TX, RX, 512 byte TX and RX buffers
00018 ADS8568_ADC adc(PB_15, PB_14, PB_13, PB_12, PC_15, PC_0, PC_1, PC_2, PC_3);
00019 I2C i2c(PB_7, PB_8);            //SDA, SCL
00020 Timer timer;
00021 DigitalIn adc_busy(PA_8);                   //Busy interrupt sig#
00022 
00023 
00024 //Heater Control
00025 FastPWM drive_1(PC_9);
00026 FastPWM drive_2(PC_8);
00027 FastPWM guard_1(PC_7);
00028 FastPWM guard_2(PC_6);
00029 
00030 
00031 //Heaters
00032 Heater heater_1(0,1,&drive_1, &guard_1, 525.2, -206);
00033 Heater heater_2(2,3,&drive_2, &guard_2, 525.2, -206);
00034 
00035 //indicator LEDs
00036 DigitalOut hb_led(PC_13);       //Green
00037 DigitalOut led_0(PC_4);         //Red
00038 DigitalOut led_1(PC_5);         //Green
00039 
00040 //User buttons
00041 DigitalIn user_0(PB_0);
00042 DigitalIn user_1(PB_1);
00043 
00044 BusOut converts(PC_0, PC_1, PC_2, PC_3);
00045 
00046 
00047 //Threads
00048 Thread serial_listen;
00049 Thread heater_control;
00050 
00051 //Semaphores
00052 Semaphore heater_semaphore;
00053 
00054 //Tickers
00055 Ticker heat_tick;
00056 Ticker pressure_tick;
00057 
00058 
00059 //Flags
00060 bool start_flag = false;
00061 bool config_flag = false;
00062 volatile bool heater_flag = false;
00063 bool triggered_flag = false;
00064 bool untriggered_flag = false;
00065 
00066 
00067 //Functions
00068 
00069 void serial_rx(){
00070     while(pc.getc() != 'c');
00071     config_flag = true;
00072     while(pc.getc() != 's');
00073     start_flag = true;
00074     }
00075     
00076     
00077 void temp_trigger() {
00078     heater_flag = true;
00079     led_1 = !led_1;
00080     }
00081 
00082 void temp_control() {
00083     while(1){
00084         while(!heater_flag);
00085         heater_1.update();
00086         } 
00087     }
00088 
00089     
00090 void set_point_routine() {
00091     for (int i_set = 1; i_set < sizeof(r_set_points)/sizeof(float); i_set ++){
00092         r_gradient = (r_set_points[i_set] - r_set_points[i_set-1])/(time_points[i_set] - time_points[i_set-1]);
00093         while ((curr_time = timer.read_ms()) <= time_points[i_set]){
00094             heater_1.Set_ref(r_set_points[i_set-1] + r_gradient * (curr_time - time_points[i_set-1]));
00095             if (!triggered_flag && curr_time > time_points[i_set - 1] + trig_time[i_set]){
00096                 //Start camera trigger
00097                 triggered_flag = true;
00098                 }
00099             if (!untriggered_flag && curr_time > time_points[i_set - 1] + trig_time[i_set] + camera_read_time){
00100                 //End camera read
00101                 untriggered_flag = true;
00102                 }
00103             wait_ms(1);
00104         }
00105         
00106     }
00107 }   
00108 
00109 void pressure_control() {
00110     //Input pressure control function here
00111     //i.e.
00112     //read_pressure();
00113     //if (pressure < lower_bound) {
00114             //pump_turn_on();
00115         //}
00116     //else if (pressure > upper_bound) {
00117             //pump_turn_off();
00118         //}
00119     }
00120             
00121 
00122         
00123         
00124 int main() {
00125     pc.baud(115200);
00126     
00127     serial_listen.start(&serial_rx);
00128     heater_control.start(& temp_control);
00129     pressure_tick.attach(& pressure_control, 1);
00130     heat_tick.attach_us(& temp_trigger,3000);
00131     
00132     while (!start_flag){
00133         pc.printf("Waiting for start signal\n");
00134         wait(1);
00135         }
00136     
00137     pc.printf("Starting routine...\n");
00138     set_point_routine();
00139 
00140 
00141     }