para el ventilador

Dependencies:   QEI FastPWM

Committer:
miguelangel_2511
Date:
Mon Apr 27 19:52:02 2020 +0000
Revision:
10:b2d87404309a
Parent:
9:95fdcdc0977e
Child:
11:5cb7ae8bd831
Ventilador ajustado al nuevo sistema mecanico (con mordaza) y con el sensor de flujo (espirometria) calibrado de forma aproximada. Tabien se ha configurado el baud rate a su maximo valor funcional (256000 bps).

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miguelangel_2511 0:9d0b9785d3d6 1
miguelangel_2511 0:9d0b9785d3d6 2 /* File inclusion */
miguelangel_2511 0:9d0b9785d3d6 3 #include "mbed.h"
miguelangel_2511 0:9d0b9785d3d6 4 #include "stdint.h"
miguelangel_2511 0:9d0b9785d3d6 5 #include "QEI.h"
miguelangel_2511 0:9d0b9785d3d6 6 #include "project_defines.h"
miguelangel_2511 0:9d0b9785d3d6 7 #include "buttons.h"
miguelangel_2511 0:9d0b9785d3d6 8 #include "encoder_interface.h"
miguelangel_2511 6:d38287621cca 9 #include "nextion_interface.h"
miguelangel_2511 7:f4e248182d31 10 #include "pressure_sensors.h"
miguelangel_2511 8:208d965a3bd2 11 #include "stepper_motor_driver.h"
miguelangel_2511 0:9d0b9785d3d6 12 #include "ventilator.h"
miguelangel_2511 0:9d0b9785d3d6 13
miguelangel_2511 8:208d965a3bd2 14 /* Object definition */
miguelangel_2511 8:208d965a3bd2 15 Ticker ticker_int_1ms; // Ticker interrupt
miguelangel_2511 10:b2d87404309a 16 DigitalOut test_pin(D13);
miguelangel_2511 0:9d0b9785d3d6 17
miguelangel_2511 2:6f618b905d4f 18 /* Global variable definition */
miguelangel_2511 7:f4e248182d31 19
miguelangel_2511 7:f4e248182d31 20 volatile uint8_t read_pressure_sensors_flag;
miguelangel_2511 7:f4e248182d31 21 volatile uint8_t pressure_sensor_display_update_flag;
miguelangel_2511 7:f4e248182d31 22 volatile uint8_t pressure_sensor_waveform_update_flag;
miguelangel_2511 7:f4e248182d31 23
miguelangel_2511 2:6f618b905d4f 24 uint16_t volume_setpoint = VOLUME_SETPOINT_VALUE_DEFAULT;
miguelangel_2511 2:6f618b905d4f 25 uint16_t volume_measured = 480;
miguelangel_2511 2:6f618b905d4f 26 uint8_t resp_frequency = RESP_FREQUENCY_VALUE_DEFAULT;
miguelangel_2511 2:6f618b905d4f 27 float inspiration_time = INSPIRATION_TIME_VALUE_DEFAULT;
miguelangel_2511 2:6f618b905d4f 28 float expiration_time = EXPIRATION_TIME_VALUE_DEFAULT;
miguelangel_2511 2:6f618b905d4f 29 uint8_t pressure_measured = 16;
miguelangel_2511 2:6f618b905d4f 30 uint8_t gas_input = AIR_INPUT;
miguelangel_2511 0:9d0b9785d3d6 31
miguelangel_2511 2:6f618b905d4f 32
miguelangel_2511 1:aa5df1878126 33 Main_Screen_State_t main_screen_state = MAIN_SCREEN_DEFAULT_STATE;
miguelangel_2511 0:9d0b9785d3d6 34 uint8_t first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 35
miguelangel_2511 0:9d0b9785d3d6 36 /* Function definition */
miguelangel_2511 8:208d965a3bd2 37
miguelangel_2511 8:208d965a3bd2 38 void System_Initialize(void){
miguelangel_2511 8:208d965a3bd2 39 Buttons_Initialize();
miguelangel_2511 8:208d965a3bd2 40 Nextion_Interface_Initialize();
miguelangel_2511 8:208d965a3bd2 41 Pressure_Sensors_Initialize();
miguelangel_2511 8:208d965a3bd2 42 ticker_int_1ms.attach(&Ticker_ISR, 0.001);
miguelangel_2511 8:208d965a3bd2 43 Stepper_Driver_Init();
miguelangel_2511 8:208d965a3bd2 44 }
miguelangel_2511 8:208d965a3bd2 45
miguelangel_2511 8:208d965a3bd2 46
miguelangel_2511 6:d38287621cca 47 void Nextion_Encoder_Interaction(void){
miguelangel_2511 0:9d0b9785d3d6 48
miguelangel_2511 1:aa5df1878126 49 switch(main_screen_state){
miguelangel_2511 0:9d0b9785d3d6 50 case Main_Screen_Cursor_Disable:
miguelangel_2511 0:9d0b9785d3d6 51 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 0:9d0b9785d3d6 52 rotary_encoder.reset();
miguelangel_2511 1:aa5df1878126 53 main_screen_state = Main_Screen_Cursor_Enable;
miguelangel_2511 8:208d965a3bd2 54 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 55 }
miguelangel_2511 0:9d0b9785d3d6 56
miguelangel_2511 0:9d0b9785d3d6 57 break;
miguelangel_2511 0:9d0b9785d3d6 58
miguelangel_2511 0:9d0b9785d3d6 59 case Main_Screen_Cursor_Enable:
miguelangel_2511 0:9d0b9785d3d6 60 if(first_time_in_state){
miguelangel_2511 0:9d0b9785d3d6 61 first_time_in_state = 0;
miguelangel_2511 0:9d0b9785d3d6 62 Parameter_Selection_Box_Update();
miguelangel_2511 0:9d0b9785d3d6 63 }else if(parameter_selection_index_change_flag){
miguelangel_2511 0:9d0b9785d3d6 64 parameter_selection_index_change_flag = 0;
miguelangel_2511 0:9d0b9785d3d6 65 Parameter_Selection_Box_Update();
miguelangel_2511 0:9d0b9785d3d6 66 }else{
miguelangel_2511 0:9d0b9785d3d6 67 //Does nothing
miguelangel_2511 0:9d0b9785d3d6 68 }
miguelangel_2511 0:9d0b9785d3d6 69
miguelangel_2511 0:9d0b9785d3d6 70 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 1:aa5df1878126 71 main_screen_state = (Main_Screen_State_t)(2 + parameter_selection_index);
miguelangel_2511 0:9d0b9785d3d6 72 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 73 }
miguelangel_2511 0:9d0b9785d3d6 74
miguelangel_2511 0:9d0b9785d3d6 75 break;
miguelangel_2511 0:9d0b9785d3d6 76
miguelangel_2511 0:9d0b9785d3d6 77
miguelangel_2511 0:9d0b9785d3d6 78 case Main_Screen_Volume_Setpoint_Adjust:
miguelangel_2511 0:9d0b9785d3d6 79 if(first_time_in_state){
miguelangel_2511 0:9d0b9785d3d6 80 first_time_in_state = 0;
miguelangel_2511 8:208d965a3bd2 81 nextion_display.printf("t1.pco=%d", ADJUST_COLOR); // Change font color
miguelangel_2511 6:d38287621cca 82 nextion_display.printf("%c%c%c", 0xff, 0xff, 0xff);
miguelangel_2511 0:9d0b9785d3d6 83 Volume_Setpoint_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 84 }else if(volume_setpoint_index_change_flag){
miguelangel_2511 0:9d0b9785d3d6 85 volume_setpoint_index_change_flag = 0;
miguelangel_2511 0:9d0b9785d3d6 86 Volume_Setpoint_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 87 }else{
miguelangel_2511 0:9d0b9785d3d6 88 //Does nothing
miguelangel_2511 0:9d0b9785d3d6 89 }
miguelangel_2511 0:9d0b9785d3d6 90
miguelangel_2511 0:9d0b9785d3d6 91 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 1:aa5df1878126 92 main_screen_state = Main_Screen_Cursor_Disable;
miguelangel_2511 0:9d0b9785d3d6 93 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 94 Volume_Setpoint_Fix();
miguelangel_2511 0:9d0b9785d3d6 95 Parameter_Selection_Box_Remove();
miguelangel_2511 0:9d0b9785d3d6 96 }
miguelangel_2511 0:9d0b9785d3d6 97
miguelangel_2511 0:9d0b9785d3d6 98 break;
miguelangel_2511 0:9d0b9785d3d6 99
miguelangel_2511 0:9d0b9785d3d6 100 case Main_Screen_Resp_Frequency_Adjust:
miguelangel_2511 0:9d0b9785d3d6 101 if(first_time_in_state){
miguelangel_2511 0:9d0b9785d3d6 102 first_time_in_state = 0;
miguelangel_2511 8:208d965a3bd2 103 nextion_display.printf("t4.pco=%d", ADJUST_COLOR); // Change font color
miguelangel_2511 6:d38287621cca 104 nextion_display.printf("%c%c%c", 0xff, 0xff, 0xff);
miguelangel_2511 0:9d0b9785d3d6 105 Resp_Frequency_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 106 }else if(resp_frequency_index_change_flag){
miguelangel_2511 0:9d0b9785d3d6 107 resp_frequency_index_change_flag = 0;
miguelangel_2511 0:9d0b9785d3d6 108 Resp_Frequency_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 109 }else{
miguelangel_2511 0:9d0b9785d3d6 110 //Does nothing
miguelangel_2511 0:9d0b9785d3d6 111 }
miguelangel_2511 0:9d0b9785d3d6 112
miguelangel_2511 0:9d0b9785d3d6 113 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 1:aa5df1878126 114 main_screen_state = Main_Screen_Cursor_Disable;
miguelangel_2511 0:9d0b9785d3d6 115 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 116 Resp_Frequency_Fix();
miguelangel_2511 6:d38287621cca 117 Parameter_Selection_Box_Remove();
miguelangel_2511 0:9d0b9785d3d6 118 }
miguelangel_2511 0:9d0b9785d3d6 119
miguelangel_2511 0:9d0b9785d3d6 120 break;
miguelangel_2511 0:9d0b9785d3d6 121
miguelangel_2511 0:9d0b9785d3d6 122
miguelangel_2511 0:9d0b9785d3d6 123 case Main_Screen_I_E_Ratio_Adjust:
miguelangel_2511 0:9d0b9785d3d6 124 if(first_time_in_state){
miguelangel_2511 0:9d0b9785d3d6 125 first_time_in_state = 0;
miguelangel_2511 8:208d965a3bd2 126 nextion_display.printf("t7.pco=%d", ADJUST_COLOR); // Change font color
miguelangel_2511 6:d38287621cca 127 nextion_display.printf("%c%c%c", 0xff, 0xff, 0xff);
miguelangel_2511 0:9d0b9785d3d6 128 I_E_Ratio_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 129 }else if(i_e_ratio_index_change_flag){
miguelangel_2511 0:9d0b9785d3d6 130 i_e_ratio_index_change_flag = 0;
miguelangel_2511 0:9d0b9785d3d6 131 I_E_Ratio_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 132 }else{
miguelangel_2511 0:9d0b9785d3d6 133 //Does nothing
miguelangel_2511 0:9d0b9785d3d6 134 }
miguelangel_2511 0:9d0b9785d3d6 135
miguelangel_2511 0:9d0b9785d3d6 136 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 1:aa5df1878126 137 main_screen_state = Main_Screen_Cursor_Disable;
miguelangel_2511 0:9d0b9785d3d6 138 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 139 I_E_Ratio_Fix();
miguelangel_2511 0:9d0b9785d3d6 140 Parameter_Selection_Box_Remove();
miguelangel_2511 0:9d0b9785d3d6 141 }
miguelangel_2511 0:9d0b9785d3d6 142
miguelangel_2511 0:9d0b9785d3d6 143 break;
miguelangel_2511 0:9d0b9785d3d6 144
miguelangel_2511 0:9d0b9785d3d6 145 default:
miguelangel_2511 0:9d0b9785d3d6 146 break;
miguelangel_2511 0:9d0b9785d3d6 147
miguelangel_2511 6:d38287621cca 148 }
miguelangel_2511 7:f4e248182d31 149 }
miguelangel_2511 7:f4e248182d31 150
miguelangel_2511 7:f4e248182d31 151
miguelangel_2511 7:f4e248182d31 152 void Nextion_Update_Sensor_Values(void){
miguelangel_2511 7:f4e248182d31 153
miguelangel_2511 8:208d965a3bd2 154 static float previous_pressure_02_psi = 0;
miguelangel_2511 8:208d965a3bd2 155 static float previous_volume_ml = 0;
miguelangel_2511 8:208d965a3bd2 156 static float previous_flow_lpm = 0;
miguelangel_2511 7:f4e248182d31 157 float delta;
miguelangel_2511 7:f4e248182d31 158
miguelangel_2511 7:f4e248182d31 159 /* Check if anu value has change in a meningful way */
miguelangel_2511 8:208d965a3bd2 160 delta = volume_ml - previous_volume_ml;
miguelangel_2511 8:208d965a3bd2 161 if((delta > VOLUME_DISPLAY_THRESHOLD) || (delta < -PRESSURE_DISPLAY_THRESHOLD)){
miguelangel_2511 8:208d965a3bd2 162 Volume_Display_Update();
miguelangel_2511 7:f4e248182d31 163 }
miguelangel_2511 7:f4e248182d31 164
miguelangel_2511 7:f4e248182d31 165 delta = pressure_02_psi - previous_pressure_02_psi;
miguelangel_2511 7:f4e248182d31 166 if((delta > PRESSURE_DISPLAY_THRESHOLD) || (delta < -PRESSURE_DISPLAY_THRESHOLD)){
miguelangel_2511 8:208d965a3bd2 167 Pressure_Display_Update();
miguelangel_2511 7:f4e248182d31 168 }
miguelangel_2511 7:f4e248182d31 169
miguelangel_2511 8:208d965a3bd2 170 delta = flow_lpm - previous_flow_lpm;
miguelangel_2511 8:208d965a3bd2 171 if((delta > FLOW_DISPLAY_THRESHOLD) || (delta < -PRESSURE_DISPLAY_THRESHOLD)){
miguelangel_2511 8:208d965a3bd2 172 Flow_Display_Update();
miguelangel_2511 7:f4e248182d31 173 }
miguelangel_2511 7:f4e248182d31 174
miguelangel_2511 7:f4e248182d31 175
miguelangel_2511 7:f4e248182d31 176 /* Update the previous values */
miguelangel_2511 8:208d965a3bd2 177 previous_volume_ml = volume_ml;
miguelangel_2511 7:f4e248182d31 178 previous_pressure_02_psi = pressure_02_psi;
miguelangel_2511 8:208d965a3bd2 179 previous_flow_lpm = flow_lpm;
miguelangel_2511 8:208d965a3bd2 180
miguelangel_2511 7:f4e248182d31 181 }
miguelangel_2511 7:f4e248182d31 182
miguelangel_2511 7:f4e248182d31 183
miguelangel_2511 8:208d965a3bd2 184 void Nextion_Update_Waveform_Values(void){
miguelangel_2511 8:208d965a3bd2 185 Nextion_Plot_Volume_Waveform();
miguelangel_2511 8:208d965a3bd2 186 Nextion_Plot_Pressure_Waveform();
miguelangel_2511 8:208d965a3bd2 187 Nextion_Plot_Flow_Waveform();
miguelangel_2511 8:208d965a3bd2 188 }
miguelangel_2511 8:208d965a3bd2 189
miguelangel_2511 8:208d965a3bd2 190
miguelangel_2511 8:208d965a3bd2 191 // Ticker Interrupt Service Routine
miguelangel_2511 8:208d965a3bd2 192 void Ticker_ISR(void){
miguelangel_2511 8:208d965a3bd2 193
miguelangel_2511 8:208d965a3bd2 194 static uint8_t debounce_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 195 static uint8_t encoder_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 196 static uint8_t sensor_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 197 static uint8_t sensor_waveform_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 198 static uint8_t sensor_display_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 199
miguelangel_2511 8:208d965a3bd2 200 debounce_conta_1ms++;
miguelangel_2511 8:208d965a3bd2 201 encoder_conta_1ms++;
miguelangel_2511 8:208d965a3bd2 202 sensor_conta_1ms++;
miguelangel_2511 8:208d965a3bd2 203 sensor_waveform_conta_1ms++;
miguelangel_2511 8:208d965a3bd2 204 sensor_display_conta_1ms++;
miguelangel_2511 7:f4e248182d31 205
miguelangel_2511 10:b2d87404309a 206
miguelangel_2511 8:208d965a3bd2 207 // Read buttons and performs debounce action
miguelangel_2511 8:208d965a3bd2 208 if(debounce_conta_1ms == DEBOUNCE_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 209 debounce_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 210 Button_Debounce();
miguelangel_2511 8:208d965a3bd2 211 }
miguelangel_2511 8:208d965a3bd2 212 // Read encoder and update the proper indexes
miguelangel_2511 8:208d965a3bd2 213 if(encoder_conta_1ms == ENCODER_READ_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 214 encoder_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 215 Encoder_Read();
miguelangel_2511 8:208d965a3bd2 216 }
miguelangel_2511 8:208d965a3bd2 217 // Indicates if it is time to acquire a new sample from the sensors
miguelangel_2511 8:208d965a3bd2 218 if(sensor_conta_1ms == PRESSURE_SENSOR_READ_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 219 sensor_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 220 read_pressure_sensors_flag = 1;
miguelangel_2511 8:208d965a3bd2 221 }
miguelangel_2511 8:208d965a3bd2 222 // Indicates if it is time to plot the volume, flow and pressure values */
miguelangel_2511 8:208d965a3bd2 223 if(sensor_waveform_conta_1ms == SENSOR_WAVEFORM_PLOT_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 224 sensor_waveform_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 225 pressure_sensor_waveform_update_flag = 1;
miguelangel_2511 10:b2d87404309a 226 test_pin = !test_pin;
miguelangel_2511 8:208d965a3bd2 227 }
miguelangel_2511 8:208d965a3bd2 228 // Indicates if it is time to display the volume, flow and pressure values */
miguelangel_2511 8:208d965a3bd2 229 if(sensor_display_conta_1ms == SENSOR_DISPLAY_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 230 sensor_display_conta_1ms = 0;
miguelangel_2511 10:b2d87404309a 231 pressure_sensor_display_update_flag = 1;
miguelangel_2511 8:208d965a3bd2 232 }
miguelangel_2511 8:208d965a3bd2 233
miguelangel_2511 8:208d965a3bd2 234 }
miguelangel_2511 7:f4e248182d31 235
miguelangel_2511 7:f4e248182d31 236