Ошибка. Переполнение?
- Войдите на сайт для отправки комментариев
Пт, 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» решила проблему, спасибо!