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