E46 Fanatics Forum banner
Status
Not open for further replies.

DIY: E46 cluster gauges definitions

3.1K views 0 replies 2 participants last post by  KamilFKH  
#1 ·
I used the temperature gauge mod for E46 cluster from Mr.Philadelphia 2013 thread (TerraPhantm's & Silbervogel's contribution) since end of 2015 and based on their work I modified and rescaled my friends drift car cluster fuel gauge to fit and properly indicate amount of fuel in his custom made smaller, a fuel pump side pocket only petrol tank in 2017, so based on all the info from the credited above and even uncredited guys from all the available forums worldwide, I resolved most but not all of the basic principles, how the gauges are defined. My further investigation would not be possible without their work at all as they paved the most of the path to this knowledge. I investigated a while speedometer and tachometer definitions then and I found them out. They became useful when I decided to integrate M3 SMG cluster into my diesel Touring and I chosen to replace the standard 315 kmh/9000 RPM M3 cluster face with my own 250 kmh/5000 RPM Non-M cluster face design.

The E46 clusters, both Non-M and M3, can be divided into 3 groups based on time when they were produced. They are diferentiated between each other by their coding index (CI number). The higher coding index, the newer cluster for both Non-M and M3 clusters. Non-M clusters have coding index from 02 to 08 and the M3 clusters then from 20 to 24 respectively throughout the production. This is to not allow the mutual use of the clusters in wrong car version. The 3 groups of clusters are Pre-facelift clusters (MOTOMETER CI:02 to CI:05 or M3 CI:20 to CI:21), facelift clusters (BOSCH CI:06 or BOSCH M3 CI:22) and facelift redesign clusters (BOSCH CI:07 and CI:08 or BOSCH M3 CI:23 and CI:24).

Despite I found some info for the first two groups too, I focused on the redesign cluster mainly, because they are the only clusters with proper support for the Brake Force Display, that I am a big fan of. The redesign clusters are all almost the same from the EEPROM data and coding data point of view and there are just two differences between them.
  • The difference between the older CI:07/CI:23 to newer CI:08/CI:24 cluster is just one coding function is added in newer clusters in comparison with the older clusters. It is ATEMP_WARNUNG_KALTLAND function (LOW OR FREEZING OUTSIDE TEMPERATURE WARNING). Some functions in newer clusters have extended parameters count, but it does not change the data distribution range.
  • The difference between the standard CI:07/CI:08 to M3 CI:23/CI:24 clusters is, that the standard cluster has extended coding data to control yellow low oil level warning lamp in EEPROM addresses #0E2 to #113 containing 15 extra functions and maps. The M3 clusters have the area filled with just #FF. Fortunately, the firmware of the clusters seems to be the same or the very similar and after cluster coding index change (inside the EEPROM editing the data from CI:23 to CI:07 or from CI:24 to CI:08) to allow M3 cluster to be coded inside the Non-M car and recoding the cluster, the Yellow oil level warning lamp starts to function. Some functions in Non-M clusters have extended parameters count compared to M3 clusters, but it does not change the data distribution range.
These are the definitions of the individual gauges:

Speedometer

Speedometer Correction:

The displayed speed (real speed) is few percent off. To correct this to get the accurate speed reading, please follow the link below.

Link -> TerraPhantm's DIY: Make your speedometer accurate

First two groups of clusters

There is a linear range of the speedometer, the resolution is determined by the final value.
  • Non-M - Range up to 240 kmh last number, up to 250 kmh last mark, at the DSC light corner is cca 237 kmh, straight up is 130 kmh
  • ALPINA - Range up to 300 kmh last number, up to 300 kmh last mark, at the DSC light corner is cca 285 kmh, straight up is 155 kmh
  • M3 - Range up to 300 kmh last number, up to 300 kmh last mark, at the DSC light corner is cca 285 kmh, straight up is 155 kmh
Code:
TACHO_OFFSET               #0D0
TACHO_SKALA_ENDWERT        #0D2
TACHO_SKALA_ENDWERT_KOMPL  #0D4

