Bafang Ultra M620 Programming aka Taming the Beast

Last Updated on August 3, 2022

There’s a lot of diversity in the world of ebike power systems. Some manufacturers like Bosch, Brose, and Yamaha focus on making them as light as possible with just enough power and smooth delivery of that power, where others, like Bafang, are often criticized for not being as smooth and responsive with all that

Which one is better for your needs depends largely on your personal preferences and riding styles, but ideally, I’d like to have both! Ample power with smooth delivery can make climbing hills as much fun as descending. I also prefer powertrains that have throttles (is it really a “throttle” on an electric bike?) and are user-programmable which lets us go beyond the typical street limits of 250-750 Watts of power.

The Bafang Ultra M620 is as close as it gets to my ideal powertrain since it has a throttle and can output 1500 Watts with simple software tweaks!

When I started riding a Bafang Ultra M620-powered, full-suspension, Luna Z1 mountain bike, even at the lowest power level, the power delivery was, at best, startling, and, at worst, dangerous. That’s not a knock on Luna, necessarily, it just seems to be the preference with all of the bikes I’ve tried with this powertrain. However, when you’re dealing with so much power off road, in my opinion, it must be smooth and predictable so it doesn’t send you into a boulder or off the trail at the worst possible moment.

Thankfully, there’s a remedy. Like its cousins the BBS02 and BBSHD, the M620 drive (as long as it has the UART connector, YMMV!) is programmable using an Eggrider controller and a smartphone or a programming cable and a Windows laptop with Bafang Config Tool. I have both options and they’re each great, but I prefer to use a laptop for the larger screen. If you prefer to use an Eggrider, connecting and programming will look much different than what I show below, but the settings I’m using can be used with the Eggrider just the same.

So, how do we tame this beast?


Before we go any further, a word of caution here. Some of these settings can do bad things to your bike and/or your body. What is presented below works for me and my bike and I share it freely with no guarantee that it will work for you and your bike.

I relied heavily on help from the internet (thanks Karl!) in understanding these settings for myself. What I’m using is modified significantly from what my bike shipped with from the factory and from what I’ve seen others use. I made changes thoughtfully and tested them cautiously and I strongly recommend you do the same.

If you proceed, you are solely responsible for the consequences.

Step 1. Controller Assist Levels

It’s not required, but with this much power available, it’s best if we can access all 9 of the available power levels on the M620 drive, not just the 3 or 5 levels that are the default for many controllers.

My Luna Z1 came with a Bafang 860C controller that was set to 5 levels and is configurable to 3, 5, or 9, but that will vary by bike. In any case, consult with your controller’s manual to access the advanced settings to change the number of assist levels. If your controller is hard limited to 3 or 5 power levels, I’d highly recommend the Eggrider controller as an upgrade.

Following the 860C manual, I had to double press the “M” button, navigate to “Advance setting”, input passcode “1199” (not “1919”), and change assist levels from 5 to 9. There’s plenty more you can do in here, but that’s all we need right now.

Step 2. Connect to the Drive

  1. Disconnect the controller from the bike
  2. Connect the programming cable to the bike (not the controller)
  3. Power on the bike’s battery
  4. Connect the programming cable to a USB port on the computer

Step 3. Find Your COM Port

Open Windows Device Manager and look for “Ports (COM & LPT)” to find which port (COM5 shown here) the computer assigned to the cable.

Step 4. Open Bafang Config Tool

  1. Open Bafang Config Tool.
  2. Enter the COM port that was assigned by Windows.
  3. Click Connect. If you see information populate below, you know you’re connected. You should also get a message.
  4. Click on Read Flash to pull in the current programming.
  5. Click on File, Save to save a backup of the factory configuration.

Step 5. Basic Settings

Here’s where those 9 assist levels on the controller come into play. If you have fewer than 9, it uses Assist0, Assist1, and Assist 9, but has to skip some in between so the jumps are much larger.

Here are my settings. I’ll point out some particular ones I recommend and why below.

Limit Current(%) is the percentage of maximum current the drive can apply in each assist level. I like to vary the current with an exponential curve since that’s how power naturally works. If we use a linear curve like 10%, 20%, 30%, etc, when you go from Assist1 to Assist2, you’ve doubled your power, but from Assist2 to Assist3, you’ve only increased by 50%. This exponential curve starts at a very low 8% in Assist1 and increases by 37% each step for a smooth, intuitive ramp in power levels up to Assist9.

