diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fcdbf73d..de10e85e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,12 +17,14 @@ jobs: with: flakes: nixpkgs#llvmPackages_18.clang-tools, nixpkgs#pre-commit - - name: Run clang-format - id: clang-format - run: pre-commit run --all-files --show-diff-on-failure --color always - - name: Build Package if: success() || (failure() && steps.clang-format.conclusion == 'failure') uses: ./.github/actions/build with: cache-auth-token: '${{ secrets.CACHIX_AUTH_TOKEN }}' + + - name: Upload refloat.vescpkg + uses: actions/upload-artifact@v4 + with: + name: refloat-package + path: refloat.vescpkg diff --git a/package_README.md b/package_README.md index c42e70cd..353eb806 100644 --- a/package_README.md +++ b/package_README.md @@ -2,6 +2,9 @@ A full-featured self-balancing skateboard package. +## Experiments +Playing with reverse stop config for anti ghosting protection + ## New in 1.2 - BMS alerting support (Pushback and Haptic) - Speed-based alerting (Pushback and Haptic) diff --git a/src/conf/datatypes.h b/src/conf/datatypes.h index a03c68a6..4d15defe 100644 --- a/src/conf/datatypes.h +++ b/src/conf/datatypes.h @@ -229,6 +229,9 @@ typedef struct { bool enable_quickstop; bool fault_darkride_enabled; bool fault_reversestop_enabled; + uint32_t reverse_tolerance; + uint16_t reverse_stop_trigger_erpm; + float reverse_erpm_incr; float tiltback_duty_angle; float tiltback_duty_speed; float tiltback_duty; diff --git a/src/conf/settings.xml b/src/conf/settings.xml index 5f747b10..19b91541 100644 --- a/src/conf/settings.xml +++ b/src/conf/settings.xml @@ -521,6 +521,69 @@ p, li { white-space: pre-wrap; } CFG_DFLT_FAULT_REVERSESTOP_ENABLED 0 + + Reverse Stop Tolerance + 2 + 1 + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Roboto'; ; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ERPM deadzone before Reverse Stop begins to slow the board. </p></body></html> + CFG_DFLT_REVERSE_TOLERANCE + 1 + 0 + 100000000 + 0 + 0 + 5000 + 400000 + ERPM + 5 + + + Reverse Stop Trigger ERPM + 2 + 1 + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Roboto'; ; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Minimum reverse speed to trigger Reverse Stop detection. The board must be moving backwards faster than this ERPM value before Reverse Stop can engage.</p></body></html> + CFG_DFLT_REVERSE_STOP_TRIGGER_ERPM + 1 + 0 + 65000 + 0 + 0 + 200 + 2000 + ERPM + 3 + + + Reverse Stop ERPM Increment + 1 + 1 + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Roboto'; ; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale factor used to convert aggregated ERPM over the reverse tolerance into a tiltback setpoint angle. Smaller values make the system less aggressive.</p></body></html> + CFG_DFLT_REVERSE_ERPM_INCR + 8 + 1 + 0 + 10 + 0 + 0 + 1e-05 + 8e-05 + 1 + + 9 + Pushback Angle 1 @@ -3944,6 +4007,9 @@ p, li { white-space: pre-wrap; } enable_quickstop fault_darkride_enabled fault_reversestop_enabled + reverse_tolerance + reverse_stop_trigger_erpm + reverse_erpm_incr tiltback_duty_angle tiltback_duty_speed tiltback_duty @@ -4204,6 +4270,9 @@ p, li { white-space: pre-wrap; } ::sep::Features fault_darkride_enabled fault_reversestop_enabled + reverse_tolerance + reverse_stop_trigger_erpm + reverse_erpm_incr diff --git a/src/data.h b/src/data.h index ac85839d..775caf27 100644 --- a/src/data.h +++ b/src/data.h @@ -121,6 +121,7 @@ typedef struct { // Feature: Reverse Stop float reverse_stop_step_size, reverse_tolerance, reverse_total_erpm; + float reverse_total_erpm_plot; time_t reverse_timer; // Feature: Soft Start diff --git a/src/main.c b/src/main.c index 5d997d20..14a91f1d 100644 --- a/src/main.c +++ b/src/main.c @@ -97,7 +97,6 @@ static void cmd_flywheel_toggle(Data *d, unsigned char *cfg, int len); const VESC_PIN beeper_pin = VESC_PIN_PPM; -#define REVSTOP_ERPM_INCR 0.00008 #define EXT_BEEPER_ON() VESC_IF->io_write(beeper_pin, 1) #define EXT_BEEPER_OFF() VESC_IF->io_write(beeper_pin, 0) @@ -205,8 +204,9 @@ static void configure(Data *d) { } // Feature: Reverse Stop - d->reverse_tolerance = 20000; + d->reverse_tolerance = d->float_conf.reverse_tolerance; d->reverse_stop_step_size = 100.0 / d->float_conf.hertz; + d->reverse_total_erpm_plot = d->reverse_total_erpm * 0.001f; // Speed above which to warn users about an impending full switch fault d->switch_warn_beep_erpm = d->float_conf.is_footbeep_enabled ? 2000 : 100000; @@ -518,28 +518,31 @@ static void calculate_setpoint_target(Data *d) { } else if (d->state.sat == SAT_REVERSESTOP) { // accumalete erpms: d->reverse_total_erpm += d->motor.erpm; - if (fabsf(d->reverse_total_erpm) > d->reverse_tolerance) { - // tilt down by 10 degrees after exceeding aggregate erpm - d->setpoint_target = - (fabsf(d->reverse_total_erpm) - d->reverse_tolerance) * REVSTOP_ERPM_INCR; - } else { + d->reverse_total_erpm_plot = d->reverse_total_erpm * 0.001f; + if (fabsf(d->reverse_total_erpm) > d->reverse_tolerance) { + // tilt down by 10 degrees after exceeding aggregate erpm + d->setpoint_target = + (fabsf(d->reverse_total_erpm) - d->reverse_tolerance) * + d->float_conf.reverse_erpm_incr; + } else { if (fabsf(d->reverse_total_erpm) <= d->reverse_tolerance * 0.5) { - if (d->motor.erpm >= 0) { + if (d->motor.erpm >= -(int) d->float_conf.reverse_stop_trigger_erpm) { d->state.sat = SAT_NONE; d->reverse_total_erpm = 0; d->setpoint_target = 0; } } } - } else if (d->float_conf.fault_reversestop_enabled && d->motor.erpm < -200 && + } else if (d->float_conf.fault_reversestop_enabled && d->motor.erpm < -(int)d->float_conf.reverse_stop_trigger_erpm && !d->state.darkride) { // Detecting reverse stop takes priority over any error condition SAT - if (d->state.sat >= SAT_PB_HIGH_VOLTAGE) { - // If this happens while in Error-Tiltback (LV/HV/TEMP) then we need to - // take the already existing setpoint into account - d->reverse_total_erpm = - -(d->reverse_tolerance + d->setpoint_target_interpolated / REVSTOP_ERPM_INCR); - } else { + if (d->state.sat >= SAT_PB_HIGH_VOLTAGE) { + // If this happens while in Error-Tiltback (LV/HV/TEMP) then we need to + // take the already existing setpoint into account + d->reverse_total_erpm = -(d->reverse_tolerance + + d->setpoint_target_interpolated / + d->float_conf.reverse_erpm_incr); + } else { d->reverse_total_erpm = 0; } d->state.sat = SAT_REVERSESTOP; diff --git a/src/rt_data.h b/src/rt_data.h index 2e9a6bbb..428a4953 100644 --- a/src/rt_data.h +++ b/src/rt_data.h @@ -61,6 +61,8 @@ S(turn_tilt.setpoint) \ S(remote.setpoint) \ R(balance_current) \ + R(reverse_total_erpm_plot) \ + R(reverse_timer) \ S(atr.accel_diff) \ S(atr.speed_boost) \ S(booster.current) diff --git a/ui.qml.in b/ui.qml.in index cce22d8a..b73a3465 100644 --- a/ui.qml.in +++ b/ui.qml.in @@ -2143,6 +2143,8 @@ Item { ["footpad.adc1", {"name": "ADC1 Voltage", "color": "#69aad7", "visible": false}], ["footpad.adc2", {"name": "ADC2 Voltage", "color": "#4a8772", "visible": false}], ["balance_current", {"name": "Balance Current", "color": "#36738b", "visible": false}], + ["reverse_total_erpm_plot", {"name": "Reverse Total ERPM (k)", "color": "#748b36", "visible": false}], + ["reverse_timer", {"name": "Reverse Timer", "color": "#368b5c", "visible": false}], ["booster.current", {"name": "Booster Current", "color": "#8f2f26", "visible": false}], ["atr.accel_diff", {"name": "ATR Accel Diff", "color": "#4f5984", "visible": false}], ["atr.speed_boost", {"name": "ATR Speed Boost", "color": "#34633c", "visible": false}], diff --git a/version b/version index 0495c4a8..e8ea05db 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.2.3 +1.2.4