If I was controlling a normal brushed motor as a servo, I would measure the motor's position, and adjust the PWM signal to control the voltage. This way I could achieve a precise velocity/position profile if my control was good enough.

pwm_duty = CalcPID(motor_position - target_position);

When doing Field Oriented Control (FOC) of a brushless motor, there are two parameters I can control: The voltage angle, and the voltage magnitude. There are three things I can measure, the current angle and magnitude, and the rotor position.

I want to achieve a precise velocity/position profile including good control down to zero speed and reverse.

Question: how can I calculate the correct voltage field angle (or phase lead) and magnitude? Do I need two PID algorithms?

phase_lead  = CalcPID_1( ... );
voltage_mag = CalcPID_2( ... );

Assume I can take any reasonable measurements of the motor state, including rotor position and winding current.


1 Answer 1


I believe the most efficient thing to do is to maintain a 90 degree phase lead, and adjust your voltage magnitude for control. You'll probably want to have an inner current loop, wrapped by the actual position loop.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.