Still playing with boost, need some advice!
Thread Starter
Evolved Member
iTrader: (6)
Joined: May 2006
Posts: 731
Likes: 0
From: From Vegas to Reno
JCS, im almost positive I got that map from you on the other forum. I'll email it you though to double check. Need to power up the laptop, so will be before end of tonight. I need to jump on there and do some tuning anyway hehe.
Evo Kid, does this help? :
Most Evo ECUs don't know and can't know the boost level, so we probably need to stop thinking about boost and think about load, load targets and load errors. The closed loop control subject is load.
Target load = desired + offset. Wastegate duty is then ramped up or down using the difference between present and target load and looking up the adjustment from the error table. Maximum wastegate duty places an upper limit on how far it can ramp up.
Regarding the occasions where desired load is used, there are checks in the code that constrain the system related to coolant temperature and lots of other variables. I don't have an exact definition of when the system is used or not, but if you had an unachievable load target for your present RPM and throttle position, then ramping up to the maximum duty for that RPM zone wouldn't matter too much. You can get "integral wind up" on some boost control systems if the maximum duty cycle is too high and you are at constant part throttle with a throttle unaware "boost" target, but
seem to set the maximum wastegate and the restrictors to control overboost.
jmoudry, the offset is a way of keeping the tables to byte size whilst still having detail in there.
Most Evo ECUs don't know and can't know the boost level, so we probably need to stop thinking about boost and think about load, load targets and load errors. The closed loop control subject is load.
Target load = desired + offset. Wastegate duty is then ramped up or down using the difference between present and target load and looking up the adjustment from the error table. Maximum wastegate duty places an upper limit on how far it can ramp up.
Regarding the occasions where desired load is used, there are checks in the code that constrain the system related to coolant temperature and lots of other variables. I don't have an exact definition of when the system is used or not, but if you had an unachievable load target for your present RPM and throttle position, then ramping up to the maximum duty for that RPM zone wouldn't matter too much. You can get "integral wind up" on some boost control systems if the maximum duty cycle is too high and you are at constant part throttle with a throttle unaware "boost" target, but
seem to set the maximum wastegate and the restrictors to control overboost.jmoudry, the offset is a way of keeping the tables to byte size whilst still having detail in there.
Last edited by jcsbanks; Oct 1, 2006 at 02:55 AM.
so....
Load (car is experiancing) - 240 @ 3500rpm
# in desired load table - 159.4 @ 3500rpm
# in load offset - 80 @ 3500rpm
......................... = 239.4 @ 3500rpm
WG duty - 90
So with that equation the boost solenoid would run a WG duty of 90, right?
now if this happened..
Load (car is experiancing) - 260 @ 3500rpm
# in desired load table - 159.4 @ 3500rpm
# in load offset - 80 @ 3500rpm
......................... = 239.4 @ 3500rpm
Now the load is +8% off
Turbo error correction @ +8% is -5.3 WG duty
So a WG duty of 90, would actully be 84.7, right??
I now know why puttin all 159s in the desired load table make taper go away..
Say you hittin 240 load @ 3500 and 200 load @ 7000.
If all you tables say 159 + the offset, 80, that mean from 3500-7000, you target load is 240.
Now at 3500 you hit that, so the WG duty doesnt change but at 7000 your @ 200, which is 17% under target
Turbo error corr. @ -17% is +8 WG duty.
Load (car is experiancing) - 240 @ 3500rpm
# in desired load table - 159.4 @ 3500rpm
# in load offset - 80 @ 3500rpm
......................... = 239.4 @ 3500rpm
WG duty - 90
So with that equation the boost solenoid would run a WG duty of 90, right?
now if this happened..
Load (car is experiancing) - 260 @ 3500rpm
# in desired load table - 159.4 @ 3500rpm
# in load offset - 80 @ 3500rpm
......................... = 239.4 @ 3500rpm
Now the load is +8% off
Turbo error correction @ +8% is -5.3 WG duty
So a WG duty of 90, would actully be 84.7, right??
I now know why puttin all 159s in the desired load table make taper go away..
Say you hittin 240 load @ 3500 and 200 load @ 7000.
If all you tables say 159 + the offset, 80, that mean from 3500-7000, you target load is 240.
Now at 3500 you hit that, so the WG duty doesnt change but at 7000 your @ 200, which is 17% under target
Turbo error corr. @ -17% is +8 WG duty.
Generally the right idea, but my understanding is that the WG duty is a modification on the previous WG duty rather than being based directly on maximum duty and the error - it integrates or ramps up and down. You can say that if the boost error is zero it will stay the same.
The error is load-(desired+offset) rather than load/(desired+offset).
"Now at 3500 you hit that, so the WG duty doesnt change but at 7000 your @ 200, which is 17% under target" 40 load under target. The boost correction table doesn't go to 40 so it will just go to the end and apply the steepest ramp rate.
"Turbo error corr. @ -17% is +8 WG duty." It will quickly ramp to maximum duty cycle and not dip below until the boost exceeds target. This is why the maximum duty cycle controls overboost.
The error is load-(desired+offset) rather than load/(desired+offset).
"Now at 3500 you hit that, so the WG duty doesnt change but at 7000 your @ 200, which is 17% under target" 40 load under target. The boost correction table doesn't go to 40 so it will just go to the end and apply the steepest ramp rate.
"Turbo error corr. @ -17% is +8 WG duty." It will quickly ramp to maximum duty cycle and not dip below until the boost exceeds target. This is why the maximum duty cycle controls overboost.
Originally Posted by jcsbanks
Generally the right idea, but my understanding is that the WG duty is a modification on the previous WG duty rather than being based directly on maximum duty and the error - it integrates or ramps up and down. You can say that if the boost error is zero it will stay the same.
If you know that from disassabling the ECU, then I believe you. But I think that it is based on max WG duty and the error. This is just what I think, as I have played with WG duty and turned the error off and on many times.
The error is load-(desired+offset) rather than load/(desired+offset).
"Now at 3500 you hit that, so the WG duty doesnt change but at 7000 your @ 200, which is 17% under target" 40 load under target. The boost correction table doesn't go to 40 so it will just go to the end and apply the steepest ramp rate.
"Turbo error corr. @ -17% is +8 WG duty." It will quickly ramp to maximum duty cycle and not dip below until the boost exceeds target. This is why the maximum duty cycle controls overboost.
If you know that from disassabling the ECU, then I believe you. But I think that it is based on max WG duty and the error. This is just what I think, as I have played with WG duty and turned the error off and on many times.
The error is load-(desired+offset) rather than load/(desired+offset).
"Now at 3500 you hit that, so the WG duty doesnt change but at 7000 your @ 200, which is 17% under target" 40 load under target. The boost correction table doesn't go to 40 so it will just go to the end and apply the steepest ramp rate.
"Turbo error corr. @ -17% is +8 WG duty." It will quickly ramp to maximum duty cycle and not dip below until the boost exceeds target. This is why the maximum duty cycle controls overboost.
1)^^
2) I think error is load/(desired+offset) because it says % in the side bar. Also if it was that way (a percentage), it would make it so the ECU could correct 40 under load target (since that would be about 17% and that is in the error correction table). ALso, I think that error correction controls over boost, not the max WG duty.
Last edited by Evo_Jay; Oct 1, 2006 at 04:28 AM.
The code does appear to update a previous WG duty value each cycle. The error is calculated using a subtraction not a division - the unit of load shows as % in ECUflash, so you could still have a % by subtracting one from the other. I've not spent a lot of time in this code, and I am a beginner, and the code is convoluted and does funny things, so I may well be wrong! Here is the code:
Code:
; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ sub_40570: ; CODE XREF: sub_40110+22p sts.l pr, @-r15 mov.l r14, @-r15 mov r15, r14 mov.l r1, @-r15 mov.l r2, @-r15 mov.l r8, @-r15 mov r4, r1 mov.l @(h'128,pc), r2 ; [000406A8] = h'FFFF6EA8 ; WGduty mov.w @r2, r2 mov.l @(h'120,pc), r10 ; [000406A4] = h'FFFF6BE4 ; gear ratio of some sort mov.w @r10, r10 mov.l @(h'118,pc), r11 ; [000406A0] = word_1E04 mov.w @r11, r11 cmp/hs r11, r10 ; unused high load low gear bf loc_40596 ; it will be false and branch mov.l @(h'11C,pc), r13 ; [000406AC] = unk_1656 mov.w @r13, r13 bra loc_4059A nop ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_40596: ; CODE XREF: sub_40570+1Cj mov.l @(h'118,pc), r13 ; [000406B0] = unk_1654 mov.w @r13, r13 ; 000a loaded whatever loc_4059A: ; CODE XREF: sub_40570+22j mov.l @(h'118,pc), r0 ; [000406B4] = h'FFFF6BA6 mov.w @r0, r0 tst #h'11, r0 ; true if 11&R0 is 0 bf loc_405AA mov.l @(h'114,pc), r0 ; [000406B8] = h'FFFF6E9C mov.w @r0, r0 tst #h'20, r0 ; true if 20&R0 is 0 bt loc_405B0 loc_405AA: ; CODE XREF: sub_40570+30j mov.w @(h'D8,pc), r2 ; [00040686] = h'80 bra loc_405B8 nop ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_405B0: ; CODE XREF: sub_40570+38j mov.l @(h'104,pc), r0 ; [000406B8] = h'FFFF6E9C mov.w @r0, r0 tst #h'10, r0 ; true if 10&R0 is 0 bt loc_405C0 loc_405B8: ; CODE XREF: sub_40570+3Cj mov.l @(h'2D8,pc), r10 ; [00040894] = h'FFFF6832 mov.w r13, @r10 bra loc_40672 nop ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_405C0: ; CODE XREF: sub_40570+46j mov.l @(h'2D0,pc), r10 ; [00040894] = h'FFFF6832 mov.w @r10, r10 tst r10, r10 bf loc_40672 ; branch if r10 not zero, 40672 doesn't change WG duty and exits mov.l @(h'2C8,pc), r10 ; [00040894] = h'FFFF6832 mov.w r13, @r10 ; move a in otherwise mov.l @(h'2C0,pc), r10 ; [00040890] = h'FFFF6B18 ; load mov.w @r10, r10 extu.w r10, r10 shlr r10 ; half mov.l @(h'2B4,pc), r11 ; [0004088C] = word_1670 ; boost load offset mov.w @r11, r11 extu.w r11, r11 mov.l @(h'2E8,pc), r12 ; [000408C4] = h'FFFF6EAC mov.w @r12, r12 extu.w r12, r12 add r11, r12 add #h'20, r10 ; ' ' mov r10, r4 ; r4=$20+load/2 mov r12, r5 ; r5=ram6eac+offset mov.l @(h'29C,pc), r10 ; [00040888] = sub_F0C jsr @r10 ; sub_F0C nop extu.w r0, r0 shll2 r0 ; r0=2(($20+load/2)-ram6eac-offset) mov r0, r4 mov.l @(h'28C,pc), r10 ; [00040884] = sub_590 jsr @r10 ; sub_590 ; limit r0 to word length nop mov.l @(h'284,pc), r11 ; [00040880] = h'FFFF6996 mov.w r0, @r11 mov.l @(h'27C,pc), r4 ; [0004087C] = unk_62D6 ; Turbo dynamics error scaling mov.l @(h'274,pc), r10 ; [00040878] = sub_CC6 jsr @r10 ; sub_CC6 ; lookup, return result at pointer at start of table nop mov.l @(h'26C,pc), r4 ; [00040874] = unk_388E ; Turbo dynamics mov.l @(h'264,pc), r10 ; [00040870] = sub_C28 jsr @r10 ; sub_C28 nop extu.w r0, r0 extu.w r2, r10 add r0, r10 ; r10=wgduty+adj mov r10, r4 mov.w @(h'6C,pc), r5 ; [00040686] = h'80 mov.l @(h'26C,pc), r10 ; [00040888] = sub_F0C jsr @r10 ; sub_F0C ; corrected for 128 signed duty adj nop mov r0, r8 ; save in r8 mov.l @(h'A4,pc), r4 ; [000406C8] = unk_6302 ; unknown mov.l @(h'254,pc), r10 ; [00040878] = sub_CC6 jsr @r10 ; sub_CC6 nop mov.l @(h'98,pc), r4 ; [000406C4] = unk_387E ; unknown mov.l @(h'244,pc), r10 ; [00040870] = sub_C28 jsr @r10 ; sub_C28 nop extu.w r0, r0 mov.l @(h'8C,pc), r10 ; [000406C0] = unk_1658 mov.w @r10, r10 extu.w r10, r10 extu.w r8, r4 mov r10, r5 mov r0, r6 mov.l @(h'7C,pc), r10 ; [000406BC] = sub_5A8 jsr @r10 ; sub_5A8 nop extu.w r0, r0 extu.w r1, r1 add r1, r0 mov r0, r4 mov.w @(h'36,pc), r5 ; [00040686] = h'80 mov.l @(h'238,pc), r10 ; [00040888] = sub_F0C jsr @r10 ; sub_F0C nop extu.w r0, r4 mov #0, r5 mov.w @(h'28,pc), r6 ; [00040684] = h'C8 mov.l @(h'60,pc), r10 ; [000406BC] = sub_5A8 jsr @r10 ; sub_5A8 nop extu.w r0, r0 mov.w @(h'20,pc), r10 ; [00040686] = h'80 add r10, r0 mov r0, r4 mov r1, r5 mov.l @(h'21C,pc), r10 ; [00040888] = sub_F0C jsr @r10 ; sub_F0C nop extu.w r0, r2 loc_40672: ; CODE XREF: sub_40570+4Cj ; sub_40570+56j mov.l @(h'34,pc), r10 ; [000406A8] = h'FFFF6EA8 mov.w r2, @r10 mov.l @r15+, r8 mov.l @r15+, r2 mov.l @r15+, r1 mov.l @r15+, r14 lds.l @r15+, pr rts nop ; End of function sub_40570
^^ Yeah, I know nothing, and I mean nothing bout code.
My statements were just from my experiances messin with the boost control settings (I've probably flashed 20 different boost settings).
My statements were just from my experiances messin with the boost control settings (I've probably flashed 20 different boost settings).









