Es un backup para las pruebas de firmware y hardware de un ventilador

Dependencies:   mbed 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 10:b2d87404309a 1
miguelangel_2511 5:bd5fc0510e7b 2 //#include "math.h"
miguelangel_2511 0:9d0b9785d3d6 3 #include "mbed.h"
miguelangel_2511 0:9d0b9785d3d6 4 #include "project_defines.h"
miguelangel_2511 0:9d0b9785d3d6 5 #include "stepper_motor_driver.h"
miguelangel_2511 0:9d0b9785d3d6 6 #include "buttons.h"
miguelangel_2511 6:d38287621cca 7 #include "nextion_interface.h"
miguelangel_2511 1:aa5df1878126 8 #include "FastPWM.h"
miguelangel_2511 3:45299e7882b9 9 #include "ventilator.h"
miguelangel_2511 11:5cb7ae8bd831 10 #include "pressure_sensors.h"
miguelangel_2511 0:9d0b9785d3d6 11
miguelangel_2511 1:aa5df1878126 12 /* Object definition */
miguelangel_2511 1:aa5df1878126 13 InterruptIn stepper_pulse_feedback(STEPPER_PULSE_FEEDBACK_PIN);
miguelangel_2511 1:aa5df1878126 14 FastPWM stepper_pulse(STEPPER_PULSE_PIN, -1);
miguelangel_2511 0:9d0b9785d3d6 15 DigitalOut stepper_en(STEPPER_ENABLE_PIN);
miguelangel_2511 0:9d0b9785d3d6 16 DigitalOut stepper_dir(STEPPER_DIRECTION_PIN);
miguelangel_2511 0:9d0b9785d3d6 17
miguelangel_2511 3:45299e7882b9 18
miguelangel_2511 1:aa5df1878126 19 /* Variable definition */
miguelangel_2511 0:9d0b9785d3d6 20
miguelangel_2511 3:45299e7882b9 21 volatile uint8_t stepper_parameters_update_flag = 0;
miguelangel_2511 1:aa5df1878126 22
miguelangel_2511 1:aa5df1878126 23
miguelangel_2511 1:aa5df1878126 24 // These parameters are configurer through the graphic interface */
miguelangel_2511 1:aa5df1878126 25 uint32_t inspiration_stepper_pulses_setpoint = STEPPER_DRIVER_INSPIRATION_PULSES_DEFAULT ;
miguelangel_2511 10:b2d87404309a 26
miguelangel_2511 10:b2d87404309a 27 float inspiration_stepper_pulse_period = 0.005;
miguelangel_2511 10:b2d87404309a 28 float expiration_stepper_pulse_period = 0.005;
miguelangel_2511 10:b2d87404309a 29 float calibration_stepper_pulse_period = 0.005;
miguelangel_2511 1:aa5df1878126 30
miguelangel_2511 5:bd5fc0510e7b 31
miguelangel_2511 1:aa5df1878126 32 // Volume setpoint (250mL, 300mL, 350ml ... 750ml) expressed in steps
miguelangel_2511 1:aa5df1878126 33 uint32_t volume_in_steps[VOLUME_SETPOINT_INDEX_LIMIT] = {
miguelangel_2511 11:5cb7ae8bd831 34 70, // 1600, //250 mL//720//47
miguelangel_2511 11:5cb7ae8bd831 35 75, // 1700, //300 mL//765
miguelangel_2511 11:5cb7ae8bd831 36 80, // 1800, //350 mL//810
miguelangel_2511 11:5cb7ae8bd831 37 85, // 1900, //400 mL//855
miguelangel_2511 11:5cb7ae8bd831 38 90, // 2000, //450 mL//900
miguelangel_2511 11:5cb7ae8bd831 39 95, // 2100, //500 mL//945
miguelangel_2511 11:5cb7ae8bd831 40 100, // 2200, //550 mL//990
miguelangel_2511 11:5cb7ae8bd831 41 105, // 2300, //600 mL //1035
miguelangel_2511 11:5cb7ae8bd831 42 110, // 2400, //650 mL//1080
miguelangel_2511 11:5cb7ae8bd831 43 115, // 2500, //700 mL//1125
miguelangel_2511 11:5cb7ae8bd831 44 120 // 2600 //750 mL//1170
miguelangel_2511 1:aa5df1878126 45 };
miguelangel_2511 1:aa5df1878126 46
miguelangel_2511 1:aa5df1878126 47
miguelangel_2511 1:aa5df1878126 48 // Variables used in every state of the stepper motor driver */
miguelangel_2511 1:aa5df1878126 49 volatile uint32_t stepper_pulse_counter = 0;
miguelangel_2511 10:b2d87404309a 50 //volatile uint32_t stepper_ramp_pulse_counter = 0;
miguelangel_2511 1:aa5df1878126 51
miguelangel_2511 1:aa5df1878126 52 // State of the stepper motor
miguelangel_2511 1:aa5df1878126 53 volatile Stepper_Driver_State_t stepper_driver_state = Stepper_Stand_By;
miguelangel_2511 1:aa5df1878126 54
miguelangel_2511 1:aa5df1878126 55 /* Function definition */
miguelangel_2511 1:aa5df1878126 56
miguelangel_2511 1:aa5df1878126 57 /* Initialize the control signals for the stepper */
miguelangel_2511 1:aa5df1878126 58 void Stepper_Driver_Init(void){
miguelangel_2511 1:aa5df1878126 59 stepper_en = STEPPER_ENABLED;
miguelangel_2511 1:aa5df1878126 60 stepper_dir = TO_HOME;
miguelangel_2511 10:b2d87404309a 61 stepper_pulse.period(calibration_stepper_pulse_period);
miguelangel_2511 1:aa5df1878126 62 stepper_pulse.write(0.0f);
miguelangel_2511 1:aa5df1878126 63 stepper_pulse_feedback.fall(&Stepper_Driver_Pulse_Signal_Update);
miguelangel_2511 3:45299e7882b9 64 stepper_driver_state = Stepper_Inspiration_Finish;
miguelangel_2511 3:45299e7882b9 65 stepper_parameters_update_flag = 1;
miguelangel_2511 1:aa5df1878126 66 // Just for testing purposes
miguelangel_2511 1:aa5df1878126 67 //inspiration_stepper_pulses_setpoint = volume_in_steps[10];
miguelangel_2511 1:aa5df1878126 68 }
miguelangel_2511 1:aa5df1878126 69
miguelangel_2511 0:9d0b9785d3d6 70
miguelangel_2511 1:aa5df1878126 71 void Stepper_Go_Home_Position(void){
miguelangel_2511 1:aa5df1878126 72 // stepper_driver_state = Stepper_Driver_Home_Ramp;
miguelangel_2511 1:aa5df1878126 73
miguelangel_2511 1:aa5df1878126 74 //while(stepper_driver_state != Stepper_Driver_Stand_By){
miguelangel_2511 1:aa5df1878126 75 // Stepper_Driver_State_Machine();
miguelangel_2511 1:aa5df1878126 76 //}
miguelangel_2511 1:aa5df1878126 77 }
miguelangel_2511 1:aa5df1878126 78
miguelangel_2511 1:aa5df1878126 79
miguelangel_2511 3:45299e7882b9 80 void Stepper_Update_Parameters(void){
miguelangel_2511 3:45299e7882b9 81
miguelangel_2511 3:45299e7882b9 82 int8_t stepper_volume_index;
miguelangel_2511 3:45299e7882b9 83 float total_time, total_time_sec, insp_time_sec, exp_time_sec;
miguelangel_2511 3:45299e7882b9 84
miguelangel_2511 3:45299e7882b9 85 /* Update the value of the volume setpoint (expressed in steps) */
miguelangel_2511 3:45299e7882b9 86 stepper_volume_index = (volume_setpoint - VOLUME_SETPOINT_MINIMUM_VALUE) / VOLUME_SETPOINT_STEP;
miguelangel_2511 3:45299e7882b9 87 inspiration_stepper_pulses_setpoint = volume_in_steps[stepper_volume_index];
miguelangel_2511 3:45299e7882b9 88
miguelangel_2511 3:45299e7882b9 89 /* Update the value of the pulse periods in microseconds */
miguelangel_2511 3:45299e7882b9 90 total_time = inspiration_time + expiration_time;
miguelangel_2511 4:d42e1953243c 91 total_time_sec = 60.0 / resp_frequency;
miguelangel_2511 3:45299e7882b9 92 insp_time_sec = (total_time_sec * inspiration_time) / total_time;
miguelangel_2511 3:45299e7882b9 93 exp_time_sec = (total_time_sec * expiration_time) / total_time;
miguelangel_2511 4:d42e1953243c 94
miguelangel_2511 4:d42e1953243c 95 /* Calculate stepper pulse period for inspiration */
miguelangel_2511 10:b2d87404309a 96 inspiration_stepper_pulse_period = ((float)insp_time_sec) / ((float)inspiration_stepper_pulses_setpoint);
miguelangel_2511 4:d42e1953243c 97 /* Calculate stepper pulse period for expiration */
miguelangel_2511 10:b2d87404309a 98 expiration_stepper_pulse_period = ((float)exp_time_sec) / ((float)inspiration_stepper_pulses_setpoint);
miguelangel_2511 1:aa5df1878126 99
miguelangel_2511 11:5cb7ae8bd831 100 volume_ml = 0.0;
miguelangel_2511 11:5cb7ae8bd831 101
miguelangel_2511 5:bd5fc0510e7b 102 }
miguelangel_2511 5:bd5fc0510e7b 103
miguelangel_2511 5:bd5fc0510e7b 104
miguelangel_2511 5:bd5fc0510e7b 105
miguelangel_2511 1:aa5df1878126 106 void Stepper_Driver_State_Machine(void){
miguelangel_2511 0:9d0b9785d3d6 107
miguelangel_2511 1:aa5df1878126 108 switch(stepper_driver_state){
miguelangel_2511 10:b2d87404309a 109
miguelangel_2511 1:aa5df1878126 110 case Stepper_Inspiration:
miguelangel_2511 1:aa5df1878126 111
miguelangel_2511 1:aa5df1878126 112 break;
miguelangel_2511 1:aa5df1878126 113 // -----------------------------------------------------------------------
miguelangel_2511 10:b2d87404309a 114
miguelangel_2511 1:aa5df1878126 115 case Stepper_Inspiration_Finish:
miguelangel_2511 1:aa5df1878126 116
miguelangel_2511 1:aa5df1878126 117 stepper_pulse_counter = 0;
miguelangel_2511 1:aa5df1878126 118 stepper_dir = TO_HOME;
miguelangel_2511 10:b2d87404309a 119 stepper_pulse.period(expiration_stepper_pulse_period);
miguelangel_2511 1:aa5df1878126 120 stepper_pulse.write(0.5);
miguelangel_2511 10:b2d87404309a 121 stepper_driver_state = Stepper_Expiration;
miguelangel_2511 11:5cb7ae8bd831 122 //pressure_sensor_display_update_flag = 1;
miguelangel_2511 1:aa5df1878126 123
miguelangel_2511 1:aa5df1878126 124 break;
miguelangel_2511 10:b2d87404309a 125 // -----------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 126 case Stepper_Expiration:
miguelangel_2511 1:aa5df1878126 127
miguelangel_2511 1:aa5df1878126 128 break;
miguelangel_2511 10:b2d87404309a 129 // -----------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 130 case Stepper_Expiration_Finish:
miguelangel_2511 3:45299e7882b9 131
miguelangel_2511 3:45299e7882b9 132 if(stepper_parameters_update_flag){
miguelangel_2511 3:45299e7882b9 133 stepper_parameters_update_flag = 0;
miguelangel_2511 3:45299e7882b9 134 Stepper_Update_Parameters();
miguelangel_2511 3:45299e7882b9 135 }
miguelangel_2511 1:aa5df1878126 136
miguelangel_2511 10:b2d87404309a 137 stepper_pulse_counter = 0;
miguelangel_2511 1:aa5df1878126 138 stepper_dir = TO_AIRBAG;
miguelangel_2511 10:b2d87404309a 139 stepper_pulse.period(inspiration_stepper_pulse_period);
miguelangel_2511 1:aa5df1878126 140 stepper_pulse.write(0.5);
miguelangel_2511 10:b2d87404309a 141 stepper_driver_state = Stepper_Inspiration;
miguelangel_2511 1:aa5df1878126 142
miguelangel_2511 11:5cb7ae8bd831 143 //pressure_sensor_display_update_flag = 1;
miguelangel_2511 11:5cb7ae8bd831 144
miguelangel_2511 3:45299e7882b9 145 break;
miguelangel_2511 1:aa5df1878126 146 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 147 case Stepper_Limit_Sensor_Error:
miguelangel_2511 1:aa5df1878126 148 // Stop the system
miguelangel_2511 1:aa5df1878126 149 stepper_en = STEPPER_DISABLED;
miguelangel_2511 6:d38287621cca 150 // tft->locate(340,VALUES_ROW2_Y_POS);
miguelangel_2511 6:d38287621cca 151 // tft->printf("error");
miguelangel_2511 1:aa5df1878126 152 stepper_driver_state = Stepper_Stand_By;
miguelangel_2511 1:aa5df1878126 153 break;
miguelangel_2511 1:aa5df1878126 154 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 155 case Stepper_Stand_By:
miguelangel_2511 1:aa5df1878126 156
miguelangel_2511 1:aa5df1878126 157 break;
miguelangel_2511 1:aa5df1878126 158 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 159 default:
miguelangel_2511 1:aa5df1878126 160
miguelangel_2511 1:aa5df1878126 161 break;
miguelangel_2511 0:9d0b9785d3d6 162 }
miguelangel_2511 0:9d0b9785d3d6 163 }
miguelangel_2511 0:9d0b9785d3d6 164
miguelangel_2511 0:9d0b9785d3d6 165
miguelangel_2511 1:aa5df1878126 166 void Stepper_Driver_Pulse_Signal_Update(void){
miguelangel_2511 1:aa5df1878126 167
miguelangel_2511 1:aa5df1878126 168 // Increment the stepper pulse counter
miguelangel_2511 1:aa5df1878126 169 stepper_pulse_counter++;
miguelangel_2511 1:aa5df1878126 170
miguelangel_2511 10:b2d87404309a 171
miguelangel_2511 1:aa5df1878126 172 switch(stepper_driver_state){
miguelangel_2511 10:b2d87404309a 173
miguelangel_2511 1:aa5df1878126 174 case Stepper_Inspiration:
miguelangel_2511 10:b2d87404309a 175 if(stepper_pulse_counter >= inspiration_stepper_pulses_setpoint){
miguelangel_2511 10:b2d87404309a 176 stepper_driver_state = Stepper_Inspiration_Finish;
miguelangel_2511 10:b2d87404309a 177 stepper_pulse.write(0.0);
miguelangel_2511 1:aa5df1878126 178 }
miguelangel_2511 1:aa5df1878126 179 break;
miguelangel_2511 10:b2d87404309a 180 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 181 case Stepper_Inspiration_Finish:
miguelangel_2511 1:aa5df1878126 182 break;
miguelangel_2511 10:b2d87404309a 183 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 184 case Stepper_Expiration:
miguelangel_2511 1:aa5df1878126 185 if(buttons & (1 << LIMIT_SW_01)){
miguelangel_2511 10:b2d87404309a 186 stepper_driver_state = Stepper_Expiration_Finish;
miguelangel_2511 10:b2d87404309a 187 stepper_pulse.write(0.0);
miguelangel_2511 1:aa5df1878126 188 }else if(stepper_pulse_counter > STEPPER_DRIVER_MAX_PULSES){
miguelangel_2511 10:b2d87404309a 189 stepper_driver_state = Stepper_Limit_Sensor_Error;
miguelangel_2511 1:aa5df1878126 190 stepper_pulse.write(0.0);
miguelangel_2511 1:aa5df1878126 191 }else{
miguelangel_2511 1:aa5df1878126 192 // Does nothing
miguelangel_2511 1:aa5df1878126 193 }
miguelangel_2511 1:aa5df1878126 194
miguelangel_2511 1:aa5df1878126 195 break;
miguelangel_2511 10:b2d87404309a 196 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 197 case Stepper_Expiration_Finish:
miguelangel_2511 1:aa5df1878126 198 break;
miguelangel_2511 1:aa5df1878126 199 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 200 default:
miguelangel_2511 1:aa5df1878126 201 break;
miguelangel_2511 1:aa5df1878126 202 }
miguelangel_2511 1:aa5df1878126 203
miguelangel_2511 1:aa5df1878126 204 }
miguelangel_2511 1:aa5df1878126 205
miguelangel_2511 1:aa5df1878126 206
miguelangel_2511 1:aa5df1878126 207
miguelangel_2511 1:aa5df1878126 208
miguelangel_2511 1:aa5df1878126 209