Hi team,
I'm here to ask you guys for some help about driving a motor at low speed using MCF8316A.
1.) Firsts Considerations
Before we get started, i have a few considerations to do:
a. Motor Parameters

This is the motor datasheet given by our provider.
In the motor datasheet, Ph/Ph Resistance and Inductance are with different values from the ones obtained with the MPET. In tests, we've noticed that the MPET parameters works better.
b. Driver Setup
In our tests, we're using the MCT8316AEVM I2C Evaluation Module with the chip replaced by a MCF8316A1VRGFR. The board in powered with a 24V supply.
c. Driver Register
The best tuning we've got so far is at this .json file "LS_mcf_v07_regs.json".
{"signature": "oneui-register-data","data": [
[
{"idx": 0,"id": "isd_config","value": "0x04238C20"
},
{"idx": 1,"id": "rev_drive_config","value": "0x287AF064"
},
{"idx": 2,"id": "motor_startup1","value": "0x7C8E1344"
},
{"idx": 3,"id": "motor_startup2","value": "0x4EA0410F"
},
{"idx": 4,"id": "closed_loop1","value": "0x5E0A843D"
},
{"idx": 5,"id": "closed_loop2","value": "0x1CFF5366"
},
{"idx": 6,"id": "closed_loop3","value": "0x1D802010"
},
{"idx": 7,"id": "closed_loop4","value": "0x3106CA26"
},
{"idx": 8,"id": "speed_profiles1","value": "0x00000000"
},
{"idx": 9,"id": "speed_profiles2","value": "0x00000000"
},
{"idx": 10,"id": "speed_profiles3","value": "0x00000000"
},
{"idx": 11,"id": "speed_profiles4","value": "0x00000000"
},
{"idx": 12,"id": "speed_profiles5","value": "0x00000000"
},
{"idx": 13,"id": "speed_profiles6","value": "0x00000000"
}
],
[
{"idx": 0,"id": "fault_config1","value": "0x7FFC7A40"
},
{"idx": 1,"id": "fault_config2","value": "0x0E147F53"
}
],
[
{"idx": 0,"id": "pin_config","value": "0x00000002"
},
{"idx": 1,"id": "device_config1","value": "0x10100000"
},
{"idx": 2,"id": "device_config2","value": "0x4000F00E"
},
{"idx": 3,"id": "peri_config1","value": "0x03E00100"
},
{"idx": 4,"id": "gd_config1","value": "0x1C000601"
},
{"idx": 5,"id": "gd_config2","value": "0x01000000"
}
],
[
{"idx": 0,"id": "ana_trim3","value": "0x48004800"
},
{"idx": 1,"id": "ana_trim4","value": "0x00000000"
},
{"idx": 2,"id": "ana_trim5","value": "0x000003ED"
},
{"idx": 3,"id": "ana_trim6","value": "0x00000000"
},
{"idx": 4,"id": "ana_trim7","value": "0x00000000"
},
{"idx": 5,"id": "ana_trim8","value": "0x00000461"
},
{"idx": 6,"id": "ana_trim9","value": "0x00A9A89D"
},
{"idx": 7,"id": "ana_trim10","value": "0x536AF13B"
}
],
[
{"idx": 0,"id": "int_algo_1","value": "0x2CB14078"
},
{"idx": 1,"id": "int_algo_2","value": "0x00000081"
}
],
[
{"idx": 0,"id": "gate_driver_fault_status","value": "0x00000000"
},
{"idx": 1,"id": "controller_fault_status","value": "0x00000000"
}
],
[
{"idx": 0,"id": "algo_status","value": "0x00000000"
},
{"idx": 1,"id": "mtr_params","value": "0x00000000"
},
{"idx": 2,"id": "algo_status_mpet","value": "0x00000000"
}
],
[
{"idx": 0,"id": "dev_ctrl","value": "0x00000000"
}
],
[
{"idx": 0,"id": "algo_ctrl1","value": "0x80008000"
},
{"idx": 1,"id": "algo_ctrl2","value": "0x00000000"
},
{"idx": 2,"id": "current_pi","value": "0x000B2264"
},
{"idx": 3,"id": "speed_pi","value": "0x00000000"
},
{"idx": 4,"id": "dac_1","value": "0x00000000"
},
{"idx": 5,"id": "dac_2","value": "0x00000000"
}
],
[
{"idx": 0,"id": "algorithm_state","value": "0x00000000"
},
{"idx": 1,"id": "fg_speed_fdbk","value": "0x7FFFFFFF"
},
{"idx": 2,"id": "bus_current","value": "0x00000000"
},
{"idx": 3,"id": "phase_current_a","value": "0x00000000"
},
{"idx": 4,"id": "phase_current_b","value": "0x00000000"
},
{"idx": 5,"id": "phase_current_c","value": "0x00000000"
},
{"idx": 6,"id": "csa_gain_feedback","value": "0x00010003"
},
{"idx": 7,"id": "voltage_gain_feedback","value": "0x00000001"
},
{"idx": 8,"id": "vm_voltage","value": "0x034EC000"
},
{"idx": 9,"id": "phase_voltage_va","value": "0x00000000"
},
{"idx": 10,"id": "phase_voltage_vb","value": "0x00000000"
},
{"idx": 11,"id": "phase_voltage_vc","value": "0x00000000"
},
{"idx": 12,"id": "sin_commutation_angle","value": "0x00000000"
},
{"idx": 13,"id": "cos_commutation_angle","value": "0x00000000"
},
{"idx": 14,"id": "ialpha","value": "0x00000000"
},
{"idx": 15,"id": "ibeta","value": "0x00000000"
},
{"idx": 16,"id": "valpha","value": "0x00000000"
},
{"idx": 17,"id": "vbeta","value": "0x00000000"
},
{"idx": 18,"id": "id","value": "0x00000000"
},
{"idx": 19,"id": "iq","value": "0x00000000"
},
{"idx": 20,"id": "vd","value": "0x00000000"
},
{"idx": 21,"id": "vq","value": "0x00000000"
},
{"idx": 22,"id": "iq_ref_rotor_align","value": "0x00000000"
},
{"idx": 23,"id": "speed_ref_open_loop","value": "0x00000000"
},
{"idx": 24,"id": "iq_ref_open_loop","value": "0x00000000"
},
{"idx": 25,"id": "speed_ref_closed_loop","value": "0x00000000"
},
{"idx": 26,"id": "id_ref_closed_loop","value": "0x00000000"
},
{"idx": 27,"id": "iq_ref_closed_loop","value": "0x00000000"
},
{"idx": 28,"id": "isd_state","value": "0x00000000"
},
{"idx": 29,"id": "isd_speed","value": "0x00000000"
},
{"idx": 30,"id": "ipd_state","value": "0x00000000"
},
{"idx": 31,"id": "ipd_angle","value": "0x00000000"
},
{"idx": 32,"id": "ed","value": "0x00000000"
},
{"idx": 33,"id": "eq","value": "0x00000000"
},
{"idx": 34,"id": "speed_fdbk","value": "0x00000000"
},
{"idx": 35,"id": "theta_est","value": "0x00000000"
}
]
]
}d. The Application
For our application, we need to run the motor in a wide speed range (195 - 6500 RPM), being able to change quick intervals.
2.) Methods
a. Closed Loop
While we’re driving the motor with the closed loop option turned on, we’re able to run the motor at 6500 Rpm easily. However, when we slow down the speed to 9% the driver seems to lose the motor commutation. It’s important to remember that we need to drive the motor at 3% of the maximum speed (195 Rpm).
b. Open Loop
Since the previous method didn’t work, we tried to drive the motor in Open Loop. The steps are:
- Change register CLOSED_LOOP_DIS to “Disable Closed loop, motor commutation in open loop”;
- Set the speed at OPN_CL_HANDOFF_THR;
- Send a speed command to start running the motor;
- Change the speed at OPN_CL_HANDOOF_THR;
Following these steps, we were able to drive the motor from 1% to 9% of the max speed, above that value, we’re losing too much torque in the motor and just by touching the shaft it stops spinning.
c. Switching between Open and Closed Loop
As seen in the other two methods, the driver is unable to control the motor in the range we need, so we tried to implement an algorithm that works with open loop in low speed and closed loop in high speed. The algorithm is
- Start the motor in open loop (3% for example)
- Change the speed at OPN_CL_HANDOFF_THR register
- When speed command reaches 10% change CLOSED_LOOP_DIS register to “Enable Closed loop”
- Drive motor in closed loop normally
In this case (open loop to closed loop), the method works pretty well, however, in the opposite situation, the method didn’t work (going from closed loop to open loop) ¹. When we try to change to open loop, the driver stays on closed loop, only if we stop the motor and start running again it goes to closed (which is impracticable for our application).
Algorithm not working¹:
- Motor running in closed loop (24% for example)
- When speed command reaches 10% change CLOSED_LOOP_DIS register to “Disable Closed loop, motor commutation in open loop”
- Change the speed at OPN_CL_HANDOFF_THR register
- The motor stays on closed loop, and we can't spin it at low speed
3) Possibilities
We think the reason for this issue is the low current on the BEMF of the motor due the low speed rotation. In tests, we’ve noticed that if we hold the shaft forcing the motor to consume more current, the driver is able to spin it, even with a little difficulty. But now, we have a few questions:
What can we do to improve the driver's operation at low speed? Changing the motor can work? Is there a way to keep changing the driver mode while the motor is spinning? (open to closed loop and closed to open loop)
Best Regards,
Oliver









