E46 Fanatics Forum banner

DIY: Make your speedometer accurate

86K views 98 replies 56 participants last post by  thegenius46m 
#1 ·
Requirements
  • BMW Scanner
  • Cluster made in 09/2001 or newer (edit: not 100% sure about this date cutoff after looking at some NCS Expert files. Might even be as late as 03.5). I'm sure 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
  • 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). In my cluster, it was located at offset 0x339
    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 a 99-01 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 fanatics 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.

Also give me feedback; so far in my testing it agrees with GPS, but it's always nice to have others confirm too.
 
See less See more
#65 ·
@TerraPhantm I've tried to contact you trough PM, but apparently you're so popular that your inbox is full :D
I would like to change the MPG gauge to display the oil temperature, but I can't find too much information online. Maybe you could help me. Please inbox me if you can!
 
#72 ·
Hey Terra,

Im having the speedometer issue, but the other way around.
Driving around with 19 inch wheels, so my speedometer will show 100 while I m actually doing about 106.
Does the same trick work if I calculate a value that will result in a negative number?
 
#73 ·
Applied teras code to my cluster and I***8217;m getting a consistent 3 MPH difference between speedometer and GPS speed. I.E. I***8217;ll be doing 60 and GPS says 63. 80 and GPS says 83.

Early 2003 M3 with 255/40R19x8.5 squared

All codes expect ***8220;All models: 03 00 01 C8 00 01 CA***8221; gave me a PPPPP error. Any thoughts as to why I can***8217;t get it closer?
 
#74 ·
I need the exact code for my 330ci with 19 '' tires, and cluster m3smg, currently I have tried these 3 codes with no result, it has an error of 20km / h.

1%: 03 00 64 C8 00 65 CB
2%: 03 00 32 C8 00 33 CB
3%: 03 00 64 C8 00 66 C9

Is any of these correct or is it another?
 
#83 ·
Hey Terra. Thanks for putting this together. Tried it today, got BMW Scanner started, and I don't see the string anywhere?

Code:
03 00 23 C8 00 25 CC



Any ideas?

Also, in your initial writeup, you say

Save the file, and flash the EEPROM back to your cluster.
I'm not a computer-savvy person, and I don't see the option to "save file" anywhere. Also, when you say "flash the EEPROM back to your cluster," do you mean click "Write EEPROM"?

I'm sorry; I just need this all spelled out and I don't want to screw anything up, but I also want my speedometer to be more accurate.

Thanks!
 

Attachments

#86 · (Edited)
#84 · (Edited)
One of the other menus in there had a box to enter how many counts of the wheel sensor per mile. I played with that until gps and speedometer matched. Never had to write new codes...
And I think there were two boxes. One for speed and one for distance. Factory had them a little different so the speed was slightly higher than actual
 
#95 · (Edited)
How to change the speedometer on the "earlier" models that were not in the first post.

Hello. I would like to thank @TerraPhantm for this find and also the DIY: Changing Temperature Gauge Buffer Range with PA...

As you can tell, in the first post he figured out how to change it in the later models but wasn't positive about the earlier models. Well, I am here to help you out. He did figure it out, it's just hidden within the thread. I did this to my EEPROM and now I am within 1MPH at all speeds below 55mph. Above 65mph it moves to within 3mph I believe. (could be different on your car due to tire size etc)

Note: you can always confirm the location of the values using NCS Expert. "Well according to the daten files, there's a 16-bit value "TACHO_SKALA_ENDWERT" at 0xD2. This translates to "Speedometer Scale End Value" On your file it's set to 0x02bf (703). On the early E46 M3s, the same bytes are set to 0x032a (810). "
Cluster made in 09/2001 or newer (edit: not 100% sure about this date cutoff after looking at some NCS Expert files. Might even be as late as 03.5)
I believe the cut-off date is closer to 09/2002 when they changed to ms45.


How to find and change the values.
D2 and d4 are locations, or offsets, not values. Notice how in the left column there are values like (0x000, 0x010, 0x020... 0x0A0, 0x0B0, etc.)? Go to the row with 0xD0. The first value next to that offset label wiil be located at 0xd0. Then 0xd1, 0xd2, 0xd3, 0xd4, etc.

So you want to change 02 BF FD 40 to 02 EE FD 11
If your speedometer is 240 kmh, try this one below.
Try 02CF FD30 (scales it for ~240 kmh)

Maybe that "end" value takes into account that the cluster doesn't start until 10km/h, making it effectively a 240km/h scale or something. Either way 240km should "fix" the difference - guess the error is larger on newer clusters
 
#98 ·
I have e46 m3 2001. my car has 265-35-18 square setting. So the diameter of the wheel and tire gets bigger than factory spec, thus the speedometer reads almost 10% higher than actual speed. It actually bothers me a bit. I use M3 for track day for most occasion.

in this case What should I do to make speedometer to read actual speed? Should I run PAsoft and go to IKE then change number in "Distance / Speed values" and drive the car on the road and change the number again until satisfied?
 
This is an older thread, you may not receive a response, and could be reviving an old thread. Please consider creating a new thread.
Top