Achieving Linear Throttle Response – Motor Top End Calibration

by Oscar

Anton from CapeFPV team shared with us how to get better and more linear throttle response, by doing ESC (BLheli) and flight controller (Cleanflight) calibration and configuration.

Some of the links on this page are affiliate links. I receive a commission (at no extra cost to you) if you make a purchase after clicking on one of these affiliate links. This helps support the free content for the community on this website. Please read our Affiliate Link Policy for more information.

Anton says:

So I came across a video by Joshua Bardwell about Motor Top End Calibration and I wanted to do some testing about it myself. In most cases using normal throttle calibration is good enough, there is nothing wrong with leaving it up to the firmware to try and work out the correct min and max throttle. That being said, let me explain to you why we are looking into Top End Calibration.

By default the throttle response looks something like the red line in the top graph, and there is a flat spot at the top of the throttle (most right). What we really want is a linear throttle curve that looks like the blue line.

Further Reading: Learn about PID Tuning in this tutorial.

Benefits of linear throttle response

Linear throttle response solves a number of issues some pilots complain about, a multirotor drifting or turning when giving 100% throttle, or getting oscillation. You can also squeeze a bit more performance out of your motors, and it helps your quadcopter to feel more “locked in” and less sloppy, especially when you are doing extreme acro. Note: This is not the holy grail for all the problems in PID tuning, but a good start.

I will also explain some of the reasons on why Cleanflight and BLHeli choose the values for Minimum and Maximum Throttle. I will then move into a tutorial for getting the maximum performance out of your motors by getting that response as linear as possible.


The signal from flight controller sends to ESC is normally between 1000 to 2000, this is the start and end of an analogue signal. You will see that on my Cleanflight setup, the values are set to 1150 and 2000 (Refer to the Cleanflight Documentation). These values where allocated in Cleanflight after doing my default calibration. Cleanflight detected this on calibration, which proceeded to set the values accordingly.


The Value 1150 is the Minimum Throttle Value. This value should not be confused with the Min_Command Value of 1000.

The Minimum command is to specify where the motors won’t spin. The Minimum Throttle Value is what is required as input for all motors to start spinning freely. This is also important when you are running “Air Mode“.

When we do a roll, pitch or yaw movement to an extreme, for instance a 360 roll, we cause 2 motors to spin at 100% (Maximum Throttle) and the other two to spin at 0% (Minimum Throttle).

This is where the Minimum Throttle value comes in. We set the Minimum Throttle value to the lowest value where all 4 motors start to spins smoothly (for example if motor 1 start to spin at 1120, motor 2 at 1130, motor 3 at 1110, motor 4 at 1140, we set Minimum Throttle to 1140). This ensure the ESC and Brushless motor does not stop completely or desync mid-air when doing a flip.

Maximum Throttle is the one we are going to be calibrating. We have set it to 2000 in Cleanflight Configurator, However after ESC calibration, you might find it to be a different value in BLHeli, which is more likely to be lower than 2000. This is due to how BLHeli works, it automatically created a dead zone at the top end. But this also creates a plateaus (flat bit) on the throttle top end.

Why does this matter?

There are two main reasons why we want to lower our Maximum Throttle in Cleanflight, to eliminate the plateaus:

  1. We want a linear throttle response for a more locked-in feel
  2. We don’t want to waste loop cycles when the ESC max throttle reached the throttle plateaus before it reaches Cleanflight max throttle value

When a PID loop takes place and sends a command to the ESC, the quad reacts and the Gyro sense the movement, and tells the flight controller that a change has occurred. When the PID loop sends a signal to the ESC again that is higher than the ESC’s max throttle value (PPM Max), the motor’s speed will be capped at PPM Max.

This causes the PID loop to “think” that the quad is not changing fast enough, and in turn sends an even higher value to the ESC to speed up the motor. But again the motor won’t speed up as it has reached the max limit set on the ESC.

