MembersPage/GergelyLezsak/IdleControl/Firmware (2005-09-07 09:59:30)

IAC Firmware changes

PWM switched ground to pin1 and pin3 moves the valve to opposite directions, if pin2 has stable 12V+ supply. Connecting pin1 to GND closes the valve.

Control relatively simple. Some changes and things to-check required in idle_solenoid() :

Changed the end of idle_solenoid() in iac.c so it sets 2 output channels instead of one: \n

        cli();
        digitalout(config.iac_sol_channel, output);
        sei_nop_cli();
        digitalout(config.iac_sol_channel + 0x10, output ^ 0x80 );
        sei();

config.iac_sol_channel has been set to 0x36 (stepper channel A)

This way 0x46 (stepper channel B) is inverted. Connections are according to GenBoard/Manual/DigitalOut/Table.

IAC control is working this way, I can use mdh/mdi commands and idle changes. For warm engine value around mdi70 seems a good approximation for 900 rpm. I've found that small changes to value doesn't reflect in rpm immediately (or at all). Big changes (like mdiff :) are noticeable promptly.

Idle controlled by GenBoard, but the idle controller (reference positions, ign-adv based control, iac-PID) is not yet tuned. Kindof instable now, see logs:

Definitely relative heavy actuator couldn't cope with such a high PWMming (2kHz), decreasing control frequency was reasonable. MembersPage/BengtR measured frequency from couple of 'similar' (but different part ie. Bosch part number vice) valves, they all were controlled with 50 to 150 hz signals.

I've modified the firmware to call the idle solenoid code with 100Hz frequency (20 times slower, than original solenoid freq in GenBoard). It seems to be working now, changes like 1-2 (hex) iac values reflected quickly in rpm.

This is a chart about it:

iac-graph20050828.gif

As you might see on the picture, I started the engine, where 100% IAC happened, then falled back to "normal" levels, then fixed the setting to 70(?) manually, and at the end set it to 0.

I think that IAC behaviour (description above) happens quite normally when PID target rpm is not reached. However when cranking and immediately after the engine has started this causes bit high rpm. Note - that this is somewhat the kind of behaviour that original ECU's (Bosch, Weber, Siemens etc.) also has.

Adjusting gain and/or pid integrator values, rpm falling time to regulated idle rpm could be adjusted.

It's only during start, and after that PID is correcting values slightly. 2200 rpm is actually my overrun fuelcut limit, I guess it'd be much higher (@iac 100%) without that.

Using similar IAC valve? Check my firmware!

All above is based on firmware v14rc1. Be careful of using the very next channel related to config.iac_sol_channel since it is hardcoded to produce my inverted IAC signal!

Can you provide a patch in "diff -r -U 5 -B olddir newdir" format ?

[HERE] you are. However I'm not sure it's usable :)

If this control going OK we might change the code to be configurable (instead of harcoding).