Здравствуйте, делаю проект по повороту шагового двигателя 28BYJ-48 на назначенный угол. Есть плата ардуино уно, плата управления с драйвером drv8825, плата питания, и энкодер и дисплей, на котором я выставляю нужный угол. При изменении float stepResolution = 2 , на значение 1 то двигатель работает только в полношаговом режиме, если значение 2 то работает в полушаговом режиме, в остальных режимах не доезжает, в чем может быть проблема?
#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(10000);
stepper.setAcceleration(10000);
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 = 2048; // полношаговый режим
break;
case 2:
stepsPerRevolution = 4096; // полушаговый режим
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;
}
float stepResolution = 2; // Разрешение шага (по умолчанию 1)
float steps = (float)targetAngle / 360.0 * (float)(stepsPerRevolution * stepResolution);
return round(steps);
}