2005 Passat and 2006 Jeep CRD - ECM Glowplug Control Signal Issue - Arduino Solution
I rarely post to forums, but this is such an unexpected problem I feel I should share.
We have both a 2005 Passat 2.0L TDI and a 2006 Jeep Liberty 2.8L CRD. Two completely different vehicles, with the same symptoms and the same root cause. They both developed difficulty in starting in cold weather, noticeable below 0 celsius, and progressively harder as it gets colder.
I went through quite a lot of trouble to find this, but both vehicles use Bosch glowplug control modules (GCM) and while they weren’t the problem, the pulse-width modulated (PWM) signal from the engine control module was.
I’m a retired electronics technician, so I’ll list all the info I have. With a Fluke DMM, the Passat glowplug voltage would start at 7.8Vdc (rms) for 1 to 2 seconds, then drop to 1.8V for the remainder of the 13 second cycle after you turn the key. This was the same for all glowplugs, and they were all drawing the same current. BTW, I must state that glowplugs or any heating element like them, like in a stove or hot water tank, do not get weak. They’re either good or they’re not, like an incandescent light bulb. And they should glow red brightly when you bench test them, something I didn’t know, though it seems obvious now.
The Passat glowplugs are rated for 11Vdc. While at the 1.8Vrms level a scope on the glowplugs show a 6.6Vp-p pulse at 31hz with a 18% duty cycle. Far too little, you barely see it glow at all at the end of a few 14 second cycles with your hands cupped around it. 11 volts is about 87% of a 12.6V battery, so you should see a pulse duty cycle of 87%. That is, the glowplugs should be on 87% of the time, not the 18% I was seeing. If I connected the glowplugs to the battery, through some resistance wire to drop the voltage to 11V, the car started without difficulty.
I don’t have schematics for this vehicle and some schematics I found online for a previous year show the glowplugs directly connected to the engine control module (ECM). This is incorrect for my Passat and only after I’d opened the ECM and started some continuity checks did I find there’s a separate GCM located under the coolant reservoir.
The GCM is a Bosch# 0281 003 027, VW#038907281C. The nine leads are as follows:
G1-G4 Glowplug leads
87 Switched 12V from ignition
31 Ground
D1 Data out to the ECM
30 Always-on 12V
ST Control signal from the ECM
Inside the GCM there’s one main IC, an ST Microsystems L9524 glowplug controller and four ST P85NF55L MOSFETs that do the actual pulsing of the glowplug voltage. These are obsolete parts but you can still find the datasheets online. After study of the datasheets the input signal from the ECM will be used as a clock for the Data Out line and the input signal pulse should be the inverse of what you want on the glowplugs. So I connected the ST input to a separate PWM signal from an Arduino circuit and found the glowplugs were now getting the correct voltage, ruling out the GCM as the source of the trouble. Since I had the ECM open anyway, I traced the glowplug control signal directly to a Bosch#30554 controller IC. I couldn’t find a datasheet for this one, but I found some replacements available on Aliexpress and others. This is about a 64-pin chip though, so clearly it controls more than just the glowplugs, likely the injector solenoids as well. And because of that it’s likely programmable for timing and the number of cylinders. If replaced, it’s possible I might be able to program it via the Rosstech VSDS, but it may be programmed separately and without information on it I really can’t take that chance. And of course replacing the ECM on either vehicle would be far too expensive.
So as an alternative, I created a low-cost Arduino circuit that inputs the PWM signal from the ECM, synchronizes a new correct PWM signal to it, then outputs it to the GCM.
Our Jeep Bentley manual outlines a control strategy based on the coolant temperature as follows:
Coolant
Temp Wait-To Start Pre-Heat Post-Heat
"Key ON" Lamp "ON" (s) GlowPlugs on (s)
-30C 10 SEC. 35 SEC. 200 SEC.
-10C 10 SEC. 23 SEC. 180 SEC.
+10C 1 SEC. 21 SEC. 160 SEC.
+30C 1 SEC. 20 SEC. 140 SEC.
+40C 1 SEC. 19 SEC. 70 SEC.
+70C 1 SEC. 16 SEC. 20 SEC.
This may not be the way the Jeep was actually programmed since the dashboard glowplug indicator has no bearing on the preheat time and the operator would have no clue to pause for that time before turning the key to start. So I have an LED on the dash that the Arduino flashes when the key is turned and glowplugs are started. It will remain flashing for the preheat period, then stays on steady for the post-heat period. So the operator knows to wait until the flashing stops and it’s on steady before starting the engine. The times in the chart may be overkill. You don’t really need 20 seconds of preheat to start it at 20C, but better too much preheat than not enough.
I happened to have some small boards with an ATTiny85 and a MCP9808 temperature sensor, but any temperature sensor would do. The temperature rating of all the parts made it OK to strap the circuit board to the coolant hose in order to sense the temperature, but one could put this sensor on another board (or use a sensor like a DS18B20) and have only it strapped to the coolant hose. You’d have to modify the code to suit a different sensor of course.
Installation: Cut the wire to the GCM ‘ST’ terminal, connect the end that goes to the ECM to ‘ECM IN’ in the circuit below and the end that goes to the ‘ST’ terminal connect to ‘ST - PWM OUT’. Splice the wire going to the 87 terminal so it goes to both the GCM and Arduino circuit ’87 – Key-on 12V’. Splice the ground to both as well. Add an LED to the dashboard and run leads to the Arduino circuit connections. Best to make all connections plug-in so you can bench-test the circuit if anything goes wrong.
The schematic is as follows:
There is more information in the comments of the code below. The pulseIn() function is sufficient to synchronize the output PWM signal with the ECM, so the ECM can still read the diagnostics from the GCM.
The terminal ‘Tx OUT’ is a diagnostic serial connection that will output the temperature from the sensor, the corresponding times from the interpolated look-up table and indicates Preheat, Posthead and Done when it finishes. After this, the Arduino will stop the PWM output, which will turn off the glowplugs, and then enter sleep mode. In order to read the serial output you’d need a serial converter like the FTDI232 or CH340 that many Arduinos use and a PC with Hyperterminal or just use the serial monitor in the Arduino IDE.
The arduino code is in the attached text file
I rarely post to forums, but this is such an unexpected problem I feel I should share.
We have both a 2005 Passat 2.0L TDI and a 2006 Jeep Liberty 2.8L CRD. Two completely different vehicles, with the same symptoms and the same root cause. They both developed difficulty in starting in cold weather, noticeable below 0 celsius, and progressively harder as it gets colder.
I went through quite a lot of trouble to find this, but both vehicles use Bosch glowplug control modules (GCM) and while they weren’t the problem, the pulse-width modulated (PWM) signal from the engine control module was.
I’m a retired electronics technician, so I’ll list all the info I have. With a Fluke DMM, the Passat glowplug voltage would start at 7.8Vdc (rms) for 1 to 2 seconds, then drop to 1.8V for the remainder of the 13 second cycle after you turn the key. This was the same for all glowplugs, and they were all drawing the same current. BTW, I must state that glowplugs or any heating element like them, like in a stove or hot water tank, do not get weak. They’re either good or they’re not, like an incandescent light bulb. And they should glow red brightly when you bench test them, something I didn’t know, though it seems obvious now.
The Passat glowplugs are rated for 11Vdc. While at the 1.8Vrms level a scope on the glowplugs show a 6.6Vp-p pulse at 31hz with a 18% duty cycle. Far too little, you barely see it glow at all at the end of a few 14 second cycles with your hands cupped around it. 11 volts is about 87% of a 12.6V battery, so you should see a pulse duty cycle of 87%. That is, the glowplugs should be on 87% of the time, not the 18% I was seeing. If I connected the glowplugs to the battery, through some resistance wire to drop the voltage to 11V, the car started without difficulty.
I don’t have schematics for this vehicle and some schematics I found online for a previous year show the glowplugs directly connected to the engine control module (ECM). This is incorrect for my Passat and only after I’d opened the ECM and started some continuity checks did I find there’s a separate GCM located under the coolant reservoir.
The GCM is a Bosch# 0281 003 027, VW#038907281C. The nine leads are as follows:
G1-G4 Glowplug leads
87 Switched 12V from ignition
31 Ground
D1 Data out to the ECM
30 Always-on 12V
ST Control signal from the ECM
Inside the GCM there’s one main IC, an ST Microsystems L9524 glowplug controller and four ST P85NF55L MOSFETs that do the actual pulsing of the glowplug voltage. These are obsolete parts but you can still find the datasheets online. After study of the datasheets the input signal from the ECM will be used as a clock for the Data Out line and the input signal pulse should be the inverse of what you want on the glowplugs. So I connected the ST input to a separate PWM signal from an Arduino circuit and found the glowplugs were now getting the correct voltage, ruling out the GCM as the source of the trouble. Since I had the ECM open anyway, I traced the glowplug control signal directly to a Bosch#30554 controller IC. I couldn’t find a datasheet for this one, but I found some replacements available on Aliexpress and others. This is about a 64-pin chip though, so clearly it controls more than just the glowplugs, likely the injector solenoids as well. And because of that it’s likely programmable for timing and the number of cylinders. If replaced, it’s possible I might be able to program it via the Rosstech VSDS, but it may be programmed separately and without information on it I really can’t take that chance. And of course replacing the ECM on either vehicle would be far too expensive.
So as an alternative, I created a low-cost Arduino circuit that inputs the PWM signal from the ECM, synchronizes a new correct PWM signal to it, then outputs it to the GCM.
Our Jeep Bentley manual outlines a control strategy based on the coolant temperature as follows:
Coolant
Temp Wait-To Start Pre-Heat Post-Heat
"Key ON" Lamp "ON" (s) GlowPlugs on (s)
-30C 10 SEC. 35 SEC. 200 SEC.
-10C 10 SEC. 23 SEC. 180 SEC.
+10C 1 SEC. 21 SEC. 160 SEC.
+30C 1 SEC. 20 SEC. 140 SEC.
+40C 1 SEC. 19 SEC. 70 SEC.
+70C 1 SEC. 16 SEC. 20 SEC.
This may not be the way the Jeep was actually programmed since the dashboard glowplug indicator has no bearing on the preheat time and the operator would have no clue to pause for that time before turning the key to start. So I have an LED on the dash that the Arduino flashes when the key is turned and glowplugs are started. It will remain flashing for the preheat period, then stays on steady for the post-heat period. So the operator knows to wait until the flashing stops and it’s on steady before starting the engine. The times in the chart may be overkill. You don’t really need 20 seconds of preheat to start it at 20C, but better too much preheat than not enough.
I happened to have some small boards with an ATTiny85 and a MCP9808 temperature sensor, but any temperature sensor would do. The temperature rating of all the parts made it OK to strap the circuit board to the coolant hose in order to sense the temperature, but one could put this sensor on another board (or use a sensor like a DS18B20) and have only it strapped to the coolant hose. You’d have to modify the code to suit a different sensor of course.
Installation: Cut the wire to the GCM ‘ST’ terminal, connect the end that goes to the ECM to ‘ECM IN’ in the circuit below and the end that goes to the ‘ST’ terminal connect to ‘ST - PWM OUT’. Splice the wire going to the 87 terminal so it goes to both the GCM and Arduino circuit ’87 – Key-on 12V’. Splice the ground to both as well. Add an LED to the dashboard and run leads to the Arduino circuit connections. Best to make all connections plug-in so you can bench-test the circuit if anything goes wrong.
The schematic is as follows:
There is more information in the comments of the code below. The pulseIn() function is sufficient to synchronize the output PWM signal with the ECM, so the ECM can still read the diagnostics from the GCM.
The terminal ‘Tx OUT’ is a diagnostic serial connection that will output the temperature from the sensor, the corresponding times from the interpolated look-up table and indicates Preheat, Posthead and Done when it finishes. After this, the Arduino will stop the PWM output, which will turn off the glowplugs, and then enter sleep mode. In order to read the serial output you’d need a serial converter like the FTDI232 or CH340 that many Arduinos use and a PC with Hyperterminal or just use the serial monitor in the Arduino IDE.
The arduino code is in the attached text file