Limit Spd(%) is the percentage of maximum speed it will reach before stopping in each power level. I like to set my speeds to 100% from Assist1-Assist9 and to 1% on Assist0 to effectively disable it.

Make sure you click on Write to send the settings to the controller before moving on.

Step 6. Pedal Assist Settings

Pedal Assist (or PAS) pushes at a constant power anytime the pedals are turning regardless of how hard you are pedalling. Since the Bafang Ultra M620 has torque sensing pedals, I want to minimize the PAS output and maximize the torque sensing output.

Here are my settings. I’ll point out some particular ones I recommend and why below.

Start Current(%) very low keeps it from being jumpy.

Slow-Start Mode(1-8) in the middle gives it a smooth ramp on in power.

Keep Current(%) varies based on the assist level, so I set it very low to minimize the feeling of PAS.

Current Decay(1-8) in the middle gives it a smooth ramp off in power.

Stop Decay(x10ms) very low makes power drop off quickly when you stop peddaling.

Make sure you click on Write to send the settings to the controller before moving on.

Step 7. Throttle Settings

One of the key features of the M620 drive is having that throttle to help get through technical terrain without pedal strikes or just scoot across an intersection.

Here are my settings. I’ll point out some particular ones I recommend and why below.

Mode set to Current rather than Speed is more intuitive feeling and gives much better control at slow speeds.

Designated Assist on 9 corresponds to Assist9 for full power all the time, even when the controller is set to Assist0!

Start Current(%) very low gives you a smoother initial turn on.

Make sure you click on Write to send the settings to the controller before moving on.

Step 8. Torque Settings

Here’s the big one, the main event. This one has a lot going on.

Here are my settings. I’ll point out some particular ones I recommend and why below.

Base Voltage corresponds to the lowest voltage from the torque sensor used to calculate power output. The default is 0, but setting it to 740 based on Frey’s recommendations makes the torque sensing a bit more sensitive.

Delta Voltage is how much force you’re applying to the pedals. A lower mV number makes the drive apply more power for the same input force. I like for it to be less sensitive at low pedal forces to keep from being jumpy and make a linear ramp up in sensitivity. Starting the curve at 400mV works well for me at 165 lbs, but you may want to use 375mV, 370mV, 365mV and so on, if you weigh less and can’t physically put as much torque on the pedals.

Spd0 – Spd100 are motor speed ranges (not bike speed ranges) that apply to the next settings.

Start(Kg) is how much force we apply to the pedals before it starts pushing.

Full(Kg) is how much pedal force it takes to let it apply full power at that speed. Frey has a good write-up on why this should decrease as pedal cadence increases, but I think their settings are excessive. At least for the type of riding I typically do, if I’m pedalling as fast as I can in a low gear, I can’t imagine a scenario where I’d need 1000W+ added to it, so I tone it back.

MinCur(%) is how much it starts applying at each speed.

MaxCur(%) is the maximum it will apply at each speed. Note the lower values at Spd0 and Spd20 since we don’t want to dump too much power into the motor until it’s spinning sufficiently fast. This protects the drivetrain if you’re trying to ride in too high of a gear with a low pedal cadence.

Make sure you click on Write to send the settings to the controller before moving on.

Step 9. Disconnect

  1. Click on “Close” to disconnect the computer from the drive
  2. Disconnect the programming cable from the bike
  3. Reconnect the controller to the drive
  4. Power up the controller and give it a test ride!


With these settings, I’m well impressed and pleased with how the bike performs both on and off road. Even on Assist9, the power delivery is smooth and predictable where it ramps up quickly if I start pedalling hard and it stops quickly when I stop. There’s barely any delay and it feels just as responsive as the drives from the big boys.

If you find any ways to make it even better, let me know!

Update: UART vs CANBUS

Bafang is moving away from the easily-modded UART motor controllers, but the UART controllers and motors are still available. A helpful reader recommended this Alibaba listing as a source:

