Ошибка. Переполнение?
- Войдите на сайт для отправки комментариев
Пт, 24/10/2014 - 01:19
Начал разбираться с шаговым двигателем 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();
}
ANGLE = 360, потом деление на 360, бессмысленно, плюс шанс на переполнение.
Если не задумываться о формуле, напрашивается #define ANGLE 360.0
Там всегда разные числа будут.
Строчка «#define ANGLE 360.0» решила проблему, спасибо!