This can continue until the PID loop reaches Max throttle value set in Cleanflight, and cycle by cycle and ESC command will come back down again, which takes time. You can notice this effect in the form of small oscillations when doing punch outs, or doing flips and rolls. You can most likely eliminate the oscillations by bringing your P gain down, however this will not give you a linear throttle response.

So how can we improve on the configured values?

Tutorial – The Steps

Ensure all props are remove before doing this, motors might be spinning!!

1. ESC Normalization:

First of all, do a ESC calibration first on your ESC / FC setup, this will set the initial “PPM Min Throttle” and “PPM Max Throttle” values on your ESC’s. We can set these values by using a USB Linker, Arduino or FC pass-through.

If the ESC does go into calibration mode with max_throttle set to 1850, then the ESC will think 1850 is the highest setting it will ever see. It will then apply it’s full throttle to the ESC at 1850 – i.e. subsequently changing max_throttle to 2000 would not result in any increase in max RPM. If you calibrate the ESC to the true full range (2000), and then set max_throttle to 1850, the actual RPM at full throttle should then be lower.

When you check these values in BLHeliSuite, you might find them to be a slightly different from one ESC to another, so we need to make sure they are the name by adjusting them. (I normally copy values from the first ESC to the rest)

Achieving Linear Throttle Response - Motor Top End Calibration_BLHeliSuiteSetup

In my case BLHeli defaults to 1.148 for Min and 1.832 for Max. I have made sure that these values are the same across all my ESC’s on my mini quad.

2. Calibrate Minimum Throttle:

As stated in the theory section, minimum Throttle needs to be set to the point where all 4 motors start to spin smoothly.

To find out what this value is, we go to the Motors tab in Cleanflight. Check the checkbox “I understand the risks, propellers are removed” and continue to slide the Master slider upwards.

Find the value where all motors spin and write it down. In my case it was 1155. Go to the Configuration tab and set this value at Minimum Throttle. Make sure your Minimum Command is set to 1000, or a value lower than the one in Minimum Throttle.

Achieving Linear Throttle Response - Motor Top End Calibration_Calibrating_Min

3. Calibrate Maximum Throttle:

Calibrating the Top End of the ESC requires a bit of intuition. You will need to listen to harmonic resonance changes when the motor speed changes. It’s not hard to hear these changes so don’t worry.

Achieving Linear Throttle Response - Motor Top End Calibration_Calibrating_Max

  1. Go to the Motors tab and Check the checkbox “I understand the risks, propellers are removed”
  2. Move the motor slider to the maximum throttle value (1850 in my case)
  3. Slowly lower the motor’s throttle value until you hear a change in the resonance frequency. This frequency is the motor’s changing of speed.
  4. Write down the value you get; this value will be the one just before the resonance frequency changes.
  5. Repeat Steps 2,3 and 4 for the remaining motors.
  6. Go to the Configuration tab and set the lowest value from your test at Maximum Throttle. We take the lowest value, because it’s the weakest motor.

Achieving Linear Throttle Response - Motor Top End Calibration_motors_after

You are now done, Save and reboot your Flight Controller and test the new values.

Do not calibrate your ESC’s again after this, otherwise you will put the dead band back in.

Also check out Joshua’s video he explained very well:


Author: Anton Van Zyl Bio: I am from Stellenbosch, a little wine town in South Africa. I competitively compete in FPV racing and just love flying all things. I am just into it for meeting friends and having a blast.

Leave a Comment

By using this form, you agree with the storage and handling of your data by this website. Note that all comments are held for moderation before appearing.


FPVBeginner 10th December 2016 - 12:24 pm

So my motors start to generate a lot of vibrations above 1550 (BLHeli ESCs calibrated between values 1050 and 2000) when using 4S. So I want to cap Maximum Throttle in BF to 1510. I thought I could still use full throttle values in my Tx and the output values will be interpolated automatically.
What I found though is that even when giving a tiny bit of throttle, the motors are given max output of 1510.

