Skip to content

Commit caaa497

Browse files
committed
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 3497681 commit caaa497

1 file changed

Lines changed: 15 additions & 14 deletions

File tree

src/main.c

Lines changed: 15 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

@@ -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

Comments
 (0)