Коэффициент шестерня

Arduinchlk
Arduinchlk аватар
Offline
Зарегистрирован: 15.03.2021

знатокам и читателям здрасте!

код управление шаговым двигателем при помощи роторного энкодера

прошу подсказать как реализовать в коде Коэффициент шестерни. пробовал в коде менять скорость двигателя шагового строкой STEPS_PR_ENCODER_PULSE  1. но там не могу задать 1.2 

пробовал также менять тип переменных и округлять результат

на выходе либо 1 коэффициент либо 2

заранее извиняюсь за возможно непонятное объяснение

#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;  
}  

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

А типы каких переменных пытались менять? И на какие типы?

Arduinchlk
Arduinchlk аватар
Offline
Зарегистрирован: 15.03.2021

AndreyD пишет:

А типы каких переменных пытались менять? И на какие типы?

float steps_per_pulse = 1.2;

78 строка pulse_buffer += round(STEPS_PR_ENCODER_PULSE*steps_per_pulse);

 

Arduinchlk
Arduinchlk аватар
Offline
Зарегистрирован: 15.03.2021

да и так думаю это не логично пытать установить количество импульсов 1.2

значит необходимо в другую сторону искать

b707
Offline
Зарегистрирован: 26.05.2017

Arduinchlk - странный подход - вы хотите коэффициент преобразования 1.2. но в коде и намека на это нет. Как вы думаете контроллер догадается о вашем желании? :)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Мне даже интересно , каким образом энкодер покажет 1.2шага