From 41f7b207b914dbf93ebc7b25466a3b4cb32691f8 Mon Sep 17 00:00:00 2001 From: Fisch Date: Sat, 13 Mar 2021 15:46:43 +0100 Subject: [PATCH] moving up speed compensation for simulated speed --- src/main.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index e2a1e16..3daa273 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -94,6 +94,8 @@ struct blindmodel float speedfactorLow=1; //how much position units (mm) per second at pwm=100. speedfactorLow for position at 0 float speedfactorHigh=1; //speedfactorHigh for position at 1000 mm. gets extrapolated above + float speedfactor_factor_updirection=1; //when moving up, how much to change the estimated position change (speed). when going slower in up direction, choose value below 1.0 + int sense_clear_lower; //adc value lower limit for clear part. clear is around 70 int sense_clear_upper; //adc value upper limit for clear part @@ -210,8 +212,9 @@ void setup() { blind1.sense_end_upper=1024; blind1.speedfactorLow=28.7; blind1.speedfactorHigh=25.3; + blind1.speedfactor_factor_updirection=0.97; //down: 2306mm in 94s ,up: 97s blind1.start_first_clear=27; - blind1.simulated_acc_dec=-150; + blind1.simulated_acc_dec=-120; blind1.simulated_acc_inc=200; blind1.softlimit_min=0; blind1.softlimit_max=2500; @@ -228,8 +231,9 @@ void setup() { blind2.sense_end_upper=1024; blind2.speedfactorLow=27.6; blind2.speedfactorHigh=23.5; + blind2.speedfactor_factor_updirection=0.97; blind2.start_first_clear=27; - blind2.simulated_acc_dec=-150; + blind2.simulated_acc_dec=-120; blind2.simulated_acc_inc=200; blind2.softlimit_min=0; blind2.softlimit_max=2500; @@ -485,6 +489,9 @@ void errorCheck(blindmodel &blind, HomieNode &node) { void estimatePosition(blindmodel &blind, HomieNode& node) { float positional_speedfactor = blind.speedfactorLow + constrain(blind.position, blind.softlimit_min, blind.softlimit_max)*(blind.speedfactorHigh-blind.speedfactorLow)/POSITION_SPEEDMEASURE_HIGH; //interpolate/extrapolate speedfactor (speed is different when rolled up) + if (blind.speedSimulated<0) { //moving up + positional_speedfactor*=blind.speedfactor_factor_updirection; //used if speed for up direction is slower (likely when using dc motor) + } if (millis() > blind.last_calculate_position_estimate + CALCULATEPOSITIONESTIMATE_INTERVAL) { float _actualTime=(millis()-blind.last_calculate_position_estimate)/1000.0; //in seconds blind.speedSimulated+= constrain(blind.speed - blind.speedSimulated, blind.simulated_acc_dec*_actualTime, blind.simulated_acc_inc*_actualTime);