#00D0 #00D2 #00D4 E46 type and cluster version
--------------------------------------------------------------------
#5F36 #0351 #FCAE ALPINA CI:06             #351 = 849 / 3 = 283 kmh
#4C37 #02BF #FD40 330d Touring CI:05       #2BF = 703 / 3 = 234,3 kmh
#6C17 #02BF #FD40 318i CI:06
#781E #02BF #FD40 320d CI:06
#4B35 #02BF #FD40 320i CI:06
#623B #02BF #FD40 325xi CI:06
#582C #02BF #FD40 325xi CI:06
#4E0B #02BF #FD40 330i CI:06
#6B07 #02BF #FD40 330dA CI:06
#5E0B #02BF #FD40 330dM CI:06
#6B20 #02BF #FD40 330i CI:06
#6726 #02BF #FD40 330iA CI:06
#3621 #032A #FCD5 M3 CI:21                 #32A = 810 / 3 = 270 kmh
#4E1C #032A #FCD5 M3 CI:22                 #32A = 810 / 3 = 270 kmh
What I guess is that the TACHO_SKALA_ENDWERT could represent speed indicated near the corner of the DSC light, that is why I noted that speed higher, in the gauge description.

Despite the ALPINA and the M3 clusters that I met and diagnosed have similar speed gauge face, their TACHO_SKALA_ENDWERT values are different and the M3 value is lower. I cannot say why.
I do not know, what exactly the TACHO_OFFSET represents. My guess is, that after assembly of the cluster, this value is entered at the production line to fine tune the needle position. Some further experimenting could throw the light on its meaning.
The value of TACHO_SKALA_ENDWERT_KOMPL is TACHO_SKALA_ENDWERT XORed with #FFFF.

Redesign cluster
  • Non-M Diesel and Petrol cluster have speedometer range (cca 270°) from zero to max 250kmh, the needle is straight up at 130 kmh, range is linear up to max speed
  • Alpina simulation - from zero to 120 kmh it has scale similar to Non-M speedometer, then the scale changes to 150% of the previous scale, i.e. previous +20 kmh, now represents +30 kmh, it ends at 315 kmh
  • E46 M3 cluster have speedometer range (cca 270°) from zero to max 300, the needle is straight up at cca 155 kmh, range is linear up to max speed
There are two characteristic curves, that define the speedometer operation. First TACHO_VOR_KENNLINIE (Speedometer Accuracy Characteristics) define the intended error of indicated speed and TACHO_KENNLINIE (Speedometer Characteristics) that define speed range layout.

TACHO_VOR_KENNLINIE (Speedometer Accuracy Characteristics)
EEPROM Address: #339
Table length: 7 bytes

This table defines the ratio of the indicated to real speed using byte 03 and 06. The byte 07 is checksum. Rest of table bytes left unresolved as no known gauge principle applies to it. The table data here:

Code:
Car    Byte 01 02 03 04 05 06 07
--------------------------------
E46 M3:     03 00 2D C8 00 31 D6
Non-M:      03 00 23 C8 00 25 CC
RealSpeed:  03 00 01 C8 00 01 CA

E46 M3 data analysis:

03 - UNRESOLVED
00 - UNRESOLVED
2D - 45 dec, is the denominator in the indicated to real speed ratio (real speed)
C8 - UNRESOLVED
00 - UNRESOLVED
31 - 49 dec, is the numerator in the indicated to real speed ratio (indicated speed)
D6 - checksum: XOR all bytes and additional XOR 01
You can set the speed indication error here. When You drive at real speed of 45 kmh/mph, the indication will be 49 kmh/mph. The fraction is 49/45 = 1,0888 => indicates 8,9% more than the real speed is.

Code:
Non-M data analysis:

03 - UNRESOLVED
00 - UNRESOLVED
23 - 35
C8 - UNRESOLVED
00 - UNRESOLVED
25 - 37
D6 - checksum: XOR all bytes and additional XOR 01
You can set the speed indication error here. When You drive at real speed of 35 kmh/mph, the indication will be 37 kmh/mph. The fraction is 37/35 = 1,05714 => indicates 5,7% more than the real speed is.

RealSpeed settings:
To get the indicating error completely rid of, set both parts of the fraction to 1 and You get strictly accurate indication of the speed. The fraction is 01/01 = 1 => 0% error. The real speed values with pre-calculated checksum is presented above.

TACHO_KENNLINIE (Speedometer Characteristics)
EEPROM Address: #340
Table length: 8 bytes

