Closed Loop Ignition Timing Control

I have been busy over the last few weeks with various things, but have now completed most of the practical work on my project and am now at the stage of writing up the report/dissertation. I have successfully managed to achieve closed loop ignition timing control by using the Stellaris Launchpad development board to directly interface with the optical encoder on the engine and the pressure sensor charge amplifier (this replaces the AVL IndiSet 620 in my system).

ECU in black on left, angle of peak pressure and optical encoder interface on right. Connected together via serial

I have written some code which triggers a pressure sensor sample from the ADC channel whenever a pulse from the optical encoder is detected. An algorithm is used to detect the peak pressure over the engine cycle and store the angle at which this pressure occurs. At the end of the cycle, this angle is transmitted over a serial connection to my ECU, which uses a PID algorithm to adjust the ignition timing in order to maintain the angle of peak pressure at a set point. For maximum torque, the angle of peak pressure appears to need to be around 20 degrees after TDC.

This now means that I now don’t have to use an ignition map at all, and the ignition timing is always perfect under all engine operating conditions (in theory, although after heavy transitions, there is a settling period). This would be great for use on a vehicle if the sensor didn’t cost thousands of pounds! However, there are likely much cheaper methods for detecting when peak pressure occurs. This could perhaps be done with an acoustic sensor, similar to a knock sensor (or maybe even a knock sensor could be used!).

I recorded a load of data to demonstrate the operation of the system, and will put this up at some point.

11 thoughts on “Closed Loop Ignition Timing Control

  1. Chai

    I have question to you. I try use Arduino 328p-pu control ignition coil after coil spikes arduino and pc not connect.How to make Connectivity without missing?
    I use Serial Monitor see all data in arduino.

    1. Scott Snowden Post author

      Yes – this is a problem I had too. You would want to use an opto-isolator between the control electronics and the ignition coil signal. You may also be able to use a ferrite to try and remove noise on control cables.

  2. Anders

    Thank you for sharing your projects! I am actually working on my own simple EIS for my VW aircooled engine. Your blog has been a big help to me! I am new to arduino and programming, so I am looking for someone to help me with my code. I was wondering if you could help me? My system is based on a Hall latch sensor, two magnets on the flywheel and one wasted spark Vw coil pack with built in ignitor/trigger. Could I send you my code for feedback?

    1. Scott Snowden Post author

      Hi, sorry for the delay in replying! I would be really interested to see your code and can let know know any feedback.

    1. Scott Snowden Post author

      I was able to run my engine up to speeds of around 6000RPM at which point I believe the speed of the software was becoming a limitation, however with a bit more optimisation I’m sure it could do more. It’s surprising what you can do with quite a basic chip!

  3. Yuri

    Hello, I apologize for my English!)) Google translator helps! Tell me I can use your development as an Ignition system with a pressure sensor and an optical sensor? My engine develops speeds up to 13,000 and two cylinders. I’ll be thankful for any help!) )

  4. Divanshu Dodeja

    Can I get the code for the engine simulator which you are using on Stellaris Launchpad? I am too working on my final year project on ECU.


Leave a Reply

Your email address will not be published. Required fields are marked *