Skip to content

Commit cb5050a

Browse files
surfdadodavorinmista
authored andcommitted
Reverse-Stop + Error Pushback corner case fixed
Reverse stop detection now takes precendence over error condition detection, aka wheelslip or pushback. Also, if we get error pushback (HV/LV/Temp) and then try to stop we need to take the already tilted nose into account to avoid briefly releveling the board. Fix: don't ignore reverse-stop during error pushback situations
1 parent fe28ee2 commit cb5050a

1 file changed

Lines changed: 16 additions & 14 deletions

File tree

src/main.c

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ static void cmd_flywheel_toggle(Data *d, unsigned char *cfg, int len);
8787

8888
const 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

Comments
 (0)