Reverse-engineering the M820 torque table – rider torque thresholds instead of motor limits
Hello,
while working with OpenBafangTool on the Bafang M820, I started looking more closely at how the torque table actually affects the behaviour of the motor.
After testing multiple configurations, I am fairly convinced that many conclusions about the motor performance are based on comparing firmware presets, not on understanding how the assist curve is really calculated.
Different default profiles are often compared, and the resulting ride feel is then interpreted as a limitation of the motor itself.
From my testing this does not seem correct.
The biggest influence comes from the torque table, not from the hardware limits.
The parameters Start torque, Max torque and Return torque behave like rider torque thresholds used by the internal assist algorithm, not like motor torque limits.
Start torque
→ rider torque where assist begins
Max torque
→ rider torque where full assist is reached
Return torque
→ rider torque where assist starts to decrease again when input drops
This can be verified easily by lowering Max torque.
The motor feels stronger and reaches full assist earlier, even though current limits and max power stay unchanged.
That would not be possible if the value defined motor output.
To get a realistic reference, I converted the torque values to actual pedal force.
With 165 mm crank length:
1 Nm at the torque sensor ≈ 0.62 kg pedal force (horizontal crank position)
This gives reasonable real-world numbers:
Max torque 20 → ~12 kg pedal force
Max torque 15 → ~9–10 kg
Max torque 12 → ~7–8 kg
These values correspond quite well to typical rider force at moderate cadence.
From this perspective many default tables seem to assume higher rider torque than what is actually applied in normal riding, especially at medium and high cadence.
As a result the motor feels less responsive, even though the hardware would allow more assist.
My riding style is mostly constant cadence around 50–80 rpm, because I shift gears and try to stay in an efficient range.
At lower cadence more force per stroke is possible, at higher cadence less force but higher speed.
So I tuned the torque thresholds depending on cadence range instead of using one fixed behaviour.
Example setup:
Level 2 (40–60 rpm)
Start torque 2
Max torque 15
Return torque 1
Level 3 (60–80 rpm)
Start torque 2
Max torque 12
Return torque 1
Level 4 (80–100 rpm)
Start torque 2
Max torque 9
Return torque 1
With this configuration full assist is reached at roughly 7–10 kg pedal force, which feels much closer to natural riding than the default settings.
Fade time also has a large influence on the perceived behaviour, so I use higher fade at low cadence for smoothness and lower fade at higher cadence for more direct response.
Start pulse = 1
Stop delay ≈ 10 ms
I also lowered the torque thresholds slightly because I am currently not at peak fitness after winter.
Increasing the values later is an easy way to increase rider effort without changing assist level.
From my point of view the M820 has significantly more usable range than what most default setups show, and tuning the torque table based on real rider torque makes a bigger difference than switching between different firmware presets.
Would be interesting to hear if others have tried to map the torque table to real pedal force instead of just copying firmware settings.
View attachment 180004