From 901c46af345afb84d031ceff853a7ace94804375 Mon Sep 17 00:00:00 2001 From: Fisch Date: Tue, 17 Dec 2019 23:12:58 +0100 Subject: [PATCH] add slower rate for braking --- controller/controller.ino | 8 +++++++- other/filtertest/filtertest.pde | 31 +++++++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/controller/controller.ino b/controller/controller.ino index 028895e..0b3afe3 100644 --- a/controller/controller.ino +++ b/controller/controller.ino @@ -57,6 +57,7 @@ long loopmillis=0; //only use one millis reading each loop long last_looptime=0; //for looptiming #define LOOPTIME 10 //how often the loop(s) should run long millis_lastchange=0; //for poweroff after some time with no movement +#define MAXBRAKERATE 7 //maximum rate for braking (loop timing) String errormessage=""; //store some error message to print @@ -66,7 +67,7 @@ long state_modechange_time=0; long millis_lastadc=0; #define ADC_READTIME 10 //time interval to read adc (for filtering) -#define ADC_THROTTLE_FILTER 0.05 //low value = slower change +#define ADC_THROTTLE_FILTER 0.2 //low value = slower change int adc_throttle_raw=0; //raw throttle value from adc float adc_throttle=0; //filtered value @@ -449,6 +450,11 @@ void loop_idle() { void loop_on() { int16_t speedvalue=constrain( map(adc_throttle, ADC_CALIB_THROTTLE_MIN, ADC_CALIB_THROTTLE_MAX, 0, 1000 ) ,0, 1000); + int16_t lastSpeed=(out_speedFL+out_speedFR+out_speedRL+out_speedRR)/4; + + if (speedvalue<=lastSpeed) { //braking + speedvalue = (lastSpeed-speedvalue)>MAXBRAKERATE ? (lastSpeed-MAXBRAKERATE):speedvalue; + } out_speedFL=speedvalue; out_speedFR=speedvalue; diff --git a/other/filtertest/filtertest.pde b/other/filtertest/filtertest.pde index 831c103..a47419c 100644 --- a/other/filtertest/filtertest.pde +++ b/other/filtertest/filtertest.pde @@ -12,12 +12,17 @@ long lastReadADC=0; long lastSend=0; long lastHBLoop=0; +int LOOPTIME_CONTROLLER=10; //controller looptime +long lastLoopController=0; int ADC_CALIB_THROTTLE_MIN=2000; //controller int ADC_CALIB_THROTTLE_MAX=3120; //controller int ADC_READTIME=10; //controller. in ms int adc_throttle_raw=ADC_CALIB_THROTTLE_MIN; //controller. raw value read from adc (here slider) float adc_throttle=adc_throttle_raw; //controller. internally filtered value -float ADC_THROTTLE_FILTER=0.05; //controller +float ADC_THROTTLE_FILTER=0.2; //controller + +int speedvalue=0; +int MAXBRAKERATE=7; //Controller int SENDPERIOD=50; //controller. in ms int sendSpeed=0; //transmittet speed value over usart @@ -30,6 +35,7 @@ int outSpeed=0; //hoverboard. speedvalue for pwm. filtered speedRate Slider SinputValue; Slider SfilteredInputValue; +Slider SspeedValue; Slider SspeedRate; Slider SoutSpeed; @@ -62,14 +68,20 @@ void setup() { .setRange(ADC_CALIB_THROTTLE_MIN,ADC_CALIB_THROTTLE_MAX) ; - SspeedRate=cp5.addSlider("speedRate") + SspeedValue=cp5.addSlider("speedValue") //after brake slowing .setPosition(10,50+30+10+20+10) .setSize(500,20) .setRange(0,1000) ; + SspeedRate=cp5.addSlider("speedRate") + .setPosition(10,50+30+10+20+10+20+10) + .setSize(500,20) + .setRange(0,1000) + ; + SoutSpeed=cp5.addSlider("outSpeed") - .setPosition(1,50+30+10+20+10+20+10) + .setPosition(1,50+30+10+20+10+20+10+20+10) .setSize(500,30) .setRange(0,1000) ; @@ -152,9 +164,20 @@ void draw() { adc_throttle = adc_throttle*(1-ADC_THROTTLE_FILTER) + adc_throttle_raw*ADC_THROTTLE_FILTER; //adc_throttle = adc_throttle*(1-ADC_THROTTLE_FILTER) + adc_throttle_raw*ADC_THROTTLE_FILTER; SfilteredInputValue.setValue(adc_throttle); } + if (loopmillis-lastLoopController>LOOPTIME_CONTROLLER){ //frequency of controller LOOPTIME + lastLoopController=millis(); + int lastSpeed=speedvalue; + speedvalue=int(constrain( map(adc_throttle, ADC_CALIB_THROTTLE_MIN, ADC_CALIB_THROTTLE_MAX, 0, 1000 ) ,0, 1000)); + + if (speedvalue<=lastSpeed) { //braking + speedvalue = (lastSpeed-speedvalue)>MAXBRAKERATE ? (lastSpeed-MAXBRAKERATE):speedvalue; + } + SspeedValue.setValue(speedvalue); + } + if (loopmillis-lastSend>SENDPERIOD){ //Frequency of transmitting new values to the hoverboard lastSend=millis(); - sendSpeed=int(constrain( map(adc_throttle, ADC_CALIB_THROTTLE_MIN, ADC_CALIB_THROTTLE_MAX, 0, 1000 ) ,0, 1000)); + sendSpeed=speedvalue; } if (loopmillis-lastHBLoop>LOOPTIME){ //frequency of hoverboard mainboard (looptime)