RPM Filter on your AIO board with BLHELI_S

As many of you might know, BLHELI_32 has some really great features - bi-directional DShot and ESC telemetry. This enables the ESC to transmit the RPM the motor is currently spinning with, back to the flight controller, which enables such cool things as RPM filtering. And with bi-directional DShot you do not even need to attach the ESC’s telemetry wire since the back and forth communication is done via the DShot channel.

What RPM filtering does is to basically reduce motor noise very efficiently. It improves propwash immensely. When I first tried RPM filtering on one of my brushless whoops I could not believe that it was the same copter.

This was limited to BLHELI_32 ESC’s but some time ago, Thorsten Laux of jflight.net released a plugin for BLHELI_S that allows bi-directional DSHOT to work with BLHELI_S ESC’s and he also provides a plugin for ESC telemetry on BLHELI_S - it is called JESC.

Be aware that he is charging a licence fee for his plugin, if you buy at least four - and you need one license per ESC - you will pay around 1.25$ per licence making it a total of 5$ for a complete set of ESC’s. It even gets cheaper if you buy a package of 20 licenses at once.

This is great news for all brushless whoop and toothpick aficionados, since most of the time, we use All in One boards that have flight controller and BLHELI_S ESC’s on one board, so we can’t really have BLHELI_32 (at least not yet).

In this article I will show you how you can check if your hardware is supported by the JESC plugin and how to get everything running. The ESC’s have to be of a certain model and the FC itself has to be able to support bi-directional DSHOT. If it does - you can have RPM filtering on your burshless whoop without BLHELI_32.

DISCLAIMER: Although this procedure has worked for me and many other people without any issues, there is at least one case in which strange things happened: the motor wires started de-soldering themselves after flashing JESC. In this particular case downgrading to a previous version of BLHELI_S did not help to solve this issue - this happened on a NamelessRC AIO412T board. You can find a solution and explanation why this was happening here.

Supported AIO whoop boards (BF targets)

The following AIO targets are known to be working:

Feel free to drop a comment down below if you found another AIO flight-controller that is supported by JESC.

Basically every day a new AIO flight-controller hits the market. If the target for your AIO board is not listed here or in the Betaflight Wiki, read on to find out for yourself if your flight-controller is supported by JESC.

Checking the ESC’s

In this tutorial I am using the NamelessRC NL AIO412 flight controller to determine if it supports jesc, but no matter which AIO you are using, the process is the same.

First make sure to flash at least Betaflight version 4.1.0 on your flight controller.

At the time of writing, “Release Candidate 1” of version 4.1.0 is available, so make sure to enable Release and Release Candidates in the Betaflight configurator in order to have the release candidates available for flashing.

Once you have flashed Betaflight, download the Jesc Configurator, which is basically an adapted version of the BLHELI_S configurator. You will also use this configurator to flash the JESC plugin once you have confirmed that your ESC’s are supported.

Open the configurator, attach your flight AIO flight controller via USB and plug in a battery. Now hit the “Read Setup” button on the bottom right of the configurator.

This will show the version of BLHELI_S that is currently flashed. If your version shows an H in the version information, you are set to use the JESC firmware.

PRO-TIP: Since at least the NamelessRC board is causing issues with the default version of JESC, I recommend the following procedure: After flashing to Befaflight 4.1 go to the motors tab, attach a 2S battery and spin up the motors a bit (you do not actually need the motors to be attached for this test). Do not spin them up too high without a load, 1100 should be high enough. Measure the temperature of the FET’s (preferably with an IR thermometer, but you can also use your fingers for this test) at this point. After flashing the ESC’s with JESC and setting up the RPM filters, do the same test again - the temperatures of the ESC’s should stay the same as before flashing JESC. IF the FET’s get significantly hotter than before, revert to the original BLHELI_S firmware.

Flashing JESC

Click on “License All”, you will now have to buy the licences or log in if you already bought them before. Once you have licensed all ESC’s click “Flash All” on the bottom of the window to flash BLHELI_S. After clicking the button you will be prompted with a target selection - the ESC will be selected by default and under Version simply chose the latest stable one and click the “Flash” button.

This will take some time - wait until all four ESC’s have been flashed.

Now it is time to flash the JESC telemetry plugin, click “Flash All Telemetry”. The target prompt is similar to the one you saw when flashing the BLHELI_S firmware. Leave ESC as it is and select the latest version from the Version dropdown and click the “Flash” button.

This will again take some time and will flash the JESC plugin onto each ESC.

That is it - you are now done with the BLHELI_S configurator - you might need to return here later in order to set up the motor direction.

Betaflight Configuration

The first thing you have to do is set up the motor poles so that Betaflight can calculate the actual RPM of the motors. Count the magnets of your motor. If your motor does not have 14 magnets, go to the CLI tab and type:

set motor_poles = n

where n is the number of magnets your motors have. The bigger motors tend to have 14 magnets, the micro motors often have less, the ones I am intending to use have 12.

Now paste the following snippet to enable DShot telemetry:

# set looptime to 4k to have enough computational time
set gyro_sync_denom = 2
set pid_process_denom = 1

# Start with dshot 300 which is most robust
set motor_pwm_protocol=DSHOT300

# basic settings required to enable rpm filtering:
set scheduler_optimize_rate=on
set dshot_burst=off
set dshot_bidir=on

# enable debugging for noise assessment
set debug_mode=gyro_scaled

# reconfigure dynamic notch filter to focus on narrow frame resonances
# since motor noise will already be eliminated by the rpm filter.
set dyn_notch_range = medium
set dyn_notch_width_percent = 0
set dyn_notch_q = 250

Do not forget to save:



After you have done all of the above, make sure that everything is working as it is supposed to. Go to the CLI and type:


which should yield an output that looks like this:

Dshot reads: 154979  
Dshot invalid pkts: 0  
Dshot directionChange cycles: 0, micros: 0  

Motor eRPM RPM Hz Invalid  
===== ======= ====== ===== =======  
0 0 0 0 0.00%  
1 0 0 0 0.00%  
2 0 0 0 0.00%  
3 0 0 0 0.00%  

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Verify that you have no (or very few) invalid packets and that there are actually Dshot reads.

Switch to the motor tab, attach your battery and spin up one (or even better - all) motor - just set them to a level where they spin freely, do not put them on full throttle. Let the motors spin and go back to the CLI and invoke the dshot_telemetry_info command again:


You should see output similar to:

Dshot reads: 509117  
Dshot invalid pkts: 0  
Dshot directionChange cycles: 0, micros: 0  

Motor eRPM RPM Hz Invalid  
===== ======= ====== ===== =======  
0 0 0 0 0.00%  
1 5300 883 14 0.00%  
2 0 0 0 0.00%  
3 0 0 0 0.00%  

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

in this case I was spinning the front left motor - and as you can see it is spinning with 883 RPM. Make sure the Invalid count is low on all of the motors.

Also check your CPU utilization in Betaflight and make sure that it is below 50% when idle. Personally I like to disable the Accelerometer and set my looptime to 4k. On my NameLessRC AIO with RPM filters enabled my CPU load stays below 15% when idle.

That is it - you now have RPM filtering enabled on your brushless whoop AIO flight-controller - have fun!

Chris is a Vienna based software developer. In his spare time he enjoys reviewing tech gear, ripping quads of all sizes and making stuff.

Learn more about Chris, the gear he uses and follow him on social media:

Show more comments