What might be going on? Any thoughts on fixing this issue in BF Configuration?

Peter 25th September 2016 - 1:30 pm

I think what you want can be much more easily achieved. This will also ensure that the maximum possible “resolution” is used (what Jakob means) and that the middle throttle position is correct for 3D mode.

BLHeli Suite:
– Disable programming by TX
– PPM Min throttle: 1000
– PPM Max throttle: 2000
– PPM Mid throttle: 1500

– Max throttle: 2000
– Middle throttle: 1500
– Min command: 1000
– Min throttle: Determine as usual (will be around 1020-1050 or so)

Then set your transmitter so that you see these values in cleanflight when moving the throttle stick:
– throttle stick down: 1000
– throttle stick centered: 1500
– throttle stick up: 2000

Mike 10th June 2016 - 11:32 pm

There is an important step missing from the method in this article.

Before you calibrate your ESCs, you should set min_throttle to 1000 and max throttle to 2000 in Cleanflight.. Then calibrate.

After calibration, check the max throttle value recorded by each ESC. If any of them are over 2000, drop Cleanflight’s max_throttle by 20 to 1980 and calibrate again. Repeat until all ESCs record a max throttle value of 2000 or less.

Having done that, you can use the motors tab to find out what throttle level the motors need to start reliably. Add 10 to the highest value recorded and set that as your min_throttle in Cleanflight.

If you don’t set the range properly to start with, you lose resolution by having to set the minimum throttle level too high.

Bol2riz 28th May 2016 - 5:14 pm

After having thought about it a little bit. I’ve decided to try not to keep the weakest one but the strongest one. Thus to reduce the plateaus as much as possible while keeping the max rpm available.

Bol2riz 28th May 2016 - 4:46 pm

What I don’t understand well is taking the lowest max throttle value means that only one of four motor (at least in my setup) will spin at it’s highest rpm while the other ones wont. This by definition results in something unbalanced at some point.

From my understanding (no offense in my next sentences) this should achieve the goal of avoiding the plateaus but I would have preffered to know how to rationalise the ESC curve across the four esc and then deal with this plateaus.

BTW Thanks for the tutorial.


RUBEN JOHN 20th May 2016 - 11:15 pm

I’ve heard that maxing out throttle on a motor without a propellor is not good for a motor. Isn’t that what is being done to find the change in resonance frequency ?

Oscar 24th May 2016 - 11:36 am

for a short time it shouldn’t be a big problem.

FlyingKISS 19th May 2016 - 9:30 am

I’m currently using the KISS Combo 24A RE und KISS FC and I’m really happy with the setup. But I experience the problem, that my quad drifts when I move the throttle stick all the way up. Can this turtorial also be applied to the KISS Combo?

Anton Van Zyl 19th May 2016 - 2:02 pm

To my knowledge, the Kiss ESC and Kiss FC are already completely in sync. So this tutorial wont be applicable to your issue.

Jacob Grigg 19th May 2016 - 3:48 am

Very Interesting.
I have not had a lot of experience in calibrating CF/BLHeli, but to me it would make more sense to raise the PPM Max Throttle in BLHeli for each ESC instead of lowering Maximum Throttle in CF.
This would give a higher resolution of speeds.
Instead of 665 speed steps (CF Maximum Throttle 1820 – Minimum Throttle 1155) one could have 850 speed steps (CF Maximum Throttle 2000- Minimum Throttle 1150).
This would give the PID loop more choices of speed rather then jumping between a speed that is to high or low.
I would value your input on weather this would work or not.


Anton Van Zyl 19th May 2016 - 2:08 pm

Hi Jacob

Sure it can be applied in this way as well, however, remember that after the values are set to match each other through calibration, we still need to cater for the throttle plateaus and find the subtle differences between the motors. Finding these area’s will enable us to create a more linear throttle.