0 Replies Latest reply on May 29, 2021 8:54 AM by balexfox

    gear step ratio

    balexfox

      Hello everyone
      help to understand the code
      need to increase
      pulse_buffer in 1.2
      but the code only allows integer 1 2 and so on.
      tried changing the pulse_buffer datatype to round off STEPS_PR_ENCODER_PULSE

      but it only works equally well with the whole. can still some parameter increase to then divide?

       

      
      #define ENCODER_PULSE_PIN 2
      #define ENCODER_DIR_PIN   3
      #define DRIVER_STEP_PIN   4
      #define DRIVER_DIR_PIN    7
      #define DRIVER_EN_PIN     8
      
      #define STEPS_PR_ENCODER_PULSE  1
      #define DRIVER_PULSE_PERIOD_US  1
      
      enum Driver_pulse_state_enum {PULSE_IDLE, PULSE_HIGH, PULSE_LOW};
      
      
      
      uint8_t dir = LOW;
      uint16_t pulse_buffer = 0;
      unsigned long time_now = 0;
      uint16_t driver_pulse_hold_time_us = DRIVER_PULSE_PERIOD_US/2;
      uint8_t driver_pulse_state = PULSE_IDLE;
      
      
      
      
      
      void setup() {
      
        pinMode(ENCODER_PULSE_PIN, INPUT);
        pinMode(ENCODER_DIR_PIN, INPUT);
        pinMode(DRIVER_STEP_PIN, OUTPUT);
        pinMode(DRIVER_DIR_PIN, OUTPUT);
        pinMode(DRIVER_EN_PIN, OUTPUT);
         
        attachInterrupt(digitalPinToInterrupt(ENCODER_PULSE_PIN), encoderISR, RISING);
      
        digitalWrite(DRIVER_EN_PIN, HIGH);
      
      
      
      
      
      void loop() {
      
      
        if((pulse_buffer) && (driver_pulse_state == PULSE_IDLE)){
          driver_pulse_state = PULSE_HIGH;
          digitalWrite(DRIVER_DIR_PIN, digitalRead(ENCODER_DIR_PIN));
          digitalWrite(DRIVER_STEP_PIN, HIGH);
          time_now = micros();
        }
      
        if((micros() - time_now > driver_pulse_hold_time_us) && (driver_pulse_state == PULSE_LOW)){
          driver_pulse_state = PULSE_HIGH;
          digitalWrite(DRIVER_STEP_PIN, HIGH);
          time_now = micros();
        }
      
        if((micros() - time_now > driver_pulse_hold_time_us) && (driver_pulse_state == PULSE_HIGH)){
          digitalWrite(DRIVER_STEP_PIN, LOW);
          time_now = micros();
           
          pulse_buffer -= 1;
          if(pulse_buffer < 0){
            pulse_buffer = 0;
          }
           
          if(pulse_buffer){
            driver_pulse_state = PULSE_LOW;
          }
          else{
            driver_pulse_state = PULSE_IDLE;
          }
        }
      
      
        
      }
      
      void encoderISR(){
        pulse_buffer += STEPS_PR_ENCODER_PULSE;
      }