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);