From 0de37bf637fe3f1e71d899c682954c15e193ae71 Mon Sep 17 00:00:00 2001
From: Alex <84599917+GyverLibs@users.noreply.github.com>
Date: Fri, 18 Feb 2022 15:35:45 +0300
Subject: [PATCH] upd
---
README.md | 3 +-
.../Planner/PlannerArray/PlannerArray.ino | 4 +-
.../Planner/PlannerCircle/PlannerCircle.ino | 4 +-
.../Planner/PlannerControl/PlannerControl.ino | 4 +-
examples/Planner/PlannerDemo/PlannerDemo.ino | 4 +-
.../Planner/PlannerHoming/PlannerHoming.ino | 4 +-
.../PlannerSpeedControl.ino | 4 +-
.../PlannerTimerISR/PlannerTimerISR.ino | 4 +-
.../Planner2/PlannerArray/PlannerArray.ino | 4 +-
.../Planner2/PlannerCircle/PlannerCircle.ino | 4 +-
.../PlannerCircleISR/PlannerCircleISR.ino | 4 +-
library.properties | 2 +-
src/GyverStepper.h | 65 ++++++++-----------
src/StepperCore.h | 4 +-
14 files changed, 51 insertions(+), 63 deletions(-)
diff --git a/README.md b/README.md
index c8b87b8..e30d4e6 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[![Foo](https://img.shields.io/badge/Version-2.4-brightgreen.svg?style=flat-square)](#versions)
+[![Foo](https://img.shields.io/badge/Version-2.5-brightgreen.svg?style=flat-square)](#versions)
[![Foo](https://img.shields.io/badge/Website-AlexGyver.ru-blue.svg?style=flat-square)](https://alexgyver.ru/)
[![Foo](https://img.shields.io/badge/%E2%82%BD$%E2%82%AC%20%D0%9D%D0%B0%20%D0%BF%D0%B8%D0%B2%D0%BE-%D1%81%20%D1%80%D1%8B%D0%B1%D0%BA%D0%BE%D0%B9-orange.svg?style=flat-square)](https://alexgyver.ru/support_alex/)
@@ -780,6 +780,7 @@ void loop() {
- v2.2.1 - небольшая оптимизация SRAM
- v2.3 - fix compiler warnings, поддержка esp32
- v2.4 - повышена плавность движения шаговиков в Planner и Planner2. Исправлена бага в Stepper2
+- v2.5 - исправлено плавное изменение скорости для KEEP_SPEED
## Баги и обратная связь
diff --git a/examples/Planner/PlannerArray/PlannerArray.ino b/examples/Planner/PlannerArray/PlannerArray.ino
index 4bd162e..72ca00d 100644
--- a/examples/Planner/PlannerArray/PlannerArray.ino
+++ b/examples/Planner/PlannerArray/PlannerArray.ino
@@ -15,8 +15,8 @@ int path[][2] = {
int nodeAmount = sizeof(path) / 4;
#include "GyverPlanner.h"
-Stepper stepper1(2, 3);
-Stepper stepper2(4, 5);
+Stepper stepper1(2, 5);
+Stepper stepper2(3, 6);
GPlanner planner;
void setup() {
diff --git a/examples/Planner/PlannerCircle/PlannerCircle.ino b/examples/Planner/PlannerCircle/PlannerCircle.ino
index f647329..10b8981 100644
--- a/examples/Planner/PlannerCircle/PlannerCircle.ino
+++ b/examples/Planner/PlannerCircle/PlannerCircle.ino
@@ -6,8 +6,8 @@ int radius = 100; // радиус круга
int32_t path[pointAm + 2][2]; // буфер круга
#include "GyverPlanner.h"
-Stepper stepper1(2, 3);
-Stepper stepper2(4, 5);
+Stepper stepper1(2, 5);
+Stepper stepper2(3, 6);
GPlanner planner;
void setup() {
diff --git a/examples/Planner/PlannerControl/PlannerControl.ino b/examples/Planner/PlannerControl/PlannerControl.ino
index 1faaa91..d225b62 100644
--- a/examples/Planner/PlannerControl/PlannerControl.ino
+++ b/examples/Planner/PlannerControl/PlannerControl.ino
@@ -6,8 +6,8 @@
// r - продолжить
#include "GyverPlanner.h"
-Stepper stepper1(2, 3);
-Stepper stepper2(4, 5);
+Stepper stepper1(2, 5);
+Stepper stepper2(3, 6);
GPlanner planner;
void setup() {
diff --git a/examples/Planner/PlannerDemo/PlannerDemo.ino b/examples/Planner/PlannerDemo/PlannerDemo.ino
index 7e17d29..a3ea16a 100644
--- a/examples/Planner/PlannerDemo/PlannerDemo.ino
+++ b/examples/Planner/PlannerDemo/PlannerDemo.ino
@@ -14,8 +14,8 @@
// МОТОРЫ ДОЛЖНЫ БЫТЬ С ОДИНАКОВЫМ ТИПОМ ДРАЙВЕРА
// вот они красавцы
-Stepper stepper1(2, 3);
-Stepper stepper2(4, 5);
+Stepper stepper1(2, 5);
+Stepper stepper2(3, 6);
// создаём планировщик, указываем в <> тип драйвера КАК У МОТОРОВ
// и количество осей, равное количеству моторов (любое больше 1)
diff --git a/examples/Planner/PlannerHoming/PlannerHoming.ino b/examples/Planner/PlannerHoming/PlannerHoming.ino
index 346494b..0b9eca5 100644
--- a/examples/Planner/PlannerHoming/PlannerHoming.ino
+++ b/examples/Planner/PlannerHoming/PlannerHoming.ino
@@ -4,8 +4,8 @@
#define LIMSW_Y 7
#include "GyverPlanner.h"
-Stepper stepper1(2, 3);
-Stepper stepper2(4, 5);
+Stepper stepper1(2, 5);
+Stepper stepper2(3, 6);
GPlanner planner;
void setup() {
diff --git a/examples/Planner/PlannerSpeedControl/PlannerSpeedControl.ino b/examples/Planner/PlannerSpeedControl/PlannerSpeedControl.ino
index 1852a6d..a32e315 100644
--- a/examples/Planner/PlannerSpeedControl/PlannerSpeedControl.ino
+++ b/examples/Planner/PlannerSpeedControl/PlannerSpeedControl.ino
@@ -1,8 +1,8 @@
// крутим мотор. Отправляй в сериал целое число, шаг/сек
#include "GyverPlanner.h"
-Stepper stepper1(2, 3);
-Stepper stepper2(4, 5);
+Stepper stepper1(2, 5);
+Stepper stepper2(3, 6);
GPlanner planner;
void setup() {
diff --git a/examples/Planner/PlannerTimerISR/PlannerTimerISR.ino b/examples/Planner/PlannerTimerISR/PlannerTimerISR.ino
index d66d63e..219f425 100644
--- a/examples/Planner/PlannerTimerISR/PlannerTimerISR.ino
+++ b/examples/Planner/PlannerTimerISR/PlannerTimerISR.ino
@@ -2,8 +2,8 @@
// используется Timer1 на atmega328
#include "GyverPlanner.h"
-Stepper stepper1(2, 3);
-Stepper stepper2(4, 5);
+Stepper stepper1(2, 5);
+Stepper stepper2(3, 6);
GPlanner planner;
void setup() {
diff --git a/examples/Planner2/PlannerArray/PlannerArray.ino b/examples/Planner2/PlannerArray/PlannerArray.ino
index baa2c3a..25371d1 100644
--- a/examples/Planner2/PlannerArray/PlannerArray.ino
+++ b/examples/Planner2/PlannerArray/PlannerArray.ino
@@ -14,8 +14,8 @@ int path[][2] = {
int nodeAmount = sizeof(path) / 4;
#include "GyverPlanner2.h"
-Stepper stepper1(2, 3);
-Stepper stepper2(4, 5);
+Stepper stepper1(2, 5);
+Stepper stepper2(3, 6);
GPlanner2 planner;
void setup() {
diff --git a/examples/Planner2/PlannerCircle/PlannerCircle.ino b/examples/Planner2/PlannerCircle/PlannerCircle.ino
index 9cdf647..dd3180a 100644
--- a/examples/Planner2/PlannerCircle/PlannerCircle.ino
+++ b/examples/Planner2/PlannerCircle/PlannerCircle.ino
@@ -7,8 +7,8 @@ int32_t path[pointAm + 1 + 1][2]; // буфер круга
// +1 на стартовую точку +1 на замыкание круга
#include "GyverPlanner2.h"
-Stepper stepper1(2, 3);
-Stepper stepper2(4, 5);
+Stepper stepper1(2, 5);
+Stepper stepper2(3, 6);
GPlanner2 planner;
void setup() {
diff --git a/examples/Planner2/PlannerCircleISR/PlannerCircleISR.ino b/examples/Planner2/PlannerCircleISR/PlannerCircleISR.ino
index 7ba4289..cb15637 100644
--- a/examples/Planner2/PlannerCircleISR/PlannerCircleISR.ino
+++ b/examples/Planner2/PlannerCircleISR/PlannerCircleISR.ino
@@ -8,8 +8,8 @@ int32_t path[pointAm + 1 + 1][2]; // буфер круга
// +1 на стартовую точку +1 на замыкание круга
#include "GyverPlanner2.h"
-Stepper stepper1(2, 3);
-Stepper stepper2(4, 5);
+Stepper stepper1(2, 5);
+Stepper stepper2(3, 6);
GPlanner2 planner;
void setup() {
diff --git a/library.properties b/library.properties
index d9f7993..828f932 100644
--- a/library.properties
+++ b/library.properties
@@ -1,5 +1,5 @@
name=GyverStepper
-version=2.4
+version=2.5
author=AlexGyver
maintainer=AlexGyver
sentence=Fast library for stepmotor control and multi-axis planning
diff --git a/src/GyverStepper.h b/src/GyverStepper.h
index c3daebe..1ffdb6c 100644
--- a/src/GyverStepper.h
+++ b/src/GyverStepper.h
@@ -53,6 +53,7 @@
v2.2.1 - небольшая оптимизация SRAM
v2.3 - fix compiler warnings, поддержка esp32
v2.4 - повышена плавность движения шаговиков в Planner и Planner2. Исправлена бага в Stepper2
+ v2.5 - исправлено плавное изменение скорости для KEEP_SPEED
*/
/*
@@ -179,8 +180,7 @@ void attachPower(handler)
// =========== МАКРОСЫ ===========
#define degPerMinute(x) ((x)/60.0f)
#define degPerHour(x) ((x)/3600.0f)
-#define _sign(x) ((x) >= 0 ? 1 : -1) // знак числа
-#define maxMacro(a,b) ((a)>(b)?(a):(b)) // привет esp
+#define _sign(x) ((x) >= 0 ? 1 : -1) // знак числа
// =========== КОНСТАНТЫ ===========
#define _MIN_SPEED_FP 5 // мин. скорость для движения в FOLLOW_POS с ускорением
@@ -203,10 +203,11 @@ class GStepper : public Stepper<_DRV, _TYPE> {
public:
// конструктор
GStepper(int stepsPerRev, uint8_t pin1 = 255, uint8_t pin2 = 255, uint8_t pin3 = 255, uint8_t pin4 = 255, uint8_t pin5 = 255) :
- _stepsPerDeg(stepsPerRev / 360.0), Stepper<_DRV, _TYPE> (pin1, pin2, pin3, pin4, pin5) {
+ Stepper<_DRV, _TYPE> (pin1, pin2, pin3, pin4, pin5) {
// умолчания
setMaxSpeed(300);
setAcceleration(300);
+ _stepsPerDeg = (stepsPerRev / 360.0);
}
// ============================== TICK ==============================
@@ -218,7 +219,7 @@ class GStepper : public Stepper<_DRV, _TYPE> {
if (!_curMode && _accel != 0 && _maxSpeed >= _MIN_SPEED_FP) planner(); // планировщик скорости FOLLOW_POS быстрый
#endif
- if (_smoothStart && _curMode) smoothSpeedPlanner(); // планировщик скорости KEEP_SPEED
+ if (_curMode && _accel != 0) smoothSpeedPlanner(); // планировщик скорости KEEP_SPEED
if (tickUs - _prevTime >= stepTime) { // основной таймер степпера
_prevTime = tickUs;
@@ -295,7 +296,7 @@ class GStepper : public Stepper<_DRV, _TYPE> {
// установка максимальной скорости в шагах/секунду
void setMaxSpeed(float speed) {
speed = abs(speed);
- _maxSpeed = maxMacro(speed, _MIN_STEP_SPEED); // 1 шаг в час минимум
+ _maxSpeed = max(speed, _MIN_STEP_SPEED); // 1 шаг в час минимум
// считаем stepTime для низких скоростей или отключенного ускорения
if (_accel == 0 || _maxSpeed < _MIN_SPEED_FP) stepTime = 1000000.0 / _maxSpeed;
@@ -367,22 +368,18 @@ class GStepper : public Stepper<_DRV, _TYPE> {
void setSpeed(float speed, bool smooth = false) { // smooth убран!
// 1 шаг в час минимум
_speed = speed;
- if (abs(_speed) < _MIN_STEP_SPEED) _speed = _MIN_STEP_SPEED * _sign(_speed);
- enable();
+ _stopF = (_speed == 0);
+ if (_speed == 0 && _accelSpeed == 0) return;
dir = (_speed > 0) ? 1 : -1;
+ if (abs(_speed) < _MIN_STEP_SPEED) _speed = _MIN_STEP_SPEED * dir;
+
if (_accel != 0) { // плавный старт
if (_accelSpeed != _speed) {
- _smoothStart = true;
- #ifdef __AVR__
- _smoothPlannerPrd = map(max(abs((int)_speed), abs((int)_accelSpeed)), 1000, 20000, 15000, 1000);
- #else
- // горячий привет авторам ядра esp8266
- int speed1 = abs(_speed);
- int speed2 = abs((int)_accelSpeed);
- int maxSpeed = maxMacro(speed1, speed2);
- _smoothPlannerPrd = map(maxSpeed, 1000, 20000, 15000, 1000);
- #endif
- _smoothPlannerPrd = constrain(_smoothPlannerPrd, 15000, 1000);
+ int speed1 = (int)abs(_speed);
+ int speed2 = (int)abs(_accelSpeed);
+ _speedPlannerPrd = map(max(speed1, speed2), 1000, 20000, 15000, 2000);
+ _speedPlannerPrd = constrain(_speedPlannerPrd, 15000, 2000);
+ stepTime = abs(1000000.0 / _accelSpeed);
}
} else { // резкий старт
if (speed == 0) { // скорость 0? Отключаемся и выходим
@@ -390,8 +387,9 @@ class GStepper : public Stepper<_DRV, _TYPE> {
return;
}
_accelSpeed = _speed;
- stepTime = round(1000000.0 / abs(_speed));
+ stepTime = abs(1000000.0 / _speed);
}
+ enable();
}
// установка целевой скорости в градусах/секунду
@@ -412,7 +410,6 @@ class GStepper : public Stepper<_DRV, _TYPE> {
// установка режима работы
void setRunMode(GS_runMode mode){
_curMode = mode;
- if (mode == FOLLOW_POS) _smoothStart = false;
resetTimers();
}
@@ -468,7 +465,7 @@ class GStepper : public Stepper<_DRV, _TYPE> {
}
// аккуратно сбросить все таймеры
void resetTimers() {
- _smoothPlannerTime = _plannerTime = _prevTime = micros();
+ _speedPlannerTime = _plannerTime = _prevTime = micros();
}
@@ -541,40 +538,30 @@ class GStepper : public Stepper<_DRV, _TYPE> {
// ======================= SPEED PLANNER =======================
float _accelTime = 0;
- uint16_t _smoothPlannerPrd = 15000;
- uint32_t _smoothPlannerTime = 0;
+ uint16_t _speedPlannerPrd = 15000;
+ uint32_t _speedPlannerTime = 0;
uint32_t _plannerTime = 0;
// планировщик разгона для KEEP_SPEED
void smoothSpeedPlanner() {
- if (tickUs - _smoothPlannerTime >= _smoothPlannerPrd) {
- _smoothPlannerTime = tickUs;
- int8_t dir = _sign(_speed - _accelSpeed); // 1 - разгон, -1 - торможение
- _accelSpeed += (_accelTime * _smoothPlannerPrd * dir);
+ if (tickUs - _speedPlannerTime >= _speedPlannerPrd) {
+ _speedPlannerTime = tickUs;
+ _accelSpeed += (_accelTime * _speedPlannerPrd * _sign(_speed - _accelSpeed));
dir = _sign(_accelSpeed);
-
- // прекращение работы планировщика
- if ((dir == 1 && _accelSpeed >= _speed) || (dir == -1 && _accelSpeed <= _speed)) {
- _accelSpeed = _speed;
- _smoothStart = false;
- if (abs(_speed) <= _MIN_STEP_SPEED) { // если нужно остановиться
- brake();
- return; // выходим
- }
- }
stepTime = abs(1000000.0 / _accelSpeed);
+ if (_stopF && abs(_accelSpeed) <= _MIN_STEP_SPEED) brake();
}
}
// ========================= VARIABLES =========================
- const float _stepsPerDeg;
+ bool _stopF = 0;
+ float _stepsPerDeg;
uint32_t _prevTime = 0;
float _accelSpeed = 0;
int32_t _target = 0;
volatile uint32_t tickUs = 0;
bool _workState = false;
bool _autoPower = false;
- bool _smoothStart = false;
float _stopSpeed = 0;
float _maxSpeed = 300;
float _speed = 0;
diff --git a/src/StepperCore.h b/src/StepperCore.h
index a18b2b2..0351ed3 100644
--- a/src/StepperCore.h
+++ b/src/StepperCore.h
@@ -199,12 +199,12 @@ class Stepper {
// шажочек степдир
void stepDir() {
if (_TYPE == STEPPER_PINS) {
- setPin(1, (dir > 0 ? _globDir : !_globDir) ); // DIR
+ setPin(1, (dir > 0) ^ _globDir); // DIR
setPin(0, 1); // step HIGH
if (DRIVER_STEP_TIME > 0) delayMicroseconds(DRIVER_STEP_TIME);
setPin(0, 0); // step LOW
} else if (*_step) {
- _step(dir > 0 ? _globDir : !_globDir);
+ _step((dir > 0) ^ _globDir);
}
}