Requirements
  • BMW Scanner 1.4 (or any other means for editing the Cluster EEPROM). DIS, NCS Expert, SSS, etc. are not sufficient for this one.
  • CI06 or newer cluster for non-M, and CI23 or newer for M (I think this corresponds to 2002 or 2003 and newer for both groups)
    • It is possible to do this on early clusters too, but the software is quite different. I can research if a few of you send me a dump of your cluster EEPROM. Also tell me the amount of error you've measured (between the needle and digital test)
  • Some common sense



As most of you know, E46 clusters tend to be optimistic. What you may not have known is that the DME and Cluster know the exact speed; the error is deliberate on BMW's part. There have been a few ways to correct this in the past; one way is to just trick the cluster into thinking you have smaller tires, but this can screw up things like MPG and average MPH calculations. Another way was to rescale the cluster curve itself, but this required a decent bit of trial and error and it was just fooling the cluster into thinking the scale was larger.

After studying M and non-M EEPROM files, here's what I found -- there is a function deliberately designed to increase the speed by a certain ratio. In the non-M, the displayed speed is the real speed + 5.7%. In the M3, the error is a massive 8.9% -- completely unacceptable IMO.

So here's what you do.

  1. Start up the PASoft software and load your IKE. Read off the EEPROM.
  2. Now, in the built in hex editor, look for the following hex string (pick the appropriate one for your model).

    Code:
    E46 M3:     03 00 2D C8 00 31 D6
    Non-M:      03 00 23 C8 00 25 CC
  3. Change it to the following

    Code:
    All models: 03 00 01 C8 00 01 CA
  4. Save the file, and flash the EEPROM back to your cluster.


Done. If you have stock diameter tires, your speedometer should be almost 100% accurate

If you're curious as to how the change works, the bytes I change are used as a ratio. 0x25 = 37; 0x23 = 35. 37/35 = 1.057, or a 5.7% error. I am not sure what the 0xC8 (200) value represents; I think it might be an upper limit to the allowed error (5.7% until the error reaches 20 km/h). That last byte is simply a checksum (XOR all the values together, and then XOR with 1)

If you have an old cluster, please send me your EEPROM. I can't promise I'll figure out how to do the change there, but I'll try. Also, if there are any Japanese members here, please send me a dump of your cluster. In the E39, the Japanese values for the cluster are 100% accurate; I suspect the same holds true for the E46. It would be interesting to see how BMW configured the cluster.

Give me feedback; so far in my testing it agrees with GPS, but it's always nice to have others confirm too

Oh and I should thank geargrinder -- he got me interested in looking at this stuff again, and helped fix a few of my earlier mistakes