Hello,
I'm working with an MCT8316A driver controlled by a PIC32MM microcontroller over I2C.
The driver is connected to a 3-phase brushless motor that drives a tattoo machine. There is a mechanism that converts the rotating movement of the motor to a linear movement, which will finally make the needle to back and forth.
The particularity of this load (the linear actuator) is that it's very hard to make it start. The motor must apply a significant force at the beginning. But when the motor is running, the power requirement decreases significantly.
First, I tuned my MCT8316A for the motor without any load, being able to make it start pretty fast. These are the configurations that I used for the motor without load:
static const config_t open_loop_ultra_slow_start_config2[] = { {ISD_CONFIG_ADDR, 0x6EC4C100}, /** * MOTOR_STARTUP1_ADDR: * * -> MTR_STARTUP = 1h = Double Align * -> ALIGN_RAMP_RATE = 7h = 10 V/s [Align voltage ramp rate] **** -> ALIGN_TIME = 3h = 50 ms * -> ALIGN_CURR_THR = 4h = 0.4 V [Align current threshold (Align current threshold (A) = ALIGN_CURR_THR / CSA_GAIN)] = 2.66A (with CSA 0.15 A/V) * -> IPD_CLK_FREQ = 2h = 250 Hz * -> IPD_CURR_THR = 4h = 0.4 V [IPD current threshold (IPD current threshold (A) = IPD_CURR_THR / CSA_GAIN)] = 2.6A (with CSA 0.15 A/V) * -> IPD_RLS_MODE = 1h = Tristate [IPD release mode] * -> IPD_ADV_ANGLE = 2h = 60° [IPD advance angle] * -> IPD_REPEAT = 1h = average of 2 times [Number of times IPD is executed] * -> SLOW_FIRST_CYC_FREQ = 2h = 0.25 Hz [Frequency of first cycle] */ {MOTOR_STARTUP1_ADDR, 0x2E689192}, /** * MOTOR_STARTUP2_ADDR: * * -> OL_ILIMIT_CONFIG = 0h = Open loop current limit defined by OL_ILIMIT * -> OL_DUTY = 3h = 25% [Duty cycle limit during open loop] * -> OL_ILIMIT = 4h = 0.4 V [Open loop current limit (OL current threshold (A) = OL_CURR_THR / CSA_GAIN)] = 2.6A (with CSA 0.15 A/V) **** -> OL_ACC_A1 = 18h = 200 Hz/s [Open loop acceleration A1] **** -> OL_ACC_A2 = 18h = 200 Hz/s2 [Open loop acceleration A2] * -> OPN_CL_HANDOFF_THR = 19h = 300 Hz [Open to closed loop handoff threshold] * -> AUTO_HANDOFF = 1h = Enable Auto Handoff * -> FIRST_CYCLE_FREQ_SEL = 0h = Defined by SLOW_FIRST_CYC_FREQ * -> MIN_DUTY = 4h = 5 % [Min operational duty cycle] */ {MOTOR_STARTUP2_ADDR, 0x1A631990}, /** * CLOSED_LOOP1_ADDR: * * -> COMM_CONTROL = 0h = 120° Commutation [Trapezoidal commutation mode] * -> CL_ACC = 8h = 2.5 V/s [Closed loop acceleration rate] * -> CL_DEC_CONFIG = 0h = Close loop deceleration defined by CL_DEC [Closed loop decel configuration] * -> CL_DEC = 8h = 2.5 V/s [Closed loop deceleration rate] * -> PWM_FREQ_OUT = 10h = 25 kHz [Output PWM switching frequency] * -> PWM_MODUL = 0h = High-Side Modulation * -> PWM_MODE = 0h = Single Ended Mode * -> LD_ANGLE_POLARITY = 1h = Positive [Polarity of applied lead angle] * -> LD_ANGLE = 0h = Lead Angle {Lead Angle (deg) = LD_ANGLE * 0.12} */ {CLOSED_LOOP1_ADDR, 0x08220200}, {CLOSED_LOOP2_ADDR, 0x02A6E4B0}, {CLOSED_LOOP3_ADDR, 0x4CC40100}, {CLOSED_LOOP4_ADDR, 0x000CE944}, /** * CONST_SPEED_ADDR: * * -> SPD_POWER_KP = 64h = 100 [Speed/ Power loop Kp (Kp = SPD_LOOP_KP / 10000)] * -> SPD_POWER_KI = 32h = 50 [Speed/ Power loop Ki (Ki = SPD_LOOP_KI / 1000000) * -> SPD_POWER_V_MAX = 0h = 100 % [Upper saturation limit for speed/ power loop] * -> SPD_POWER_V_MIN = 4h = 10 % [Lower saturation limit for speed/power loop] * -> CLOSED_LOOP_MODE = 1h = Speed Loop */ {CONST_SPEED_ADDR, 0x06403211}, {CONST_PWR_ADDR, 0x5DC04C84}, {_150_DEG_TWO_PH_PROFILE_ADDR, 0x36DB6DA6}, {_150_DEG_THREE_PH_PROFILE_ADDR, 0x36DB6D80}, {TRAP_CONFIG1_ADDR, 0x054BA106}, {TRAP_CONFIG2_ADDR, 0x62880000}, {FAULT_CONFIG1_ADDR, 0x78F43025}, {FAULT_CONFIG2_ADDR, 0x7447A009}, {GD_CONFIG1_ADDR, 0x1C440000}, {GD_CONFIG2_ADDR, 0x14000000}, {PIN_CONFIG1_ADDR, 0x2D720604}, {PIN_CONFIG2_ADDR, 0x080C0000}, {DEVICE_CONFIG_ADDR, 0x7FFF0000}, };
Then, I connected the motor to the load and repeated the test. The motor was unable to start. Supposing that the problem was the difficulty of making the motor start, I changed the configurations to the following ones:
static const config_t open_loop_ultra_slow_start_config2[] = { {ISD_CONFIG_ADDR, 0x6EC4C100}, /** * MOTOR_STARTUP1_ADDR: * * -> MTR_STARTUP = 1h = Double Align * -> ALIGN_RAMP_RATE = 7h = 10 V/s [Align voltage ramp rate] **** -> ALIGN_TIME = Ah = 1 s * -> ALIGN_CURR_THR = Ah = 1 V [Align current threshold (Align current threshold (A) = ALIGN_CURR_THR / CSA_GAIN)] = 6.6A (with CSA 0.15 A/V) * -> IPD_CLK_FREQ = 2h = 250 Hz * -> IPD_CURR_THR = Ah = 1 V [IPD current threshold (IPD current threshold (A) = IPD_CURR_THR / CSA_GAIN)] = 6.6A (with CSA 0.15 A/V) * -> IPD_RLS_MODE = 1h = Tristate [IPD release mode] * -> IPD_ADV_ANGLE = 2h = 60° [IPD advance angle] * -> IPD_REPEAT = 1h = average of 2 times [Number of times IPD is executed] * -> SLOW_FIRST_CYC_FREQ = 2h = 0.25 Hz [Frequency of first cycle] */ {MOTOR_STARTUP1_ADDR, 0x2F54A992}, /** * MOTOR_STARTUP2_ADDR: * * -> OL_ILIMIT_CONFIG = 0h = Open loop current limit defined by OL_ILIMIT * -> OL_DUTY = 7h = 100% [Duty cycle limit during open loop] * -> OL_ILIMIT = Ah = 1 V [Open loop current limit (OL current threshold (A) = OL_CURR_THR / CSA_GAIN)] = 6.6A (with CSA 0.15 A/V) **** -> OL_ACC_A1 = 18h = 200 Hz/s [Open loop acceleration A1] **** -> OL_ACC_A2 = 18h = 200 Hz/s2 [Open loop acceleration A2] * -> OPN_CL_HANDOFF_THR = 19h = 300 Hz [Open to closed loop handoff threshold] * -> AUTO_HANDOFF = 1h = Enable Auto Handoff * -> FIRST_CYCLE_FREQ_SEL = 0h = Defined by SLOW_FIRST_CYC_FREQ * -> MIN_DUTY = 4h = 5 % [Min operational duty cycle] */ {MOTOR_STARTUP2_ADDR, 0x3D631990}, /** * CLOSED_LOOP1_ADDR: * * -> COMM_CONTROL = 0h = 120° Commutation [Trapezoidal commutation mode] * -> CL_ACC = 8h = 2.5 V/s [Closed loop acceleration rate] * -> CL_DEC_CONFIG = 0h = Close loop deceleration defined by CL_DEC [Closed loop decel configuration] * -> CL_DEC = 8h = 2.5 V/s [Closed loop deceleration rate] * -> PWM_FREQ_OUT = 10h = 25 kHz [Output PWM switching frequency] * -> PWM_MODUL = 0h = High-Side Modulation * -> PWM_MODE = 0h = Single Ended Mode * -> LD_ANGLE_POLARITY = 1h = Positive [Polarity of applied lead angle] * -> LD_ANGLE = 0h = Lead Angle {Lead Angle (deg) = LD_ANGLE * 0.12} */ {CLOSED_LOOP1_ADDR, 0x08220200}, {CLOSED_LOOP2_ADDR, 0x02A6E4B0}, {CLOSED_LOOP3_ADDR, 0x4CC40100}, {CLOSED_LOOP4_ADDR, 0x000CE944}, /** * CONST_SPEED_ADDR: * * -> SPD_POWER_KP = 64h = 100 [Speed/ Power loop Kp (Kp = SPD_LOOP_KP / 10000)] * -> SPD_POWER_KI = 32h = 50 [Speed/ Power loop Ki (Ki = SPD_LOOP_KI / 1000000) * -> SPD_POWER_V_MAX = 0h = 100 % [Upper saturation limit for speed/ power loop] * -> SPD_POWER_V_MIN = 4h = 10 % [Lower saturation limit for speed/power loop] * -> CLOSED_LOOP_MODE = 1h = Speed Loop */ {CONST_SPEED_ADDR, 0x06403211}, {CONST_PWR_ADDR, 0x5DC04C84}, {_150_DEG_TWO_PH_PROFILE_ADDR, 0x36DB6DA6}, {_150_DEG_THREE_PH_PROFILE_ADDR, 0x36DB6D80}, {TRAP_CONFIG1_ADDR, 0x054BA106}, {TRAP_CONFIG2_ADDR, 0x62880000}, {FAULT_CONFIG1_ADDR, 0x78F43025}, {FAULT_CONFIG2_ADDR, 0x7447A009}, {GD_CONFIG1_ADDR, 0x1C440000}, {GD_CONFIG2_ADDR, 0x14000000}, {PIN_CONFIG1_ADDR, 0x2D720604}, {PIN_CONFIG2_ADDR, 0x080C0000}, {DEVICE_CONFIG_ADDR, 0x7FFF0000}, };
But still, I'm not able to make it start.
What are the key parameters that I should take into account for tuning the driver in the right way? Which parameters should I increase/decrease?
If there's any measurement that I can take that can help you to answer these questions, let me know.
Thank you!