@@ -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
@@ -510,7 +511,7 @@ static void calculate_setpoint_target(Data *d) {
510511 if (fabsf (d -> reverse_total_erpm ) > d -> reverse_tolerance ) {
511512 // tilt down by 10 degrees after exceeding aggregate erpm
512513 d -> setpoint_target =
513- 10 * (fabsf (d -> reverse_total_erpm ) - d -> reverse_tolerance ) * 0.000008 ;
514+ (fabsf (d -> reverse_total_erpm ) - d -> reverse_tolerance ) * REVSTOP_ERPM_INCR ;
514515 } else {
515516 if (fabsf (d -> reverse_total_erpm ) <= d -> reverse_tolerance * 0.5 ) {
516517 if (d -> motor .erpm >= 0 ) {
@@ -521,6 +522,19 @@ static void calculate_setpoint_target(Data *d) {
521522 }
522523 }
523524 }
525+ } else if (d -> float_conf .fault_reversestop_enabled && d -> motor .erpm < -200 &&
526+ !d -> state .darkride ) {
527+ // Detecting reverse stop takes priority over any error condition SAT
528+ if (d -> state .sat >= SAT_PB_HIGH_VOLTAGE ) {
529+ // If this happens while in Error-Tiltback (LV/HV/TEMP) then we need to
530+ // take the already existing setpoint into account
531+ d -> reverse_total_erpm =
532+ - (d -> reverse_tolerance + d -> setpoint_target_interpolated / REVSTOP_ERPM_INCR );
533+ } else {
534+ d -> reverse_total_erpm = 0 ;
535+ }
536+ d -> state .sat = SAT_REVERSESTOP ;
537+ timer_refresh (& d -> time , & d -> reverse_timer );
524538 } else if (d -> state .mode != MODE_FLYWHEEL &&
525539 // not normal, either wheelslip or wheel getting stuck
526540 fabsf (d -> motor .acceleration ) > 15 &&
@@ -547,12 +561,6 @@ static void calculate_setpoint_target(Data *d) {
547561 d -> state .wheelslip = false;
548562 }
549563 }
550- if (d -> float_conf .fault_reversestop_enabled && (d -> motor .erpm < 0 )) {
551- // the lingering wheelslip timer can cause us to blow past the reverse stop condition!
552- d -> state .sat = SAT_REVERSESTOP ;
553- timer_refresh (& d -> time , & d -> reverse_timer );
554- d -> reverse_total_erpm = 0 ;
555- }
556564 } else if (d -> motor .duty_cycle > d -> float_conf .tiltback_duty ) {
557565 if (d -> motor .erpm > 0 ) {
558566 d -> setpoint_target = d -> float_conf .tiltback_duty_angle ;
@@ -640,13 +648,7 @@ static void calculate_setpoint_target(Data *d) {
640648 }
641649 } else {
642650 // Normal running
643- if (d -> float_conf .fault_reversestop_enabled && d -> motor .erpm < -200 && !d -> state .darkride ) {
644- d -> state .sat = SAT_REVERSESTOP ;
645- timer_refresh (& d -> time , & d -> reverse_timer );
646- d -> reverse_total_erpm = 0 ;
647- } else {
648- d -> state .sat = SAT_NONE ;
649- }
651+ d -> state .sat = SAT_NONE ;
650652 d -> setpoint_target = 0 ;
651653 }
652654
0 commit comments