РУКОДЕЛКИ Пропуск шагов энкодера

Alex_Zay

✩✩✩✩✩✩✩
5 Янв 2022
4
0
Приветствую откликнувшихся, собираю станочек чпу, шаговик нема 17 , на одной оси с ним инкрементальный энкодер , пытаюсь заставить двигаться до заданной точки т обратно, но визуально вижу что на место каретка не встаёт , думаю ошибка в обработке энкодера, но не могу найти второй день, подскажите что не правильно обрабатываю ?
C++:
#include <GyverStepper2.h>

#include <GyverEncoder.h>

int16_t stepx = 0; // переменная хранения шагов энкодера оси X

#define CLKx 7 // пин A подключения энкодера оси X 600*31*3*4 = 223200 шагов = 360 градусов / 620 шага = 1 градус /1 деление 1 градус 15 минут градуса или 775 шагов энкодера
#define DTx 8  // пин B подключения энкодера оси X
#define SWx 25  // пин подключения кнопки старт
Encoder encx(CLKx, DTx, SWx);

GStepper2< STEPPER2WIRE> stepperX(200, 9, 10, 2); 

void setup() {
  Serial.begin(115200);
  encx.setType(TYPE2);


}
void loop() {
  if (Serial.available() > 0) {
    char incoming = Serial.read();
    switch (incoming) {
      case 'j':
        for(int i = 0; i < 10; i++){
          Serial.print("X 1 ");
          Serial.println(stepx);
          while(stepx != -775){
            stepperX.tick();
            stepperX.setSpeed(-500);
            encx.tick();
            if (encx.isTurn()) {
              if ( encx.isRight()) stepx--;
              if ( encx.isLeft()) stepx++; 
            }
          }
          stepperX.stop();
          Serial.print("X 2 ");
          Serial.println(stepx);

          while(stepx != 0){
            stepperX.tick();
            stepperX.setSpeed(500);
            encx.tick();
            if (encx.isTurn()) {
              if ( encx.isRight()) stepx--;
              if ( encx.isLeft()) stepx++; 
            }
            //Serial.println(stepy);
          }
          stepperX.stop();
          Serial.print("X 3 ");
          Serial.println(stepx);
        }
      break;
      
    }
  }
}