Other Parts Discussed in Thread: DRV8305
Tool/software: Code Composer Studio
Hi TI,
We are creating our custom speed controller using F28062F, DRV8305 and Instaspin FOC. We are very impressed with the FOC performance so far but we recently are frustrated with this issue which we still couldn't figure out after burning out more than a dozen of DRV and TMS.
Problem: At low speed (<2krpm), the motor only stalls at max current and recovered very quickly after the load is removed. However, at mid and high speed (>4krpm), the motor stalls for 2-3 seconds and starts screaming. At the same time, DRV nFault pin pulls low but no fault is reported via SPI. It is clear that the higher rpm motor spins, the more quickly the motor starts screaming. At 6krpm, the motor is very easy to stop and the drv fault is instantly triggered. The DRV and TMS finally browned out after a dozen of motor screaming.
Attempts:
1) We played with different PWM switching frequency (from 30khz to 45khz) and control loop frequency. It also seems that the higher the PWM frequency is, the lower motor speed at which the drv fault is triggered. This is counter-intuitive as we thought the higher frequency the better motor control is.
2) We beefed up the caps for charge pumps (high and low side) and PVDD for the DRV.
3) We also add diode on the current sense line past drv and adjust resistors values to have enough headroom for voltage spikes on ADC pins.
4) We also use staged PID for different speed ranges.
Here are our hardware and user setting:
Drive IC: DRV8305N
Shunts: 3mohm
Motor: hobby grade, KV900, target max speed 10800RPM
We have configured Vsense and Isense resistors and caps such that:
#define USER_IQ_FULL_SCALE_FREQ_Hz (1516.7)
#define USER_IQ_FULL_SCALE_VOLTAGE_V (17.0)
#define USER_ADC_FULL_SCALE_VOLTAGE_V (25.12)
#define USER_IQ_FULL_SCALE_CURRENT_A (56.0)
#define USER_ADC_FULL_SCALE_CURRENT_A (110.0)
#define USER_MOTOR_TYPE MOTOR_Type_Pm
#define USER_MOTOR_NUM_POLE_PAIRS (7)
#define USER_MOTOR_Rr (NULL)
#define USER_MOTOR_Rs (0.0336407572)
#define USER_MOTOR_Ls_d (7.04068543e-06)
#define USER_MOTOR_Ls_q (7.04068543e-06)
#define USER_MOTOR_RATED_FLUX (0.00615494233)
#define USER_MOTOR_MAGNETIZING_CURRENT (NULL)
#define USER_MOTOR_RES_EST_CURRENT (3.0)
#define USER_MOTOR_IND_EST_CURRENT (-3.0)
#define USER_MOTOR_MAX_CURRENT (40.0)
#define USER_MOTOR_FLUX_EST_FREQ_Hz (100.0)
#define USER_PWM_FREQ_kHz (30.0) // or 45.0
#define USER_NUM_PWM_TICKS_PER_ISR_TICK (3)
#define USER_NUM_ISR_TICKS_PER_CTRL_TICK (1)
#define USER_NUM_CTRL_TICKS_PER_CURRENT_TICK (1)
#define USER_NUM_CTRL_TICKS_PER_EST_TICK (1)
#define USER_NUM_CTRL_TICKS_PER_SPEED_TICK (10) // or 15
I would really appreciate some help from TI gurus as we are racing against the project deadlines now.
Thanks,
Xunjie