@@ -87,6 +87,7 @@ static void cmd_flywheel_toggle(Data *d, unsigned char *cfg, int len);
8787
8888const VESC_PIN beeper_pin = VESC_PIN_PPM ;
8989
90+ #define REVSTOP_ERPM_INCR 0.00008
9091#define EXT_BEEPER_ON () VESC_IF->io_write(beeper_pin, 1)
9192#define EXT_BEEPER_OFF () VESC_IF->io_write(beeper_pin, 0)
9293
@@ -508,7 +509,7 @@ static void calculate_setpoint_target(Data *d) {
508509 if (fabsf (d -> reverse_total_erpm ) > d -> reverse_tolerance ) {
509510 // tilt down by 10 degrees after exceeding aggregate erpm
510511 d -> setpoint_target =
511- 10 * (fabsf (d -> reverse_total_erpm ) - d -> reverse_tolerance ) * 0.000008 ;
512+ (fabsf (d -> reverse_total_erpm ) - d -> reverse_tolerance ) * REVSTOP_ERPM_INCR ;
512513 } else {
513514 if (fabsf (d -> reverse_total_erpm ) <= d -> reverse_tolerance * 0.5 ) {
514515 if (d -> motor .erpm >= 0 ) {
@@ -519,6 +520,18 @@ static void calculate_setpoint_target(Data *d) {
519520 }
520521 }
521522 }
523+ } else if (d -> float_conf .fault_reversestop_enabled && d -> motor .erpm < -200 && !d -> state .darkride ) {
524+ // Detecting reverse stop takes priority over any error condition SAT
525+ if (d -> state .sat >= SAT_PB_HIGH_VOLTAGE ) {
526+ // If this happens while in Error-Tiltback (LV/HV/TEMP) then we need to
527+ // take the already existing setpoint into account
528+ d -> reverse_total_erpm =
529+ -1 * (d -> reverse_tolerance + d -> setpoint_target_interpolated / REVSTOP_ERPM_INCR );
530+ } else {
531+ d -> reverse_total_erpm = 0 ;
532+ }
533+ d -> state .sat = SAT_REVERSESTOP ;
534+ timer_refresh (& d -> time , & d -> reverse_timer );
522535 } else if (d -> state .mode != MODE_FLYWHEEL &&
523536 // not normal, either wheelslip or wheel getting stuck
524537 fabsf (d -> motor .acceleration ) > 15 &&
@@ -545,12 +558,6 @@ static void calculate_setpoint_target(Data *d) {
545558 d -> state .wheelslip = false;
546559 }
547560 }
548- if (d -> float_conf .fault_reversestop_enabled && (d -> motor .erpm < 0 )) {
549- // the lingering wheelslip timer can cause us to blow past the reverse stop condition!
550- d -> state .sat = SAT_REVERSESTOP ;
551- timer_refresh (& d -> time , & d -> reverse_timer );
552- d -> reverse_total_erpm = 0 ;
553- }
554561 } else if (d -> motor .duty_cycle > d -> float_conf .tiltback_duty ) {
555562 if (d -> motor .erpm > 0 ) {
556563 d -> setpoint_target = d -> float_conf .tiltback_duty_angle ;
@@ -638,13 +645,7 @@ static void calculate_setpoint_target(Data *d) {
638645 }
639646 } else {
640647 // Normal running
641- if (d -> float_conf .fault_reversestop_enabled && d -> motor .erpm < -200 && !d -> state .darkride ) {
642- d -> state .sat = SAT_REVERSESTOP ;
643- timer_refresh (& d -> time , & d -> reverse_timer );
644- d -> reverse_total_erpm = 0 ;
645- } else {
646- d -> state .sat = SAT_NONE ;
647- }
648+ d -> state .sat = SAT_NONE ;
648649 d -> setpoint_target = 0 ;
649650 }
650651
0 commit comments