Controller for a Brushless DC motor (with ESC)

brushless-dc-motorpid controller

I have one of those BLDC Motors which are used in quadcopters and also an ESC to control it. I give it a PWM signal and it outputs the necessary condition for the motor to spin (AC signal).

The first question is: I think the ESC's output relative to its input is nonlinear. In other words, multiplying the width of the input pulse by 2 will not increase motor's speed in a factor of two. Am I right?

The second question is based on the first: in case it is a nonlinear system, how can I use a PID to control it? Suppose I want to build a controller (PID) in which I give a specific angular speed and the motors reach this angular speed as fast as it can with low or none overshoot. The input to this system will be something like a RPM value and the output is will be another RPM value (some speed sensor coupled to the motor). But somewhere inside the control loop one should place a gain K which converts the RPM value to a voltage or PWM value. If this relation is nonlinear, how can this be done?

Best Answer

If the nonlinear relationship holds for a wide variety of conditions, you could create a mapping function that removes the nonlinearity. The only issue would be if the function is non-monotonic (ie has a dip). Of course, you could always just apply the PID and experiment with parameter values. Unless the system is VERY badly behaved, you will probably find a result you like.

TL;DR Stop worrying and just try it