This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C2000WARE-MOTORCONTROL-SDK: Issue with Hall Sensor-Based BLDC Control in Universal MotorControl Lab

Part Number: C2000WARE-MOTORCONTROL-SDK
Other Parts Discussed in Thread: BOOSTXL-DRV8323RH

Hello,
I’m currently testing our custom BLDC motor using TI’s Universal MotorControl Lab, and I’m encountering an issue with Hall sensor-based control.

The hardware in use is LAUNCHXL-F280039 and BOOSTXL-DRV8323RH.
At Build Level 4, when driving the BLDC with Hall sensors, the motor intermittently stops once it reaches speeds above 50 Hz.

Additionally, when issuing a 0 Hz speed command, the controller becomes unstable and diverges.

Motor tuning has been completed, and under exactly the same conditions, when using FAST, there are no issues at all.
The Hall sensor signals have also been verified as normal, and with other Hall sensor-based solutions (e.g., ST), there were no problems during operation.

Hall sensors A, B, and C are connected to Launchpad pins 2I, 2B, and 2A, respectively.
It has been confirmed that phases B and C are delayed by 120° and 240° relative to phase A.

I also attempted Hall sensor calibration using HALL_CAL, but it made little difference.

Do you happen to know what might be causing this issue?
Below are the main parameters of the motor and controller, as well as the Hall sensor tuning results.Motor_Controller_Params.png

// in user_mtr1.h
...
#elif (USER_MOTOR1 == my_pm_motor_1)
// Custom BLDC motor definition
#define USER_MOTOR1_TYPE                   MOTOR_TYPE_PM
#define USER_MOTOR1_NUM_POLE_PAIRS         (10)
#define USER_MOTOR1_Rr_Ohm                 (0.0f)
#define USER_MOTOR1_Rs_Ohm                 (0.152819753f)
#define USER_MOTOR1_Ls_d_H                 (0.000289398682f)
#define USER_MOTOR1_Ls_q_H                 (0.000289398682f)
#define USER_MOTOR1_RATED_FLUX_VpHz        (0.041582156f)
#define USER_MOTOR1_MAGNETIZING_CURRENT_A  (NULL)
#define USER_MOTOR1_RES_EST_CURRENT_A      (2.0f)
#define USER_MOTOR1_IND_EST_CURRENT_A      (-1.5f)
#define USER_MOTOR1_MAX_CURRENT_A          (6.72f)
#define USER_MOTOR1_FLUX_EXC_FREQ_Hz       (40.0f)

// Number of lines on the motor's quadrature encoder
#define USER_MOTOR1_NUM_ENC_SLOTS          (NULL)

#define USER_MOTOR1_INERTIA_Kgm2           (240e-07)

// Ls compensation coefficient
#define USER_MOTOR1_Ls_d_COMP_COEF         (0.15f)          // 0.0f~0.5f
#define USER_MOTOR1_Ls_q_COMP_COEF         (0.35f)          // 0.0f~0.5f
#define USER_MOTOR1_Ls_MIN_NUM_COEF        (0.55f)          // 0.5f~1.0f

#define USER_MOTOR1_FREQ_NEARZEROLIMIT_Hz  (0.1f)          // Hz

#define USER_MOTOR1_RATED_VOLTAGE_V        (24.0f)
#define USER_MOTOR1_FREQ_MIN_Hz            (1.0f)          // Hz
#define USER_MOTOR1_FREQ_MAX_Hz            (200.0f)         // Hz

#define USER_MOTOR1_FREQ_LOW_Hz            (5.0f)            // Hz
#define USER_MOTOR1_FREQ_HIGH_Hz           (200.0f)            // Hz
#define USER_MOTOR1_VOLT_MIN_V             (1.0f)            // Volt
#define USER_MOTOR1_VOLT_MAX_V             (24.0f)           // Volt

#define USER_MOTOR1_FORCE_DELTA_A          (0.1f)          // A
#define USER_MOTOR1_ALIGN_DELTA_A          (0.1f)          // A
#define USER_MOTOR1_FLUX_CURRENT_A         (0.5f)           // A
#define USER_MOTOR1_ALIGN_CURRENT_A        (5.5f)           // A
#define USER_MOTOR1_STARTUP_CURRENT_A      (5.5f)           // A, 3.5A default
#define USER_MOTOR1_TORQUE_CURRENT_A       (5.5f)           // A
#define USER_MOTOR1_OVER_CURRENT_A         (10.0f)          // A

#define USER_MOTOR1_BRAKE_CURRENT_A        (1.0f)           // A
#define USER_MOTOR1_BRAKE_TIME_DELAY       (12000U)        // 60s/5ms

