Individual cylinder knock test - initial results
Individual cylinder knock test - initial results
It doesn't do it as standard, but can be persuaded to. At the end of the knock sum routine there is a variable stored which is "increase in knock sum". I made it run a bit of code:
This code adds the increase in knock sum for that cylinder event to a running total for that cylinder. I store the values at FFFF6600,1,2,3 and then logged then with MUT 2,3,4,5 along with knocksum and other data.
You can see the asymmetry between the cylinders. Each time you see an increase in knock sum (blue) you can see which cylinder it was on, and I don't decay it like the knock sum. If it gets to 255 it will wrap around to zero. When the key is turned off for more than 10 seconds, the counters reset to zero as I put them in an area of RAM that gets cleared in this situation.
I filled with V-power rather than usual Tesco 99 (knocks slightly more on the same map), and it is a warm day and I had the A/C on. The single knock sum of 4 was a lift off, the other 0-3 range is satisfactory, or in the sweet spot IMHO. If I could just retard the cylinder marked as knock3 I think I could get better symmetry, more power and/or more safety. One cylinder shows no knock sum at all.
I believe that knock0 occurs when cyl1 is near TDC (5 deg BTDC), knock1 when cyl3 is near TDC, knock2 when cyl4 is near TDC, knock3 when cyl2 is near TDC. However, the knock sum is calculated from the noise above threshold on the previous cylinder, and knock sum I think is triggered off the rising edge of CAS, but the cylinder index I think is triggered off the falling edge of CAS.
So the bad cylinder MAY be Cylinder #3 or #4, and at present it is difficult to be sure. However, the asymmetry between cylinders suggests that further work would be beneficial. I think I have a way to selectively retard cylinders, so we'd soon see whether we'd matched the right cylinder when we repeat the log.
Code:
mov.l (cylindexbyte),r0 mov.b @r0,r0 extu.b r0,r0 and #3,r0 mov.l (storeadr),r1 add r1,r0 mov.l (knocksumincreasebyte),r1 mov.b @r1,r1 mov.b @r0,r2 add r1,r2 mov.b r2,@r0 mov.l (return),r0 jmp @r0 nop cylindexbyte: .long 0xffff70cf knocksumincreasebyte: .long 0xffff7b51 storeadr: .long 0xffff6600 return: .long 0x0000b8a6
You can see the asymmetry between the cylinders. Each time you see an increase in knock sum (blue) you can see which cylinder it was on, and I don't decay it like the knock sum. If it gets to 255 it will wrap around to zero. When the key is turned off for more than 10 seconds, the counters reset to zero as I put them in an area of RAM that gets cleared in this situation.
I filled with V-power rather than usual Tesco 99 (knocks slightly more on the same map), and it is a warm day and I had the A/C on. The single knock sum of 4 was a lift off, the other 0-3 range is satisfactory, or in the sweet spot IMHO. If I could just retard the cylinder marked as knock3 I think I could get better symmetry, more power and/or more safety. One cylinder shows no knock sum at all.
I believe that knock0 occurs when cyl1 is near TDC (5 deg BTDC), knock1 when cyl3 is near TDC, knock2 when cyl4 is near TDC, knock3 when cyl2 is near TDC. However, the knock sum is calculated from the noise above threshold on the previous cylinder, and knock sum I think is triggered off the rising edge of CAS, but the cylinder index I think is triggered off the falling edge of CAS.
So the bad cylinder MAY be Cylinder #3 or #4, and at present it is difficult to be sure. However, the asymmetry between cylinders suggests that further work would be beneficial. I think I have a way to selectively retard cylinders, so we'd soon see whether we'd matched the right cylinder when we repeat the log.
Nice work John. This is sort of an aside, but it is something that i have thought about often but never asked. Since 1 knock count equals about 1/3 of a degree, does the ECU think in terms of fractions of a degree and if so would it be possible to have greater granularity in our timing maps?
I wonder if the knock prone cylinder would switch if you swapped the injector from the cylinder that knocked the least (or never) with the one that knocked the most or if it's just that way because of design of the IM, fuel rail, cooling system, timing off a fraction of a degree between cylinders, etc.
Good point. Some say it is the exhaust manifold, in the UK they say #3 is lean and recommend a tubular manifold at 500 BHP.
I will test under load tomorrow, but I now have a trim table in RAM. Where the arrow is, one cylinder was retarded 3 degrees at idle.
I will test under load tomorrow, but I now have a trim table in RAM. Where the arrow is, one cylinder was retarded 3 degrees at idle.
EvoM Guru
iTrader: (50)
Joined: Mar 2006
Posts: 9,675
Likes: 132
From: Tri-Cities, WA // Portland, OR
I had always wondered if the frequency of the engine control loop was high enough to sample individual cylinders. So you're sure that it is? Or does the ECU use an interrupt to perform critical measurements at specific crank angles?
Great work! I agree with the injector idea, I've always been thinking that also. (and wondering weather manifold or something else played a part).
Last edited by fostytou; Apr 20, 2009 at 11:21 AM.
Trending Topics
There are 100 and 800Hz control loops, but the knock, injector, ignition stuff is on every CAS interrupt, code I'm changing here is all interrupt based.
To add individual cylinder trim needs only 2 nops and a change of a pointer.
Code:
ROM:000257C0 loc_257C0: ; CODE XREF: sub_256B0+52j ROM:000257C0 ; sub_256B0+F2j ROM:000257C0 ; sub_256B0+F8j ROM:000257C0 ; sub_256B0+10Aj ROM:000257C0 mov.l @(h'29C,pc), r0 ; [00025A60] = accelflag? ROM:000257C2 mov.w @r0, r0 ROM:000257C4 tst #8, r0 ; 0 when not running, 17 at idle/overrun, 1 on throttle ROM:000257C6 nop ; nop ROM:000257C8 mov.l @(h'290,pc), r0 ; [00025A5C] = casflag4? ROM:000257CA mov.w @r0, r0 ROM:000257CC tst #1, r0 ; set when running, clear when not ROM:000257CE bt loc_257F8 ROM:000257D0 mov.l @(h'28C,pc), r0 ; [00025A60] = accelflag? ROM:000257D2 mov.w @r0, r0 ROM:000257D4 tst #h'20, r0 ; set if over 7000 RPM ROM:000257D6 nop ; nop ROM:000257D8 mov.l @(h'290,pc), r0 ; [00025A6C] = CASINDEX ROM:000257DA mov.w @r0, r0 ROM:000257DC extu.w r0, r0 ROM:000257DE mov.l @(h'284,pc), r10 ; [00025A64] = unk_FFFF8CD0 ; change to FFFF8cd0 ROM:000257E0 mov.b @(r0,r10), r11 ROM:000257E2 extu.b r11, r11 ROM:000257E4 add r11, r2 ROM:000257E6 bra loc_257F8 ROM:000257E8 nop
You are the man!
The gap between standalone and OEM ECU is almost invisible now because of the hard work of you and others.
Oh wait... I guess there is a big line between the two... about $1500 for an AEM and $80 for a cable to work with the OEM ECU.
The gap between standalone and OEM ECU is almost invisible now because of the hard work of you and others.
Oh wait... I guess there is a big line between the two... about $1500 for an AEM and $80 for a cable to work with the OEM ECU.
It's absolutely amazing that you can do this and my mind is pretty thoroughly boggled, no doubt, however, given repeatable results with this, how do we actually utilize the results? does that mean we need somebody with four WBO2 sensors and an endoscope to try to find a root cause? Can we change individual cylinders' fueling? Will that actually give us anything useful? I'm not being argumentative I just want to learn something.
A good set of injectors should be flowed to well within 2% and usually 1% across the duty cycle range. Whereas the very good stock intake manifolds are off by double and triple that amount. I have a feeling it is designed like this however. In the end though I have noticed it is always one of the center two cylinders that get taken out. I have my theories but suffice it to say it is independent of fuel injector placement. I'm not saying it isn't worthwhile, just stating the end results of the motors that I have damaged and the ones that I've seen damaged.
to thub,
you can keep the general timing near optimum while helping out a knock prone cylinder with lower timing. three quarters of your motor is making more power than if every cylinder is held to the weakest one.
You could also try a tiny bit fatter injector in the knocking cylinder
you can keep the general timing near optimum while helping out a knock prone cylinder with lower timing. three quarters of your motor is making more power than if every cylinder is held to the weakest one.
You could also try a tiny bit fatter injector in the knocking cylinder


