6

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.

Rocketmagnet
  • 6,457
  • 5
  • 29
  • 54

1 Answers1

3

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.

Mark Booth
  • 4,253
  • 2
  • 25
  • 54
TimWescott
  • 1,891
  • 11
  • 10