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

Dependencies:   mbed QEI FastPWM

Committer:
miguelangel_2511
Date:
Thu Apr 16 13:02:36 2020 +0000
Revision:
1:aa5df1878126
Parent:
0:9d0b9785d3d6
Child:
2:6f618b905d4f
Pantalla y encoder trabajan de forma coordinada. El driver del motor de pasos trabaja de forma independiente (aun no se ha enlazado con la pantalla y el encoder).

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miguelangel_2511 0:9d0b9785d3d6 1
miguelangel_2511 0:9d0b9785d3d6 2 #include "mbed.h"
miguelangel_2511 0:9d0b9785d3d6 3 #include "project_defines.h"
miguelangel_2511 0:9d0b9785d3d6 4 #include "stepper_motor_driver.h"
miguelangel_2511 0:9d0b9785d3d6 5 #include "buttons.h"
miguelangel_2511 1:aa5df1878126 6 #include "tft_interface.h"
miguelangel_2511 1:aa5df1878126 7 #include "FastPWM.h"
miguelangel_2511 0:9d0b9785d3d6 8
miguelangel_2511 1:aa5df1878126 9 /* Object definition */
miguelangel_2511 1:aa5df1878126 10 InterruptIn stepper_pulse_feedback(STEPPER_PULSE_FEEDBACK_PIN);
miguelangel_2511 1:aa5df1878126 11 FastPWM stepper_pulse(STEPPER_PULSE_PIN, -1);
miguelangel_2511 0:9d0b9785d3d6 12 DigitalOut stepper_en(STEPPER_ENABLE_PIN);
miguelangel_2511 0:9d0b9785d3d6 13 DigitalOut stepper_dir(STEPPER_DIRECTION_PIN);
miguelangel_2511 0:9d0b9785d3d6 14
miguelangel_2511 1:aa5df1878126 15 /* Variable definition */
miguelangel_2511 0:9d0b9785d3d6 16
miguelangel_2511 1:aa5df1878126 17
miguelangel_2511 1:aa5df1878126 18 // ----------------------- Tables used for calculations ------------------------
miguelangel_2511 1:aa5df1878126 19
miguelangel_2511 1:aa5df1878126 20 #if RAMP_STEPS == 50
miguelangel_2511 1:aa5df1878126 21
miguelangel_2511 1:aa5df1878126 22 const float sigma_ramp[RAMP_STEPS] = {
miguelangel_2511 1:aa5df1878126 23 0.002, 0.003, 0.004, 0.005, 0.006, 0.008, 0.010, 0.013, 0.017, 0.021,
miguelangel_2511 1:aa5df1878126 24 0.027, 0.034, 0.042, 0.053, 0.067, 0.083, 0.103, 0.128, 0.157, 0.192,
miguelangel_2511 1:aa5df1878126 25 0.231, 0.277, 0.327, 0.382, 0.440, 0.500, 0.560, 0.618, 0.673, 0.723,
miguelangel_2511 1:aa5df1878126 26 0.769, 0.808, 0.843, 0.872, 0.897, 0.917, 0.933, 0.947, 0.958, 0.966,
miguelangel_2511 1:aa5df1878126 27 0.973, 0.979, 0.983, 0.987, 0.990, 0.992, 0.994, 0.995, 0.996, 0.997
miguelangel_2511 1:aa5df1878126 28 };
miguelangel_2511 1:aa5df1878126 29
miguelangel_2511 1:aa5df1878126 30 #elif RAMP_STEPS == 100
miguelangel_2511 1:aa5df1878126 31
miguelangel_2511 1:aa5df1878126 32 const float sigma_ramp[RAMP_STEPS] = {
miguelangel_2511 1:aa5df1878126 33 0.002, 0.003, 0.003, 0.004, 0.004, 0.005, 0.005, 0.006, 0.006, 0.007,
miguelangel_2511 1:aa5df1878126 34 0.008, 0.009, 0.011, 0.012, 0.013, 0.015, 0.017, 0.019, 0.021, 0.024,
miguelangel_2511 1:aa5df1878126 35 0.027, 0.031, 0.034, 0.039, 0.043, 0.049, 0.055, 0.061, 0.069, 0.077,
miguelangel_2511 1:aa5df1878126 36 0.086, 0.096, 0.107, 0.119, 0.133, 0.147, 0.163, 0.180, 0.199, 0.219,
miguelangel_2511 1:aa5df1878126 37 0.240, 0.263, 0.287, 0.313, 0.339, 0.367, 0.396, 0.425, 0.455, 0.485,
miguelangel_2511 1:aa5df1878126 38 0.515, 0.545, 0.575, 0.604, 0.633, 0.661, 0.687, 0.713, 0.737, 0.760,
miguelangel_2511 1:aa5df1878126 39 0.781, 0.801, 0.820, 0.837, 0.853, 0.867, 0.881, 0.893, 0.904, 0.914,
miguelangel_2511 1:aa5df1878126 40 0.923, 0.931, 0.939, 0.945, 0.951, 0.957, 0.961, 0.966, 0.969, 0.973,
miguelangel_2511 1:aa5df1878126 41 0.976, 0.979, 0.981, 0.983, 0.985, 0.987, 0.988, 0.989, 0.991, 0.992,
miguelangel_2511 1:aa5df1878126 42 0.993, 0.994, 0.994, 0.995, 0.995, 0.996, 0.996, 0.997, 0.997, 0.998f
miguelangel_2511 1:aa5df1878126 43 };
miguelangel_2511 1:aa5df1878126 44
miguelangel_2511 1:aa5df1878126 45 #else
miguelangel_2511 1:aa5df1878126 46 #error "Seleccionar un valor permitido para RAMP_STEPS: Puede ser 50 o 100"
miguelangel_2511 1:aa5df1878126 47 #endif
miguelangel_2511 1:aa5df1878126 48
miguelangel_2511 1:aa5df1878126 49
miguelangel_2511 1:aa5df1878126 50 const float i_e_ratio_stepper_table[I_E_RATIO_INDEX_LIMIT][2]={
miguelangel_2511 1:aa5df1878126 51 {1.0,2.0},
miguelangel_2511 1:aa5df1878126 52 {1.0,2.5},
miguelangel_2511 1:aa5df1878126 53 {1.0,3.0}
miguelangel_2511 1:aa5df1878126 54 };
miguelangel_2511 1:aa5df1878126 55
miguelangel_2511 1:aa5df1878126 56 // -----------------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 57
miguelangel_2511 1:aa5df1878126 58 uint32_t calibration_period_rise_ramp_us[RAMP_STEPS];
miguelangel_2511 1:aa5df1878126 59 uint32_t inspiration_period_rise_ramp_us[RAMP_STEPS];
miguelangel_2511 1:aa5df1878126 60 uint32_t expiration_period_rise_ramp_us[RAMP_STEPS];
miguelangel_2511 1:aa5df1878126 61
miguelangel_2511 1:aa5df1878126 62 // These parameters are configurer through the graphic interface */
miguelangel_2511 1:aa5df1878126 63 uint32_t inspiration_stepper_pulses_setpoint = STEPPER_DRIVER_INSPIRATION_PULSES_DEFAULT ;
miguelangel_2511 1:aa5df1878126 64 //uint32_t expiration_stepper_pulses_setpoint = STEPPER_DRIVER_MAX_PULSES ; // Not used in this version
miguelangel_2511 1:aa5df1878126 65 uint32_t inspiration_stepper_pulse_period_us = STEPPER_DRIVER_DEFAULT_PULSE_PERIOD_US;
miguelangel_2511 1:aa5df1878126 66 uint32_t expiration_stepper_pulse_period_us = STEPPER_DRIVER_DEFAULT_PULSE_PERIOD_US;
miguelangel_2511 1:aa5df1878126 67 uint32_t calibration_stepper_pulse_period_us = STEPPER_DRIVER_DEFAULT_PULSE_PERIOD_US;
miguelangel_2511 1:aa5df1878126 68
miguelangel_2511 1:aa5df1878126 69 // Volume setpoint (250mL, 300mL, 350ml ... 750ml) expressed in steps
miguelangel_2511 1:aa5df1878126 70 uint32_t volume_in_steps[VOLUME_SETPOINT_INDEX_LIMIT] = {
miguelangel_2511 1:aa5df1878126 71 1600, //250 mL
miguelangel_2511 1:aa5df1878126 72 1700, //300 mL
miguelangel_2511 1:aa5df1878126 73 1800, //350 mL
miguelangel_2511 1:aa5df1878126 74 1900, //400 mL
miguelangel_2511 1:aa5df1878126 75 2000, //450 mL
miguelangel_2511 1:aa5df1878126 76 2100, //500 mL
miguelangel_2511 1:aa5df1878126 77 2200, //550 mL
miguelangel_2511 1:aa5df1878126 78 2300, //600 mL
miguelangel_2511 1:aa5df1878126 79 2400, //650 mL
miguelangel_2511 1:aa5df1878126 80 2500, //700 mL
miguelangel_2511 1:aa5df1878126 81 2600 //750 mL
miguelangel_2511 1:aa5df1878126 82 };
miguelangel_2511 1:aa5df1878126 83
miguelangel_2511 1:aa5df1878126 84
miguelangel_2511 1:aa5df1878126 85 // Variables used in every state of the stepper motor driver */
miguelangel_2511 1:aa5df1878126 86 volatile uint32_t stepper_pulse_counter = 0;
miguelangel_2511 1:aa5df1878126 87 volatile uint32_t stepper_ramp_pulse_counter = 0;
miguelangel_2511 1:aa5df1878126 88
miguelangel_2511 1:aa5df1878126 89 // State of the stepper motor
miguelangel_2511 1:aa5df1878126 90 volatile Stepper_Driver_State_t stepper_driver_state = Stepper_Stand_By;
miguelangel_2511 1:aa5df1878126 91
miguelangel_2511 1:aa5df1878126 92 /* Function definition */
miguelangel_2511 1:aa5df1878126 93
miguelangel_2511 1:aa5df1878126 94 /* Initialize the control signals for the stepper */
miguelangel_2511 1:aa5df1878126 95 void Stepper_Driver_Init(void){
miguelangel_2511 1:aa5df1878126 96 stepper_en = STEPPER_ENABLED;
miguelangel_2511 1:aa5df1878126 97 stepper_dir = TO_HOME;
miguelangel_2511 1:aa5df1878126 98 stepper_pulse.period_us((int)calibration_stepper_pulse_period_us);
miguelangel_2511 1:aa5df1878126 99 stepper_pulse.write(0.0f);
miguelangel_2511 1:aa5df1878126 100 stepper_pulse_feedback.fall(&Stepper_Driver_Pulse_Signal_Update);
miguelangel_2511 1:aa5df1878126 101 stepper_driver_state = Stepper_Inspiration_Finish;
miguelangel_2511 1:aa5df1878126 102 // Just for testing purposes
miguelangel_2511 1:aa5df1878126 103 //inspiration_stepper_pulses_setpoint = volume_in_steps[10];
miguelangel_2511 1:aa5df1878126 104 }
miguelangel_2511 1:aa5df1878126 105
miguelangel_2511 0:9d0b9785d3d6 106
miguelangel_2511 0:9d0b9785d3d6 107
miguelangel_2511 0:9d0b9785d3d6 108
miguelangel_2511 1:aa5df1878126 109 void Stepper_Go_Home_Position(void){
miguelangel_2511 1:aa5df1878126 110 // stepper_driver_state = Stepper_Driver_Home_Ramp;
miguelangel_2511 1:aa5df1878126 111
miguelangel_2511 1:aa5df1878126 112 //while(stepper_driver_state != Stepper_Driver_Stand_By){
miguelangel_2511 1:aa5df1878126 113 // Stepper_Driver_State_Machine();
miguelangel_2511 1:aa5df1878126 114 //}
miguelangel_2511 1:aa5df1878126 115 }
miguelangel_2511 1:aa5df1878126 116
miguelangel_2511 1:aa5df1878126 117
miguelangel_2511 1:aa5df1878126 118
miguelangel_2511 1:aa5df1878126 119 void Stepper_Calculate_Period_Ramp(void){
miguelangel_2511 1:aa5df1878126 120
miguelangel_2511 1:aa5df1878126 121 float initial_frequency, final_frequency, frequency_ramp_range;
miguelangel_2511 1:aa5df1878126 122 float frequency_i_hz, period_i_us;
miguelangel_2511 1:aa5df1878126 123 uint8_t i;
miguelangel_2511 1:aa5df1878126 124
miguelangel_2511 1:aa5df1878126 125 /* Period rise ramp for inspiration */
miguelangel_2511 1:aa5df1878126 126 initial_frequency = (float)STEPPER_START_BRAKE_FREQUENCY_HZ;
miguelangel_2511 1:aa5df1878126 127 final_frequency = 1000000.0 / (float)inspiration_stepper_pulse_period_us;
miguelangel_2511 1:aa5df1878126 128 frequency_ramp_range = final_frequency - initial_frequency;
miguelangel_2511 1:aa5df1878126 129
miguelangel_2511 1:aa5df1878126 130 for(i = 0; i < RAMP_STEPS; i++){
miguelangel_2511 1:aa5df1878126 131 frequency_i_hz = initial_frequency + (frequency_ramp_range * sigma_ramp[i]);
miguelangel_2511 1:aa5df1878126 132 period_i_us = 1000000.0 / frequency_i_hz;
miguelangel_2511 1:aa5df1878126 133 inspiration_period_rise_ramp_us[i] = (uint32_t)period_i_us;
miguelangel_2511 1:aa5df1878126 134 }
miguelangel_2511 1:aa5df1878126 135
miguelangel_2511 1:aa5df1878126 136 /* Period rise ramp for expiration */
miguelangel_2511 1:aa5df1878126 137 initial_frequency = (float)STEPPER_START_BRAKE_FREQUENCY_HZ;
miguelangel_2511 1:aa5df1878126 138 final_frequency = 1000000.0 / (float)expiration_stepper_pulse_period_us;
miguelangel_2511 1:aa5df1878126 139 frequency_ramp_range = final_frequency - initial_frequency;
miguelangel_2511 1:aa5df1878126 140
miguelangel_2511 1:aa5df1878126 141 for(i = 0; i < RAMP_STEPS; i++){
miguelangel_2511 1:aa5df1878126 142 frequency_i_hz = initial_frequency + (frequency_ramp_range * sigma_ramp[i]);
miguelangel_2511 1:aa5df1878126 143 period_i_us = 1000000.0 / frequency_i_hz;
miguelangel_2511 1:aa5df1878126 144 expiration_period_rise_ramp_us[i] = (uint32_t)period_i_us;
miguelangel_2511 1:aa5df1878126 145 }
miguelangel_2511 1:aa5df1878126 146
miguelangel_2511 1:aa5df1878126 147 }
miguelangel_2511 1:aa5df1878126 148
miguelangel_2511 1:aa5df1878126 149
miguelangel_2511 1:aa5df1878126 150 void Stepper_Driver_State_Machine(void){
miguelangel_2511 0:9d0b9785d3d6 151
miguelangel_2511 1:aa5df1878126 152 switch(stepper_driver_state){
miguelangel_2511 1:aa5df1878126 153
miguelangel_2511 1:aa5df1878126 154 case Stepper_Inspiration_Rising_Ramp:
miguelangel_2511 1:aa5df1878126 155
miguelangel_2511 1:aa5df1878126 156 break;
miguelangel_2511 1:aa5df1878126 157 // -----------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 158 case Stepper_Inspiration:
miguelangel_2511 1:aa5df1878126 159
miguelangel_2511 1:aa5df1878126 160 break;
miguelangel_2511 1:aa5df1878126 161 // -----------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 162 case Stepper_Inspiration_Falling_Ramp:
miguelangel_2511 1:aa5df1878126 163
miguelangel_2511 1:aa5df1878126 164 break;
miguelangel_2511 1:aa5df1878126 165 // -----------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 166 case Stepper_Inspiration_Finish:
miguelangel_2511 1:aa5df1878126 167
miguelangel_2511 1:aa5df1878126 168 stepper_pulse_counter = 0;
miguelangel_2511 1:aa5df1878126 169 stepper_ramp_pulse_counter = 0;
miguelangel_2511 1:aa5df1878126 170 stepper_dir = TO_HOME;
miguelangel_2511 1:aa5df1878126 171 stepper_pulse.period_us((int)STEPPER_START_BRAKE_PERIOD_US);
miguelangel_2511 1:aa5df1878126 172 stepper_pulse.write(0.5);
miguelangel_2511 1:aa5df1878126 173 stepper_driver_state = Stepper_Expiration_Rising_Ramp;
miguelangel_2511 1:aa5df1878126 174
miguelangel_2511 1:aa5df1878126 175 break;
miguelangel_2511 1:aa5df1878126 176 // -----------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 177 case Stepper_Expiration_Rising_Ramp:
miguelangel_2511 1:aa5df1878126 178
miguelangel_2511 1:aa5df1878126 179 break;
miguelangel_2511 1:aa5df1878126 180 // -----------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 181 case Stepper_Expiration:
miguelangel_2511 1:aa5df1878126 182
miguelangel_2511 1:aa5df1878126 183 break;
miguelangel_2511 1:aa5df1878126 184 // -----------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 185 case Stepper_Expiration_Falling_Ramp:
miguelangel_2511 1:aa5df1878126 186
miguelangel_2511 1:aa5df1878126 187 break;
miguelangel_2511 1:aa5df1878126 188 // -----------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 189 case Stepper_Expiration_Finish:
miguelangel_2511 1:aa5df1878126 190
miguelangel_2511 1:aa5df1878126 191 stepper_pulse_counter = 0;
miguelangel_2511 1:aa5df1878126 192 stepper_ramp_pulse_counter = 0;
miguelangel_2511 1:aa5df1878126 193 stepper_dir = TO_AIRBAG;
miguelangel_2511 1:aa5df1878126 194 stepper_pulse.period_us((int)STEPPER_START_BRAKE_PERIOD_US);
miguelangel_2511 1:aa5df1878126 195 stepper_pulse.write(0.5);
miguelangel_2511 1:aa5df1878126 196 stepper_driver_state = Stepper_Inspiration_Rising_Ramp;
miguelangel_2511 1:aa5df1878126 197
miguelangel_2511 1:aa5df1878126 198 break;
miguelangel_2511 1:aa5df1878126 199 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 200 case Stepper_Limit_Sensor_Error:
miguelangel_2511 1:aa5df1878126 201 // Stop the system
miguelangel_2511 1:aa5df1878126 202 stepper_en = STEPPER_DISABLED;
miguelangel_2511 1:aa5df1878126 203 tft->locate(340,VALUES_ROW2_Y_POS);
miguelangel_2511 1:aa5df1878126 204 tft->printf("error");
miguelangel_2511 1:aa5df1878126 205 stepper_driver_state = Stepper_Stand_By;
miguelangel_2511 1:aa5df1878126 206 break;
miguelangel_2511 1:aa5df1878126 207 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 208 case Stepper_Stand_By:
miguelangel_2511 1:aa5df1878126 209
miguelangel_2511 1:aa5df1878126 210 break;
miguelangel_2511 1:aa5df1878126 211 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 212 default:
miguelangel_2511 1:aa5df1878126 213
miguelangel_2511 1:aa5df1878126 214 break;
miguelangel_2511 0:9d0b9785d3d6 215 }
miguelangel_2511 0:9d0b9785d3d6 216 }
miguelangel_2511 0:9d0b9785d3d6 217
miguelangel_2511 0:9d0b9785d3d6 218
miguelangel_2511 1:aa5df1878126 219 void Stepper_Driver_Pulse_Signal_Update(void){
miguelangel_2511 1:aa5df1878126 220
miguelangel_2511 1:aa5df1878126 221 // Increment the stepper pulse counter
miguelangel_2511 1:aa5df1878126 222 stepper_pulse_counter++;
miguelangel_2511 1:aa5df1878126 223
miguelangel_2511 1:aa5df1878126 224 // Increment the proper counter
miguelangel_2511 1:aa5df1878126 225 switch(stepper_driver_state){
miguelangel_2511 1:aa5df1878126 226 /* Increase the speed gradually */
miguelangel_2511 1:aa5df1878126 227 case Stepper_Inspiration_Rising_Ramp:
miguelangel_2511 1:aa5df1878126 228 if(stepper_ramp_pulse_counter < RAMP_STEPS){
miguelangel_2511 1:aa5df1878126 229 stepper_pulse.period_us((int)inspiration_period_rise_ramp_us[stepper_ramp_pulse_counter]);
miguelangel_2511 1:aa5df1878126 230 stepper_pulse.write(0.5);
miguelangel_2511 1:aa5df1878126 231 stepper_ramp_pulse_counter++;
miguelangel_2511 1:aa5df1878126 232 }else{
miguelangel_2511 1:aa5df1878126 233 stepper_pulse.period_us((int)inspiration_stepper_pulse_period_us);
miguelangel_2511 1:aa5df1878126 234 stepper_pulse.write(0.5);
miguelangel_2511 1:aa5df1878126 235 stepper_ramp_pulse_counter = 0;
miguelangel_2511 1:aa5df1878126 236 stepper_driver_state = Stepper_Inspiration;
miguelangel_2511 1:aa5df1878126 237 }
miguelangel_2511 1:aa5df1878126 238 break;
miguelangel_2511 1:aa5df1878126 239 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 240 case Stepper_Inspiration:
miguelangel_2511 1:aa5df1878126 241 if(stepper_pulse_counter >= (inspiration_stepper_pulses_setpoint - RAMP_STEPS)){
miguelangel_2511 1:aa5df1878126 242 stepper_driver_state = Stepper_Inspiration_Falling_Ramp;
miguelangel_2511 1:aa5df1878126 243 }
miguelangel_2511 1:aa5df1878126 244 break;
miguelangel_2511 1:aa5df1878126 245 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 246 case Stepper_Inspiration_Falling_Ramp:
miguelangel_2511 1:aa5df1878126 247 if(stepper_ramp_pulse_counter < RAMP_STEPS){
miguelangel_2511 1:aa5df1878126 248 stepper_ramp_pulse_counter++;
miguelangel_2511 1:aa5df1878126 249 stepper_pulse.period_us((int)inspiration_period_rise_ramp_us[RAMP_STEPS - stepper_ramp_pulse_counter]);
miguelangel_2511 1:aa5df1878126 250 stepper_pulse.write(0.5);
miguelangel_2511 1:aa5df1878126 251 }else if(stepper_ramp_pulse_counter == RAMP_STEPS){
miguelangel_2511 1:aa5df1878126 252 stepper_ramp_pulse_counter++;
miguelangel_2511 1:aa5df1878126 253 stepper_pulse.period_us((int)STEPPER_START_BRAKE_PERIOD_US);
miguelangel_2511 1:aa5df1878126 254 stepper_pulse.write(0.5);
miguelangel_2511 1:aa5df1878126 255 }else{
miguelangel_2511 1:aa5df1878126 256 stepper_ramp_pulse_counter = 0;
miguelangel_2511 1:aa5df1878126 257 stepper_pulse.write(0.0);
miguelangel_2511 1:aa5df1878126 258 stepper_driver_state = Stepper_Inspiration_Finish;
miguelangel_2511 1:aa5df1878126 259 }
miguelangel_2511 1:aa5df1878126 260 break;
miguelangel_2511 1:aa5df1878126 261 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 262 case Stepper_Inspiration_Finish:
miguelangel_2511 1:aa5df1878126 263 break;
miguelangel_2511 1:aa5df1878126 264 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 265 case Stepper_Expiration_Rising_Ramp:
miguelangel_2511 1:aa5df1878126 266 if(stepper_ramp_pulse_counter < RAMP_STEPS){
miguelangel_2511 1:aa5df1878126 267 stepper_pulse.period_us((int)expiration_period_rise_ramp_us[stepper_ramp_pulse_counter]);
miguelangel_2511 1:aa5df1878126 268 stepper_pulse.write(0.5);
miguelangel_2511 1:aa5df1878126 269 stepper_ramp_pulse_counter++;
miguelangel_2511 1:aa5df1878126 270 }else{
miguelangel_2511 1:aa5df1878126 271 stepper_pulse.period_us((int)expiration_stepper_pulse_period_us);
miguelangel_2511 1:aa5df1878126 272 stepper_pulse.write(0.5);
miguelangel_2511 1:aa5df1878126 273 stepper_ramp_pulse_counter = 0;
miguelangel_2511 1:aa5df1878126 274 stepper_driver_state = Stepper_Expiration;
miguelangel_2511 1:aa5df1878126 275
miguelangel_2511 1:aa5df1878126 276 }
miguelangel_2511 1:aa5df1878126 277 break;
miguelangel_2511 1:aa5df1878126 278 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 279 case Stepper_Expiration:
miguelangel_2511 1:aa5df1878126 280 if(buttons & (1 << LIMIT_SW_01)){
miguelangel_2511 1:aa5df1878126 281 stepper_driver_state = Stepper_Expiration_Falling_Ramp;
miguelangel_2511 1:aa5df1878126 282 }else if(stepper_pulse_counter > STEPPER_DRIVER_MAX_PULSES){
miguelangel_2511 1:aa5df1878126 283 stepper_pulse.write(0.0);
miguelangel_2511 1:aa5df1878126 284 stepper_driver_state = Stepper_Limit_Sensor_Error;
miguelangel_2511 1:aa5df1878126 285 }else{
miguelangel_2511 1:aa5df1878126 286 // Does nothing
miguelangel_2511 1:aa5df1878126 287 }
miguelangel_2511 1:aa5df1878126 288
miguelangel_2511 1:aa5df1878126 289 break;
miguelangel_2511 1:aa5df1878126 290 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 291 case Stepper_Expiration_Falling_Ramp:
miguelangel_2511 1:aa5df1878126 292 if(stepper_ramp_pulse_counter < RAMP_STEPS){
miguelangel_2511 1:aa5df1878126 293 stepper_ramp_pulse_counter++;
miguelangel_2511 1:aa5df1878126 294 stepper_pulse.period_us((int)expiration_period_rise_ramp_us[RAMP_STEPS - stepper_ramp_pulse_counter]);
miguelangel_2511 1:aa5df1878126 295 stepper_pulse.write(0.5);
miguelangel_2511 1:aa5df1878126 296 }else if(stepper_ramp_pulse_counter == RAMP_STEPS){
miguelangel_2511 1:aa5df1878126 297 stepper_pulse.period_us((int)STEPPER_START_BRAKE_PERIOD_US);
miguelangel_2511 1:aa5df1878126 298 stepper_pulse.write(0.5);
miguelangel_2511 1:aa5df1878126 299 stepper_ramp_pulse_counter++;
miguelangel_2511 1:aa5df1878126 300 }else{
miguelangel_2511 1:aa5df1878126 301 stepper_pulse.write(0.0);
miguelangel_2511 1:aa5df1878126 302 stepper_driver_state = Stepper_Expiration_Finish;
miguelangel_2511 1:aa5df1878126 303 }
miguelangel_2511 1:aa5df1878126 304 break;
miguelangel_2511 1:aa5df1878126 305 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 306 case Stepper_Expiration_Finish:
miguelangel_2511 1:aa5df1878126 307 break;
miguelangel_2511 1:aa5df1878126 308 // --------------------------------------------------------------------
miguelangel_2511 1:aa5df1878126 309 default:
miguelangel_2511 1:aa5df1878126 310 break;
miguelangel_2511 1:aa5df1878126 311 }
miguelangel_2511 1:aa5df1878126 312
miguelangel_2511 1:aa5df1878126 313 }
miguelangel_2511 1:aa5df1878126 314
miguelangel_2511 1:aa5df1878126 315
miguelangel_2511 1:aa5df1878126 316
miguelangel_2511 1:aa5df1878126 317
miguelangel_2511 1:aa5df1878126 318