This table defines the speed range layout. The table has 3 points of speed/needle angle where the speed has linear distribution between them. Therefore You can define two areas with the differet speed scale for the speedometer. Non-M and M3 cluster has practicaly one scale for the almost whole gauge, but it is possible that APLINA redesign clusters use this two scale gauge. I saw some pictures of the ALPINA two scale gauges, but I never met one in real, so I cannot tell if it is just some tuning or original ALPINA production. I added that ALPINA gauge simulation below just out of curiosity (no checksum calculated).

The first byte 01 of the table defines number of points in the table, then there are speed values for the points and then there are angle of needle divided by 2 values for the points.

Rich (BB code):
Car    Byte 01 02 03 04 05 06 07 08
-----------------------------------
E46 M3:     03 05 96 9E 00 8A 92 17
Non-M:      03 05 7D 83 00 8A 92 E1
ALPINA sim: 03 05 3C 9E 00 3F 92 CS
E46 M3: linear range up to 315 kmh
03 - number of defined table points
05 - 1st point speed - 05 = 5 (*2 = 10 KMH)
96 - 2nd point speed - 96 = 150 (*2 = 300 KMH)
9E - 3rd point speed - 9E = 158 (*2 = 316 KMH)

00 - 1st point angle - 00 = 0 (*2 = 000°)
8A - 2nd point angle - 8A = 138 (*2 = 276°)
92 - 3rd point angle - 92 = 146 (*2 = 292°)

17 - checksum: XOR all bytes and additional XOR 01

Non-M: linear range up to 250 kmh
03 - number of defined table points
05 - 1st point speed - 05 = 5 (*2 = 10 KMH)
7D - 2nd point speed - 7D = 125 (*2 = 250 KMH)
83 - 3rd point speed - 83 = 131 (*2 = 262 KMH)

00 - 1st point angle - 00 = 0 (*2 = 000°)
8A - 2nd point angle - 8A = 138 (*2 = 276°)
92 - 3rd point angle - 92 = 146 (*2 = 292°)

E1 - checksum: XOR all bytes and additional XOR 01

ALPINA sim: 2 scales, same linear like Non-M up to 120kmh, from 120kmh up to 315kmh linear,
but with 150% speed of lower scale (what was 20kmh up to 120kmh is now 30kmh above 120kmh)
03 - number of defined table points
05 - 1st point speed - 05 = 5 (*2 = 10 KMH)
3C - 2nd point speed - 3C = 60 (*2 = 120 KMH)
9E - 3rd point speed - 9E = 158 (*2 = 316 KMH)

00 - 1st point angle - 00 = 0 (*2 = 000°)
3F - 2nd point angle - 3F = 63 (*2 = 126°)
92 - 3rd point angle - 92 = 146 (*2 = 292°)

CS - checksum: XOR all bytes and additional XOR 01

If You would like to define Your own speedometer scale it is handy to know the angle for the e.g. 10 kmh difference for standard speed scales.

The speed at the begining of the gauge at needle angle 0° is 10 kmh, the target gauge speed is at needle angle of 276°, so there are indicated speeds from 10 to 250 kmh or from 10 to 300 kmh and the scale is 240 kmh or 290 kmh in range of 276°.

Then You can calculate, how many degrees is for the 10 kmh.

Code:
Car    degrees/(range/10) = degrees for 10 kmh
M3         276/29         = 9,517°
Non-M      276/24         = 11,5°
Simulated ALPINA
Alpina LO  126/11         = 11,45° (=11,5° approximated, cause of rounding)
Alpina HI  (292-126)/(316-120)*10 = 8,47°
The speedometer gauge is symmetric, so the half of the needle angle should point straight up, then 276°/2 = 138°. To check, wheter the calculation of degrees for 10 kmh is correct, I calculated the indicated speed at the straight up point.

For Non-M cluster 138° divided by 11,5° for the 10kmh we get 12, which is 120 kmh and when starting at the 10kmh at 0° we get the speed 130 kmh. This is the value of Non-M speedometer with the needle straight up.

For M3 cluster 138° divided by 9,517° for the 10kmh we get cca 14,5, which is 145 kmh and when starting at the 10kmh at 0° we get the speed 155 kmh. This is the value of M3 speedometer with the needle straight up.

Tachometer

First two groups of clusters

