para el ventilador

Dependencies:   QEI FastPWM

Committer:
miguelangel_2511
Date:
Thu May 07 03:52:31 2020 +0000
Revision:
11:5cb7ae8bd831
Parent:
10:b2d87404309a
Child:
12:3bc2465b034a
Se implemento un filtro IIIR tipo Chebyshev 2 Pasa-bajos de 30 Hz para cada sensor de presion.  Asimismo, se implemento un filtro IIR Chebyshev 2 Pasa-altos de 0.01 Hz y un filtro FIR pasa-bajos de 40 Hz para la senial de flujo.

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