Ошибка. Переполнение?

Morn91
Offline
Зарегистрирован: 18.10.2014

Начал разбираться с шаговым двигателем 28BYJ-48 (и драйвером ULN2003) и столкнулся неправильной работой оного. Привожу код. Мотор должен поворачиваться ровно на 360° за 5 секунд. В коде есть две переменных (строки 16 и 23) с довольно длинной мантиссой, которые (кажется) переполняются при определении. Если поменять аргументы местами, то ситуация улучшиться, но мотор всё равно будет крутиться неправильно (будет не докручивать 1-2% до заданного). Как можно это исправить?

#include <AccelStepper.h>

#define HALFSTEP 8
#define MAX 1024
#define ANGLE 360
#define TIME 5

#define motorPin1 2 // IN1
#define motorPin2 3 // IN2
#define motorPin3 4 // IN3
#define motorPin4 5 // IN4

AccelStepper stepper(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);

void setup() {
  float speed = ANGLE * 64 * 64 / 360 / TIME;
  // Лучше при "64 * 64 / 360 * ANGLE / TIME"
  stepper.setMaxSpeed(MAX);
  stepper.setSpeed(speed);
}

void loop() {
  double way = ANGLE * 64 * 64 / 360;
  // Лучше при "64 * 64 / 360 * ANGLE"
  if(abs(stepper.currentPosition()) < abs(way))
    stepper.runSpeed();
}

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

ANGLE = 360, потом деление на 360, бессмысленно, плюс шанс на переполнение.

Если не задумываться о формуле, напрашивается #define ANGLE 360.0

 

Morn91
Offline
Зарегистрирован: 18.10.2014

Там всегда разные числа будут.

Строчка «#define ANGLE 360.0» решила проблему, спасибо!