Код для вращения шагового двигателя на нужный угол поворта

Здравствуйте, делаю проект по повороту шагового двигателя 28BYJ-48 на назначенный угол. Есть плата ардуино уно, плата управления с драйвером drv8825, плата питания, и энкодер и дисплей, на котором я выставляю нужный угол. Написал код, но в нем есть такой косяк, stepsPerRevolution если будет число 4096, то у меня двигатель в режиме полушага все равно поворачивается на нужный угол, а если я изменю число , а если я изменю case 1:
stepsPerRevolution = 2048 , то в полушаговом режиме двигатель уже не будет доходить до угла, а дойдет только в полном шаге. исправь это, вот цельный код , но будет доходить до нужного угла в полношаговом режиме. Вот сам код
#include <TM1637Display.h>
#include <AccelStepper.h>
#include <Encoder.h>

#define CLK A5
#define DIO A4

#define STEP_PIN 2
#define DIR_PIN 3
#define MS1_PIN 4
#define MS2_PIN 5
#define MS3_PIN 6
#define BUTTON_PIN 7

TM1637Display display(CLK, DIO);
Encoder myEnc(8, 9);
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

int angle = 0;
int targetAngle = 0;
int direction = 1;
int stepMode = 1;
bool buttonPressed = false;
bool motorRunning = false;
bool encoderTouched = false;

void save_parameters() {
// Здесь ваш код для сохранения параметров
// Например, сохранение в EEPROM или в другое хранилище
}

void setup() {
pinMode(MS1_PIN, OUTPUT);
pinMode(MS2_PIN, OUTPUT);
pinMode(MS3_PIN, OUTPUT);

pinMode(BUTTON_PIN, INPUT_PULLUP);

display.setBrightness(0x0f);
stepper.setMaxSpeed(1000);
stepper.setAcceleration(100);

motorRunning = false;
}

void loop() {
int newPosition = myEnc.read();

angle = newPosition;
display.showNumberDec(angle);

if (digitalRead(BUTTON_PIN) == LOW && !buttonPressed && !motorRunning) {
targetAngle = angle;
buttonPressed = true;
motorRunning = true;
int steps = calculateSteps(targetAngle);
stepper.move(steps);
stepper.setSpeed(direction * 100);
}

if (digitalRead(BUTTON_PIN) == HIGH) {
buttonPressed = false;
}

if (motorRunning) {
if (stepper.distanceToGo() == 0 && motorRunning) {
motorRunning = false;
display.showNumberDec(targetAngle);
save_parameters(); // Сохранение параметров после остановки двигателя
}
stepper.run();
}

if (digitalRead(5) == LOW) {
direction = -1;
} else {
direction = 1;
}

switch (stepMode) {
case 1:
digitalWrite(MS1_PIN, LOW);
digitalWrite(MS2_PIN, LOW);
digitalWrite(MS3_PIN, LOW);
break;
case 2:
digitalWrite(MS1_PIN, HIGH);
digitalWrite(MS2_PIN, LOW);
digitalWrite(MS3_PIN, LOW);
break;
case 3:
digitalWrite(MS1_PIN, LOW);
digitalWrite(MS2_PIN, HIGH);
digitalWrite(MS3_PIN, LOW);
break;
case 4:
digitalWrite(MS1_PIN, HIGH);
digitalWrite(MS2_PIN, HIGH);
digitalWrite(MS3_PIN, LOW);
break;
case 5:
digitalWrite(MS1_PIN, HIGH);
digitalWrite(MS2_PIN, HIGH);
digitalWrite(MS3_PIN, HIGH);
break;
}
}

int calculateSteps(int targetAngle) {
int stepsPerRevolution = 0;
switch (stepMode) {
case 1:
stepsPerRevolution = 4096; // полношаговый режим
break;
case 2:
stepsPerRevolution = 10; // полушаговый режим
break;
case 3:
stepsPerRevolution = 2048 * 4; // 1/4 шага
break;
case 4:
stepsPerRevolution = 2048 * 8; // 1/8 шага
break;
case 5:
stepsPerRevolution = 2048 * 16; // 1/16 шага
break;
}
int steps = map(targetAngle, 0, 360, 0, stepsPerRevolution);
return steps;
}

Снимок экрана в 2023-03-05 17-05-33

я вижу ошибку, но не могу сказать номер строки.

Это не код. Код выглядит вот так:

#include <TM1637Display.h>
#include <AccelStepper.h>
#include <Encoder.h>

#define CLK A5
#define DIO A4

28BYJ-48 подключается к drv8825? Ничесе.

Да ладно. Одну дорожку на платке ввода перерезать. У меня получилось даже без разборки движка, только крышку сдвинул. А вот ток drv8825 пришлось до 0.2 А уменьшить. Иначе сильно грелся.

Ну да, я сделал из униполярного биполярный, перерезав дорожку на плате ввода, все контакты прозваниваются и работают

А из биполярного - униполярный слабо? :slight_smile: