From 0c0f6b725b83dfbabb2dccdf573ab82611dd502d Mon Sep 17 00:00:00 2001
From: Alex <84599917+GyverLibs@users.noreply.github.com>
Date: Mon, 18 Apr 2022 13:15:06 +0300
Subject: [PATCH] upd
---
README.md | 3 ++-
library.properties | 2 +-
src/GyverPlanner.h | 6 +++---
src/GyverPlanner2.h | 8 ++++----
src/GyverStepper.h | 1 +
src/GyverStepper2.h | 4 ++--
6 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/README.md b/README.md
index b055f75..5b6880c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[![Foo](https://img.shields.io/badge/Version-2.6.1-brightgreen.svg?style=flat-square)](#versions)
+[![Foo](https://img.shields.io/badge/Version-2.6.2-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/)
@@ -788,6 +788,7 @@ void loop() {
- добавил autoPower() в GStepper2
- исправлен рывок при смене направления в GStepper
- v2.6.1 - поправлена бага в GStepper2
+- v2.6.2 - оптимизированы вычисления в GStepper2, GPlanner и GPlanner2
## Баги и обратная связь
diff --git a/library.properties b/library.properties
index 6350740..233cc0b 100644
--- a/library.properties
+++ b/library.properties
@@ -1,5 +1,5 @@
name=GyverStepper
-version=2.6.1
+version=2.6.2
author=AlexGyver
maintainer=AlexGyver
sentence=Fast library for stepmotor control and multi-axis planning
diff --git a/src/GyverPlanner.h b/src/GyverPlanner.h
index d534dbe..8678680 100644
--- a/src/GyverPlanner.h
+++ b/src/GyverPlanner.h
@@ -213,8 +213,8 @@ class GPlanner {
us <<= shift;
if (us != 0 && us < GP_MIN_US) { // мы движемся! ААА!
int32_t v1 = 1000000L / us;
- if (2L * V * V - (int32_t)v1 * v1 > 2L * a * S) { // треугольник
- s1 = (2L * a * S - (int32_t)v1 * v1) / (4L * a);
+ if ((int32_t)V * V / a - ((int32_t)v1 * v1 / a >> 1) > S) { // треугольник
+ s1 = ((int32_t)S >> 1) - ((int32_t)v1 * v1 / a >> 2);
s2 = s1;
} else { // трапеция
s1 = ((int32_t)V * V - (int32_t)v1 * v1) / (2L * a);
@@ -222,7 +222,7 @@ class GPlanner {
}
so1 = (int32_t)v1 * v1 / (2 * a);
} else { // не движемся
- if ((int32_t)V * V > (int32_t)a * S) { // треугольник
+ if ((int32_t)V * V / a > S) { // треугольник
s1 = S / 2L;
s2 = s1;
} else { // трапеция
diff --git a/src/GyverPlanner2.h b/src/GyverPlanner2.h
index 91945e8..15c6d2c 100644
--- a/src/GyverPlanner2.h
+++ b/src/GyverPlanner2.h
@@ -457,15 +457,15 @@ class GPlanner2 {
int32_t v1 = bufV.get(0); // скорость начала отрезка
int32_t v2 = bufV.get(1); // скорость конца отрезка
- if (2L * V * V - (int32_t)v1 * v1 - (int32_t)v2 * v2 > 2L * a * S) { // треугольник
- s1 = (2L * a * S + (int32_t)v2 * v2 - (int32_t)v1 * v1) / (4L * a);
+ if ((V * V - ((int32_t)v1 * v1 >> 1) - ((int32_t)v2 * v2 >> 1)) / a > S) { // треугольник
+ s1 = ((int32_t)S >> 1) + (((int32_t)v2 * v2 >> 2) - ((int32_t)v1 * v1 >> 2)) / a;
s2 = 0;
} else { // трапеция
s1 = ((int32_t)V * V - (int32_t)v1 * v1) / (2L * a);
s2 = S - ((int32_t)V * V - (int32_t)v2 * v2) / (2L * a);
}
- so1 = (int32_t)v1 * v1 / (2 * a);
- so2 = (int32_t)v2 * v2 / (2 * a);
+ so1 = (int32_t)v1 * v1 / (2L * a);
+ so2 = (int32_t)v2 * v2 / (2L * a);
if (status != 4) {
if (v1 == 0) us = us0;
else us = 1000000ul / v1;
diff --git a/src/GyverStepper.h b/src/GyverStepper.h
index d4b75cb..5bb3e47 100644
--- a/src/GyverStepper.h
+++ b/src/GyverStepper.h
@@ -60,6 +60,7 @@
- добавил autoPower() в GStepper2
- исправлен рывок при смене направления в GStepper
v2.6.1 - поправлена бага в GStepper2
+ v2.6.2 - оптимизированы вычисления в GStepper2, GPlanner и GPlanner2
*/
/*
diff --git a/src/GyverStepper2.h b/src/GyverStepper2.h
index b2d328d..b5c751d 100644
--- a/src/GyverStepper2.h
+++ b/src/GyverStepper2.h
@@ -263,9 +263,9 @@ class GStepper2 : public Stepper<_DRV, _TYPE> {
// расчёт точек смены характера движения
// s1 - окончание разгона, s1-s2 - равномерное движение, s2 - торможение
if (a > 0 && usMin < GS_MIN_US) { // ускорение задано и мин. скорость выше порога
- if (2L * V * V - (int32_t)v1 * v1 > 2L * a * S) { // треугольник
+ if ((int32_t)V * V / a - ((int32_t)v1 * v1 / a >> 1) > S) { // треугольник
if (revF) s1 = 0;
- else s1 = (2L * a * S - (int32_t)v1 * v1) / (4L * a);
+ else s1 = ((int32_t)S >> 1) - ((int32_t)v1 * v1 / a >> 2);
s2 = s1;
} else { // трапеция
s1 = ((int32_t)V * V - (int32_t)v1 * v1) / (2L * a);