There is a linear range of the tachometer, the resolution is determined by the final value (M3 cluster could have exception - see DREHZAHL_KENNLINIE).
  • Non-M - Range up to 6000 RPM for diesel, up to 7000 for petrol cars
  • ALPINA - Range up to 7500 RPM
  • M3 - Range up to 9000 RPM
Code:
DZM_OFFSET                #0D6
DZM_SKALA_ENDWERT         #0D8

#00D6 #00D8 Popis
--------------------------------------------------------------------
#5E35 #172A 330d Touring CI:05       #172A = 5930 RPM  (6000 RPM diesel)
#5837 #1B12 318i CI:06               #1B12 = 6930 RPM  (7000 RPM benzin)
#4409 #1D06 ALPINA CI:06             #1D06 = 7430 RPM  (7500 RPM Alpina)
#603E #2282 M3 CI:22                 #2282 = 8834 RPM  (8904 vs 9000 RPM M3)
The DZM_OFFSET can have the similar meaning as the TACHO_OFFSET.

The DZM_SKALA_ENDWERT represents the maximal value of the indicated RPM decreased by 70 RPM (7500-70=7430, 6000-70=5930, 7000-70=6930).

The M3 cluster has in addition one more characteristic curve at the EEPROM address #122, the M3 clusters CI:20 to CI:22 has assigned kennlinie 3 in E46. The meaning of this curve is still unresolved.

Definition of the curve:

Code:
FUNCTION KEYWORD               ADDRESS (LENGTH)                                      MASK
        PARAMETER KEYWORD              DATA
-------------------------------------------------------------------------------------

DREHZAHL_KENNLINIE             00000122 (14)                                         FF,FF
        kennlinie_03                   00,46,00,00,23,28,1E,8A,23,28,1E,8A,23,28,1E,8A
                                       23,28,1E,8A
        kennlinie_02                   00,46,00,00,01,90,01,22,03,84,02,85,05,DC,04,E5
                                       23,28,1E,8A
Redesign cluster

The tachometer gauge is defined by the table DREHZAHL_KENNLINIE (Tachometer Characteristics). The principle of the table is similar to the TACHO_KENNLINIE, the first byte of the table defines number of points in the table, then there are RPM values for the points and then there are angle of needle divided by 2 for the points. The scales are linear between the individual points. With 5 points table You can define 4 individual scales within the RPM range. The actual table data is defined just for one scale for the whole RPM range, see below. To integrate M3 redesign cluster into my diesel Touring, I redefined the RPM range to better match diesel RPM and to have full use of the available shift lights.
  • Diesel has tachometer range from zero to max 6000 RPM in 240°
  • Petrol has tachometer range from zero to max 7000 RPM in 240°
  • Alpina petrol has tachometer range from zero to max 7500 RPM in 240°
  • E46 M3 has tachometer range from zero to max 9000 RPM in 240°
  • KamilFKH M3 custom diesel tachometer range is similar to M3 scale from zero to 1000 RPM, then goes from 1000 RPM linear to max 5000 RPM at angle of 240° to use the shift lights at correct RPM, they are redefined to range from 2500 to 5000 RPM.
DREHZAHL_KENNLINIE 0000032E (0B) FF (Tachometer Characteristics)
EEPROM Address: #32E
Table length: 11 bytes

Rich (BB code):
Car      Byte 01 02 03 04 05 06 07 08 09 10 11
----------------------------------------------
E46 M3      : 05 01 B2 B2 B2 B2 00 78 78 78 78 (178*50=8900)
Alpina sim  : 05 01 94 94 94 94 00 78 78 78 78 (148*50=7400) - estimated
Non-M petrol: 05 01 8A 8A 8A 8A 00 78 78 78 78 (138*50=6900)
Non-M diesel: 05 01 76 76 76 76 00 78 78 78 78 (118*50=5900)

FKH M3custom: 05 01 14 62 62 62 00 0D 78 78 78 (098*50=4900)
Non-M petrol analysis:
05 - number of defined table points
01 - 1st point RPM - 01 = 1 (*50 = 50 RPM)
8A - 2nd point RPM - 8A = 138 (*50 = 6900 RPM)
8A - 3rd point RPM - 8A = 138 (*50 = 6900 RPM)
8A - 4th point RPM - 8A = 138 (*50 = 6900 RPM)
8A - 5th point RPM - 8A = 138 (*50 = 6900 RPM)

