Added hall sensor rate limiter again, now based on the hall toggle rate as in 6.02

This commit is contained in:
Benjamin Vedder 2024-05-15 13:24:04 +02:00
parent 3bd1c660a3
commit 4499982f99
3 changed files with 18 additions and 2 deletions

View File

@ -550,6 +550,7 @@ float foc_correct_hall(float angle, float dt, motor_all_state_t *motor, int hall
float rad_per_sec = motor->m_speed_est_fast_corrected;
float rpm_abs = fabsf(RADPS2RPM_f(motor->m_pll_speed));
float rpm_abs_hall = fabsf(RADPS2RPM_f((M_PI / 3.0) / motor->m_hall_dt_diff_last));
motor->m_using_hall = rpm_abs < conf_now->foc_sl_erpm;
float angle_old = angle;
@ -603,8 +604,22 @@ float foc_correct_hall(float angle, float dt, motor_all_state_t *motor, int hall
}
}
utils_norm_angle_rad((float*)&motor->m_ang_hall);
// Limit hall sensor rate of change. This will reduce current spikes in the current controllers when the angle estimation
// changes fast.
float angle_step = (fmaxf(rpm_abs_hall, conf_now->foc_hall_interp_erpm) / 60.0) * 2.0 * M_PI * dt * 1.5;
float angle_diff = utils_angle_difference_rad(motor->m_ang_hall, motor->m_ang_hall_rate_limited);
if (fabsf(angle_diff) < angle_step) {
motor->m_ang_hall_rate_limited = motor->m_ang_hall;
} else {
motor->m_ang_hall_rate_limited += angle_step * SIGN(angle_diff);
}
utils_norm_angle_rad((float*)&motor->m_ang_hall_rate_limited);
if (motor->m_using_hall) {
angle = motor->m_ang_hall;
angle = motor->m_ang_hall_rate_limited;
}
} else {
// Invalid hall reading. Don't update angle.

View File

@ -215,6 +215,7 @@ typedef struct {
int m_ang_hall_int_prev;
bool m_using_hall;
float m_ang_hall;
float m_ang_hall_rate_limited;
float m_hall_dt_diff_last;
float m_hall_dt_diff_now;
bool m_motor_released;

View File

@ -1390,7 +1390,7 @@ float mcpwm_foc_get_phase_encoder(void) {
}
float mcpwm_foc_get_phase_hall(void) {
float angle = RAD2DEG_f(get_motor_now()->m_ang_hall);
float angle = RAD2DEG_f(get_motor_now()->m_ang_hall_rate_limited);
utils_norm_angle(&angle);
return angle;
}