23 thoughts on “Bafang Ultra M620 Programming aka Taming the Beast”

  1. You know nothing
    BBSHD and BBS02 use UART protocol
    Bafang Ultra M620 uses CANBUS protocol which has not yet been hacled.

    • Such confidence you have! You’re thinking of the M600 though, which is also confusingly called the Bafang Ultra. M620 is very much programmable.

    • Not currently. The program from Bafang is Windows only and I haven’t seen any versions for MacOS. If you don’t have access to a Windows laptop, I’d recommend programming using your phone and an Eggrider V2. You can always disconnect the Eggrider and reconnect the stock display and it keeps the settings.

    • Maybe. Based on their page, they say 750W continuous, 1152W peak, 25A controller. From that, I would guess they have “Limit Current” on the Basic settings page set to 24A (1152W/48V=24A).

      Use can usually increase that to 30A on the stock Bafang controller, but you do have to be mindful of the battery’s maximum output capability. With a 21AH battery, I would think 30A is reasonable, but I have no way to confirm that.

      Also, of course, if you increase the maximum output beyond what they’ve set and you have issues, I would not expect for them to honor their warranty.

  2. I have a Bafang Ultra M620, it’s the newer version with CANBUS. Display cable is triangular instead of the old round cable. How do you plug the display into the PC with the newer CANBUS ?
    I do not understand how you can program the M620 if you cannot connect the programming cable into the display and into the PC.

    • This programming method only works with the round connector UART drives. I’ve heard the CANBUS drives can be programmed, but you currently need their software and an account, but that’s hard to come by.

  3. Thank you for putting this together. I have been doing some research on this and wanted to know if you have read this article about setting the Base Voltage for the torque sensor.

    I was also looking at the Ultra “Smooth” Tune (on the bottom) and felt like it had a good point about decreasing the Full(Kg) setting with speed (motor) because we can’t provide max torque as we start pedaling faster and we probably still want high assist if we are pedaling fast.

    • Nice finds! I updated the post with my learnings and testing. I found the base voltage made things a bit more sensitive, but nothing night and day. The Full(Kg) settings can have a huge impact though. Frey’s settings were way too aggressive for me, but I’ll keep playing with them. Thanks for the input!

  4. every time i try to input a number in the base voltage the program frezzes and i have to restart it and conect again, did you have anything like this?

  5. I have a new M620 on a Biktrix. It has an unrestricted controller but what I’ve noticed is that I only get about 5-8 minutes of full power with the throttle (while pedaling). I dont seem to get full assist when just on pedal assist in level 5 (at level 5 eco is the same as sport) (but I dont see a controller setting to change that). I put a 48 tooth ring on the front so its a 48-10 gear ratio so l can produce lots of pedal torque.

    But am more interested in the throttle issue. This seems to happen regardless of battery voltage. Is that a built-in protection or some kind of heat limit?? Has anyone experienced that? Is there a programming value that could change this limitation?

  6. Great article, thanks.

    I’m building an M620 bike right now and went out of my way to find an older UART model in order to easily tune it. I’m riding a BBSHD at the moment, on 52v, with heavily tweaked parameters, but this article is definitely a leg up for the unfamiliar parameters.

    I’m only able to get 65 cells (19650) into my new frame, so pretty much limited to 48v, and am quietly concerned that this will be a downgrade of sorts from my BBSHD.

    I was considering reducing the Limited Current value down from 30A, to increase my range and potentially open the door to larger capacity cells with lower continuous current.

    a] is this safe and is there any logic to my theory?
    b] is this essentially the same as keeping the max current at 30A and never ramping up the Limit Current (%) to 100% – or just not using the higher assists?

    Last question – any ideas about comparative efficiency, BBSHD & M620? I’m struggling to find any info there.

    • I’d say the 52V vs 48V question will largely depend on your riding conditions. If you’re looking for top speed, you’ll probably notice. If you’re like me and ride trails with no interest in top speed, the difference between a lot of power and a little more than a lot of power is negligible. As it is, I rarely ride on level 9 and just keep full power available on the thumb throttle for a boost.

      For range, again that’ll largely depend on your riding conditions and how much effort you’re putting in. I typically ride 4-5 miles on trails and only use ~20% of a charge, so I could have half the battery capacity and be just fine.

      I agree with your assessment on the effect of lower power levels vs an overall limit, but certainly you should set the overall limit equal to or less than what the cells are capable of providing.

      I have a BBS02 and M620, but I really can’t say for sure on the difference in efficiency. I find myself putting in more effort with the M620 because I’d rather rely on the torque sensing vs PAS + throttle on the BBS02, but that’s going to vary. I’ve never done a test of throttle only on both to see which is more efficient. A lot of that will likely come down to the bike itself with weight, gearing, tires, and drivetrain all impacting efficiency.


Leave a Comment