00 - 1st point angle - 00 = 0 (*2 = 000°)
78 - 2nd point angle - 78 = 120 (*2 = 240°)
78 - 3rd point angle - 78 = 120 (*2 = 240°)
78 - 4th point angle - 78 = 120 (*2 = 240°)
78 - 5th point angle - 78 = 120 (*2 = 240°)


KamilFKH M3custom analysis:
05 - number of defined table points
01 - 1st point RPM - 01 = 1 (*50 = 50 RPM)
14 - 2nd point RPM - 14 = 20 (*50 = 1000 RPM)
62 - 3rd point RPM - 62 = 98 (*50 = 4900 RPM)
62 - 4th point RPM - 62 = 98 (*50 = 4900 RPM)
62 - 5th point RPM - 62 = 98 (*50 = 4900 RPM)

00 - 1st point angle - 00 = 0 (*2 = 000°)
0D - 2nd point angle - 0D = 13 (*2 = 026°)
78 - 3rd point angle - 78 = 120 (*2 = 240°)
78 - 4th point angle - 78 = 120 (*2 = 240°)
78 - 5th point angle - 78 = 120 (*2 = 240°)


If You would like to define Your own tachometer scale it is handy to know the angle for the e.g. 1000 RPM difference for standard RPM scales.

The RPM at the target gauge RPM is at needle angle of 240°, so there are indicated RPM from 0 to 6000, 7000, 7500 or 9000 RPM.

Then You can calculate, how many degrees is for the 1000 RPM.

Code:
Car  degrees/RPM = degrees for 1000 RPM
M3       240/9   = 26,666°
Alpina   240/7,5 = 32°
Petrol   240/7   = 34,3°
Diesel   240/6   = 40°
M3 shift lights LED are at the original RPM range from 4000 up to 9000.

Fuel tank

First two groups of clusters

Unresolved yet.

Redesign cluster

The tank gauge is defined in both coding area data and the producer area data. There are two functions in coding data available - TANK_SCHWELLE_RESERVE and TANK_KENNLINIE, then there is TNK_KENNLINIE in the producer area of EEPROM.

TANK_SCHWELLE_RESERVE 000000BC (01) (Fuel tank reserve threshold value)
EEPROM Address: #0BC
Table length: 1 byte

This data contains the amount of fuel in the tank, which the reserve warning light will light up below. The value is amount in litres multiplied by 4, so standard 8 litres reserve represents a value of 32.
8_l 20 (hex)

To change the reserve amount of fuel e.g. to 10 litres, it is enough to change the value to 40 (28 hex)

TANK_KENNLINIE 000000C4 (1E) (Fuel tank Characteristics 1)
EEPROM Address: #0C4
Table length: 30 bytes

Rich (BB code):
Tank type  Byte 01 02 03 04 05    06 07 08 09 10 11 12 13 14 15    16 17 18 19 20    21 22 23 24 25 26 27 28 29 30
------------------------------------------------------------------------------------------------------------------
60_l_literskala    00,08,11,19,21,   00,48,00,99,00,EA,01,3C,01,86,   00,07,0D,14,18,   00,48,00,88,00,C8,01,09,01,33
dad_tank_diesel    00,08,11,19,21,   00,48,00,99,00,EA,01,3C,01,86,   00,07,0D,14,18,   00,48,00,88,00,C8,01,09,01,33
in decimal =>    00,08,17,25,33,      72,  153,  234,  316,  390,   00,07,13,20,24,      72,  136,  200,  265,  307
        right litres     R resistance 0% 25% 50% 75% 100%    left litres   L resistance  0% 25% 50% 75% 100%
        fuel pump side   sensor at the fuel pump              without pump     sensor without the fuel pump

combined_litres 00,15,30,45,57     litres in tank for individual quartes of gauge (15 l = 25%, 30 l = 50%, 45 l = 75% and over 57 l = 100%)

metalltank    00,03,08,11,22,   00,33,00,5A,00,90,00,E6,01,C2,   00,02,05,0B,18,   00,33,00,59,00,8D,00,E3,01,C2
in decimal =>    00,03,08,17,34,      51,   90,  144,  230,  450,   00,02,05,11,24,      51,   89,  141,  227,  450
        right litres     R resistance 0% 25% 50% 75% 100%    left litres   L resistance  0% 25% 50% 75% 100%