#define USER_MOTOR1_SPEED_START_Hz         (80.0f)
#define USER_MOTOR1_SPEED_FORCE_Hz         (80.0f)
#define USER_MOTOR1_ACCEL_START_Hzps       (60.0f)
#define USER_MOTOR1_ACCEL_MAX_Hzps         (60.0f)

#define USER_MOTOR1_SPEED_FS_Hz            (3.0f)

// only for encoder
#define USER_MOTOR1_ENC_POS_MAX            (USER_MOTOR1_NUM_ENC_SLOTS * 4 - 1)
#define USER_MOTOR1_ENC_POS_OFFSET         (668)

// Only for eSMO
#define USER_MOTOR1_KSLIDE_MAX             (0.75f)      //
#define USER_MOTOR1_KSLIDE_MIN             (0.15f)

#define USER_MOTOR1_PLL_KP_MAX             (6.75f)      //
#define USER_MOTOR1_PLL_KP_MIN             (0.75f)
#define USER_MOTOR1_PLL_KP_SF              (5.0f)
#define USER_MOTOR1_PLL_KI                 (2.8125E-06f)    // Not used, reserve

#define USER_MOTOR1_BEMF_THRESHOLD         (0.5f)
#define USER_MOTOR1_BEMF_KSLF_FC_SF        (1.0f)
#define USER_MOTOR1_THETA_OFFSET_SF        (1.0f)
#define USER_MOTOR1_SPEED_LPF_FC_Hz        (200.0f)

// for IS-BLDC
#define USER_MOTOR1_RAMP_START_Hz           (3.0f)
#define USER_MOTOR1_RAMP_END_Hz             (30.0f)
#define USER_MOTOR1_RAMP_DELAY              (5)

#define USER_MOTOR1_ISBLDC_INT_MAX          (0.015f)
#define USER_MOTOR1_ISBLDC_INT_MIN          (0.010f)

// for Rs online calibration
#define USER_MOTOR1_RSONLINE_WAIT_TIME      (60000U)    // 5min/300s at 5ms base
#define USER_MOTOR1_RSONLINE_WORK_TIME      (24000U)     //2min/120s at 5ms base

// Current and Speed PI Regulators Tuning Coefficient
#define USER_MOTOR1_GAIN_SPEED_LOW_Hz        (60.0f)
#define USER_MOTOR1_GAIN_SPEED_HIGH_Hz       (150.0f)

#define USER_MOTOR1_KP_SPD_START_SF          (1.5f)       // 0.1~100.0
#define USER_MOTOR1_KI_SPD_START_SF          (1.5f)       // 0.1~10.0

#define USER_MOTOR1_KP_SPD_LOW_SF            (2.0f)       // 0.1~100.0
#define USER_MOTOR1_KI_SPD_LOW_SF            (2.0f)       // 0.1~10.0

#define USER_MOTOR1_KP_SPD_HIGH_SF           (1.0f)       // 0.1~100.0
#define USER_MOTOR1_KI_SPD_HIGH_SF           (1.0f)       // 0.1~10.0

#define USER_MOTOR1_GAIN_IQ_LOW_A            (2.0f)
#define USER_MOTOR1_GAIN_IQ_HIGH_A           (6.0f)

#define USER_MOTOR1_KP_IQ_START_SF           (1.5f)       // 0.1~10.0
#define USER_MOTOR1_KI_IQ_START_SF           (1.5f)       // 0.1~10.0

#define USER_MOTOR1_KP_IQ_LOW_SF             (2.0f)       // 0.1~10.0
#define USER_MOTOR1_KI_IQ_LOW_SF             (2.0f)       // 0.1~10.0

#define USER_MOTOR1_KP_IQ_HIGH_SF            (1.0f)       // 0.1~10.0
#define USER_MOTOR1_KI_IQ_HIGH_SF            (1.0f)       // 0.1~10.0

#define USER_MOTOR1_KP_ID_SF                 (1.0f)       // 0.1~10.0
#define USER_MOTOR1_KI_ID_SF                 (1.0f)       // 0.1~10.0

#if defined(MOTOR1_HALL)
// Only for hall sensor
#define USER_MOTOR1_HALL_DELTA_rad          (MATH_TWO_PI / 36.0f)   // rad
#endif  // MOTOR1_HALL
...
// in motor1_drive.c
...
#elif (USER_MOTOR1 == my_pm_motor_1)
const float32_t hallAngleBuf[7] = { 1.69277406f,  -1.43675756f, 2.70116997f, \
                                    -2.49598646f, 0.615839601f , -0.410627186f,
                                    1.69277406f };
...

Thanks in advance!