Boost control

This page is about GenBoard-based boost controlling of a stock BMW 745i (M106) turbo engine.

Mechanical facts


Question: which valve to use? -Stock bmw or the one from webshop?

As everyone else, I'd go with an unused injector output. Since I'm already using the first six channels (0-5 or A-F), I chosed the next free, according to GenBoard/Manual/DigitalOut/Table: INJFET-6, 40, EC36 pin 6, Inj G, 10 A.

After installing the valve mechanically, pneumatically (install a T-split in pipe-from-compressor-to-wastegate, and attach valve on the new end), and electrically (+12V, EC36 pin 6), I want to test the solenoid whether it's opening/closing with forced mdhXX commands.

Because injector outputs are not actuated directly, but through a look-up in h[0] table, I need to address it using h[0] table offsets.

In config, h[0] table is : h[0]=08 02 20 04 10 01 40 80

My desired channel's mask -in DigitalOut? table- is 40, so this is the 6th position (numbering 0..7) in my h[0] table, so I will switch it OFF using mdh60, and switch it ON with mdhe0 (60h+80h = E0).

-Also I'll use boost_channel=60 in config, but first we can go for a ride with valve forced open and forced closed. We should see similar boost values to previous minimum/maximums when boost reference were disconnected or connected directly (without boost control).

I prepare for two kind of problems:

1. Cannot reach maximum boost, even with valve open (path: turbine and wg pressure let go into air-filter). This should mean, that even when valve is open, wastegate still sees pressure. To do: need to restrict the pipe coming from compressor to a size which is closer to boost-valve's throughput.

2. Get higher boost than spring-based minimum (0.3bar), even when valve is closed. If valve is really closed, this means pressure-leakage in connecting pipes.

OK. If everything goes well, I can step forward to get some advanced (pwm-based) control over switching it on/off.

It's a PWM-controlled valve, so I need to set some manual PWM values on it to see where (which reference opening-position) to start later, when using it in PID-based boost-control.

Current firmware is only capable force-controlling PWM devices for IAC. So -for the sake of pwm-testing - I'll sacrifice electronic idle control for a while. I need to make some mechanical idle and config IAC channel to my boost-valve (iac_sol_channel=60). In this case I don't need to disable dual-iac (BMW style) config, but I'm aware that it's actuating the very next (70) channel also, which is inj mask 80 equals INJ H, disconnected in my config.

If it's done, I should hear my new idle valve (which is the boost control valve) buzzing, and I can force it to different PWM-positions using mdi01-mdiff commands. I'll check it's throughput with different mdi values by blowing-in air by mouth. If it's seems suffice, let's go for a ride, and check maximum boost values with different mdi values.

After all, I'll get some idea about usable reference positions.

let's say (fiction, not reality yet) I'll see:

I target 1 bar boost (200 kPa MAP), so go for the a0 = 63% opening.

Valve reference position can be set by boost_conf 3-2 bits.

From the source-code:

// config.boost_conf bit 3:2 (reference position)

// configures offset (values: 1/5, 2/5, 3/5, 4/5 of 4096)

So, for example I'm going for (63% opened) =~ 3/5 reference position that means "10" binary for bits 3:2, which is 8h.

boost_conf bit7:4 is PWM period in 8 msec units. Normally 40 or 48 msec for 25 or 21 Hz.

So for example I'm going for 21Hz -> 48msec = 6*8msec. 6 dec = 6 hex, but it means 60h for the 7:4 bit position.

boost_conf bit0 shows whether config is for MAP or BOOST target. I've no extra MAP sensor to measure boost before throttle plate, so settle with MAP target. bit0 should be 1h.

This way boost_conf will be 8h + 60h + 1h -> 69h

config variables

boost_channel=60 # inj G

boost_conf=69 # MAP target, 48Hz, 2/5 opened reference position

boost_targetoffs=00 #not needed for MAP target

boost_minpressure=34 # 104kPa in 2kPa units

  1. PID input is in 1/8 kPa units
  2. PID output is -2048..2047
boost_pid_kp=26 # Fero's default

boost_pid_ki=40 # Fero's default

boost_pid_kd=10 # Fero's default

boost_pid_ilimit=52 # Fero's default

  1. the multiple boost_pid_ki * boost_pid_ilimit=5248 sounds good, anything close to 6000 is nice (above 8192 would be stupid).
  1. boost table is in 2KPa units
  2. (not dependent of kpa_conf)
b[0]=44 4A 50 56 60 64 64 64 64 64 64 64 # max 200kPa MAP

t[0]=10 40 60 80 A0 C0 F8 FF #allow it grow gradually in percents