combined_litres 00,05,13,28,58     litres in tank for individual quartes of gauge (5 l = 25%, 13 l = 50%, 28 l = 75% and over 58 l = 100%)
TNK_KENNLINIE 0000035A (05) (Fuel tank Characteristics 2)
EEPROM Address: #35A
Table length: 5 bytes

Code:
           Byte 01 02 03 04 05
------------------------------
        00,17,2E,42,5E (hex) angle degrees ° or motor steps for quarter of scale 0% 25% 50% 75% 100%
        00,23,46,66,94 (dec)
Actual consumption/Oil temperature

First two groups of clusters

Code:
KVA_OFFSET                      000000DA (02)
KVA_SKALA_ENDWERT               000000DC (02)
Info awaited...

Redesign cluster

KVA_KENNLINIE (definition of the scale of the gauge under tachometer)
EEPROM Address: #348
Table length: 5 bytes

Rich (BB code):
Car    Byte 01 02 03 04 05
------------------------------
Non-M:      02 00 C8 00 8C 
E46 M3:     02 32 96 00 8C

Non-M - actual consumption:
02 - number of defined table points
00 - 1st value, start of the range = #00 =   0 =  0,0 L/100km
C8 - 2nd value, end of the range   = #C8 = 200 = 20,0 L/100km
00 - 1st angle, start of the range = #00 =   0 =   0°
8C - 2nd value, end of the range   = #8C = 140 = 140°

E46 M3 - engine oil temperature:
02 - number of defined table points
32 - 1st value, start of the range = #32 =  50 =  50°C oil temp
96 - 2nd value, end of the range   = #96 = 150 = 150°C oil temp
00 - 1st angle, start of the range = #00 =   0 =   0°
8C - 2nd value, end of the range   = #8C = 140 = 140°
The switch to select between actual consumption and engine oil temperature not yet resolved. It may be a value in EEPROM or it can be determined by the cluster firmware.

Coolant temperature

This is just sum of Mr.Philadelphia 2013 thread (TerraPhantm's & Silbervogel's contribution)
Link -> DIY: Changing Temperature Gauge Buffer Range with PA...

First two groups of clusters

KUEHLMITTELTEMP_ANZEIGEWI and KUEHLMITTELTEMP_WERT coding functions combines together in one EEPROM map definition of the scale of the coolant temperature gauge
EEPROM Address: #0F0
Table length: 12 bytes

KUEHLMITTELTEMP_ANZEIGEWI defines 6 angles for the points (1° to 6°) start and end of the blue field, start and end of the center buffer and start and end of the red field
KUEHLMITTELTEMP_WERT defines 6 temperatures for those points (1T to 6T)

The EEPROM data are 6 couples of temperature first byte, angle second byte for those points

Rich (BB code):
Car   Couple 1T 1° 2T 2° 3T 3° 4T 4° 5T 5° 6T 6°
Non-M:       OF 00 32 1F 4B 5A 73 5A 7C 94 7D A4
Redesign cluster

KMT_KENNLINIE - definition of the scale of the coolant temperature gauge
EEPROM Address: #34D
Table length: 13 bytes (despite defined as 11 only)

Custom: 06 0F 41 5A 64 78 7D 00 10 2D 2D 4A 52

Custom:
06 - number of defined table points
0F - #0F = 15 = temperature for the start of the blue field
41 - #41 = 65 = temperature for the end of the blue field
5A - #5A = 90 = temperature for the start of the buffer gauge needle straight up
64 - #64 =100 = temperature for the end of the buffer gauge needle straight up
78 - #78 =120 = temperature for the start of the red field
7D - #7D =125 = temperature for the end of the red field

00 - #00 = 0 = angle of the start of the blue field
10 - #10 = 16 = angle of the end of the blue field
2D - #2D = 45 = angle of the start of the buffer gauge needle straight up
2D - #2D = 45 = angle of the end of the buffer gauge needle straight up
4A - #4A = 74 = angle of the start of the red field
52 - #52 = 82 = angle of the end of the red field


I made this overview post to support my description of the M3 cluster integration in my Non-M diesel car. All errors and typos reserved ;)
KamilFKH
 
Status
Not open for further replies.
You have insufficient privileges to reply here.