para el ventilador

Dependencies:   QEI FastPWM

Committer:
miguelangel_2511
Date:
Sun Apr 26 08:50:12 2020 +0000
Revision:
9:95fdcdc0977e
Parent:
8:208d965a3bd2
Child:
10:b2d87404309a
Prueba del ventilador con las graficas de volumen, flujo y presion. Aun no se ha tomado en cuenta la influencia del tiempo de impresion sobre la frecuencia de muestreo eficaz.

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 8:208d965a3bd2 16
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 8:208d965a3bd2 206 // Read buttons and performs debounce action
miguelangel_2511 8:208d965a3bd2 207 if(debounce_conta_1ms == DEBOUNCE_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 208 debounce_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 209 Button_Debounce();
miguelangel_2511 8:208d965a3bd2 210 }
miguelangel_2511 8:208d965a3bd2 211 // Read encoder and update the proper indexes
miguelangel_2511 8:208d965a3bd2 212 if(encoder_conta_1ms == ENCODER_READ_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 213 encoder_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 214 Encoder_Read();
miguelangel_2511 8:208d965a3bd2 215 }
miguelangel_2511 8:208d965a3bd2 216 // Indicates if it is time to acquire a new sample from the sensors
miguelangel_2511 8:208d965a3bd2 217 if(sensor_conta_1ms == PRESSURE_SENSOR_READ_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 218 sensor_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 219 read_pressure_sensors_flag = 1;
miguelangel_2511 8:208d965a3bd2 220 }
miguelangel_2511 8:208d965a3bd2 221 // Indicates if it is time to plot the volume, flow and pressure values */
miguelangel_2511 8:208d965a3bd2 222 if(sensor_waveform_conta_1ms == SENSOR_WAVEFORM_PLOT_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 223 sensor_waveform_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 224 pressure_sensor_waveform_update_flag = 1;
miguelangel_2511 8:208d965a3bd2 225 }
miguelangel_2511 8:208d965a3bd2 226 // Indicates if it is time to display the volume, flow and pressure values */
miguelangel_2511 8:208d965a3bd2 227 if(sensor_display_conta_1ms == SENSOR_DISPLAY_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 228 sensor_display_conta_1ms = 0;
miguelangel_2511 9:95fdcdc0977e 229 //pressure_sensor_display_update_flag = 1;
miguelangel_2511 8:208d965a3bd2 230 }
miguelangel_2511 8:208d965a3bd2 231
miguelangel_2511 8:208d965a3bd2 232 }
miguelangel_2511 7:f4e248182d31 233
miguelangel_2511 7:f4e248182d31 234