Added fault code for invalid phase filter readings

This commit is contained in:
Benjamin Vedder 2022-04-06 21:08:48 +02:00
parent c5ff492f4b
commit 756ccbc5ba
4 changed files with 11 additions and 3 deletions

View File

@ -24,7 +24,7 @@
#define FW_VERSION_MAJOR 6
#define FW_VERSION_MINOR 00
// Set to 0 for building a release and iterate during beta test builds
#define FW_TEST_VERSION_NUMBER 35
#define FW_TEST_VERSION_NUMBER 36
#include "datatypes.h"

View File

@ -149,7 +149,8 @@ typedef enum {
FAULT_CODE_FLASH_CORRUPTION_APP_CFG,
FAULT_CODE_FLASH_CORRUPTION_MC_CFG,
FAULT_CODE_ENCODER_NO_MAGNET,
FAULT_CODE_ENCODER_MAGNET_TOO_STRONG
FAULT_CODE_ENCODER_MAGNET_TOO_STRONG,
FAULT_CODE_PHASE_FILTER,
} mc_fault_code;
typedef enum {

View File

@ -477,6 +477,7 @@ const char* mc_interface_fault_to_string(mc_fault_code fault) {
case FAULT_CODE_RESOLVER_LOS: return "FAULT_CODE_RESOLVER_LOS";
case FAULT_CODE_ENCODER_NO_MAGNET: return "FAULT_CODE_ENCODER_NO_MAGNET";
case FAULT_CODE_ENCODER_MAGNET_TOO_STRONG: return "FAULT_CODE_ENCODER_MAGNET_TOO_STRONG";
case FAULT_CODE_PHASE_FILTER: return "FAULT_CODE_PHASE_FILTER";
}
return "Unknown fault";

View File

@ -4154,9 +4154,15 @@ static void update_valpha_vbeta(motor_all_state_t *motor, float mod_alpha, float
if (motor->m_state == MC_STATE_RUNNING) {
#ifdef HW_HAS_PHASE_FILTERS
if (conf_now->foc_phase_filter_enable && abs_rpm < conf_now->foc_phase_filter_max_erpm) {
float mod_mag = NORM2_f(mod_alpha, mod_beta);
float v_mag_mod = mod_mag * (2.0 / 3.0) * state_m->v_bus;
if (fabsf(v_mag_mod - state_m->v_mag_filter) > (conf_now->l_max_vin * 0.08)) {
mc_interface_fault_stop(FAULT_CODE_PHASE_FILTER, &m_motor_1 != motor, true);
}
// Compensate for the phase delay by using the direction of the modulation
// together with the magnitude from the phase filters
float mod_mag = NORM2_f(mod_alpha, mod_beta);
if (mod_mag > 0.04) {
state_m->v_alpha = mod_alpha / mod_mag * state_m->v_mag_filter;
state_m->v_beta = mod_beta / mod_mag * state_m->v_mag_filter;