Controlling Delphi Electronic Throttle with Arduino

Hi folks!

I am an Arduino beginner and am trying to use an Arduino Diecimila to control the throttle position of a Delphi Electronic Throttle. More info on the throttle here:

http://delphi.com/manufacturers/auto/powertrain/gas/aircontrol/etc_mtc/

Now, I am using a Megasquirt Engine Controller which cannot control this throttle directly as it has no Analogue Voltage output which (i think) this throttle requires. So I am hoping that I can use the Arduino to read a PWM output from the Megasquirt and convert this into a 0-12v analogue voltage that the motor requires (at least I think it needs 12v).

The throttle has 5 pins, 2 pins go directly to the motor, and the other three are for a Hall Effect Sensor for feedback of position from the top of the actual throttle spindle.

So my hope was to send the PWM from a map in the MS ECU, to the Arduino, which converts to 0-12v. The fed-back position is read back into MS to give closed-loop control over the actual throttle position (which MS can do using the boost control algorithm).

Before anyone gets worried, this is not to control the main throttle on the engine, but instead is used for a supercharger bypass valve similar to the Mercedes designs.

My thinking on the motor control is that because the throttle is held closed on a linear rate spring, as move voltage is applied and more force generated through F=BiL, then the force opens the throttle more until spring force and motor force are equal. Quite why a PWM signal would not also work is a question I have, as is to why a H-Bridge is needed (as I have heard).

Anyway, any ideas/advice/points in the right direction would be greatfully recieved! 8)

I could be wrong here but, I think the throttle is operated like a servo except the servo controller is the car's ECU. In terms of a servo, you have a controller that reads a PWM signal and translates that to a desired position. Then, the motor is ran until the servo's output matches the desired position. Output is checked by a potentiometer connected to the output shaft.

In short, I think you have a motor and a potentiometer and you provide the motor control such as the H-bridge and the brain will be the Arduino. I would double check whether this is a 12volt motor and not a 5volt motor.

Hi,

Yes, that is what I am guessing now. I read another post where a TLE5205-2 Chip was used (the h-bridge) http://arduino.cc/forum/index.php/topic,107894.0.html.

So I need to send the PWM to the TLE5205-2 Chip, which then sends the analogue voltage to the motor. The resulting position is then fed back to the ECU which controls the position through a PID loop. In which case, do I even need the Arduino to convert PWM into DC voltage representative of position?

Here are some pics of the throttle:



Sorry, for some reason pics don't work for me unless I open them in a new tab...

In which case, do I even need the Arduino to convert PWM into DC voltage representative of position?

I believe the answer is yes.

Imagine that your throttle is a wheel with a motor connected to it. If you want to turn the wheel clockwise you apply (+ to Pin A) and (- to pin B). Then when you want to turn the wheel the other direction you reverse the + and - with respect to A and B.

Now imagine the wheel has a potentiometer connected to it. You spin the wheel from pot setting 0%, to pot setting 50% and the wheel would have spun half way around perhaps.

The Arduino will need to take the PWM from you MS, determine the desired position, control the H-bridge, and the H-bridge will run the motor forward or reverse with respect to the desired position.

I think the spring is a safety so that when power is lost the throttle will go closed.

Indeed it is. The spring is to force a fail-closed scenario. So then in the case you explain, I should send the PWM to the Arduino, use a DC motor control script, and use the servo library to PID control the motor position through the feedback, all in the Arduino? I.e. MS ECU only sends the required PWM and receives no feedback?

I would send the feedback from the throttle to the MS and the Arduino. Assuming that the MS is only reading voltage from the potentiometer, you can also read the voltage with the Arduino in parallel. If the MS has PID you will not need PID in the Arduino.

The reason I would feedback to the Arduino is to provide "min" and "max" limits to prevent burning the motor up and provide calibration of the position system.

Keep in mind, I am using theory based on the information given. Use caution and test each part of the circuit before putting it in service.

Hi again,

If I have the fed-back position in the MS ECU from the Throttle Position Sensor, I can just set the max output values to below that. I understand that if there was some failure of the TPS, then I could still overdrive the motor as I am not measuring absolute voltage, rather position.

I will post on the MS forum, but for now I think I could just use the TLE5205-2 and the MS without the intermediate Arduino in theory...

It is worth a try if you can get by without the Arduino. Test carefully so as not to burn the motor up.

Just like Columbo I have one more question...

If the MS outputs a PWM, but the HBridge only sees a logic to move forwards or backwards, how will that work? I mean if I need say 30% throttle opening, the PWM will go to 30%, going to the IN1 pin of the HBridge. How does the chip then convert this? The MS control I will use is just a boost control algorithm that usually pulses a solenoid to bleed away air until the actuator meets the demand. Looking at the datasheet for the HBridge I posted, I just need an on or an OFF, not a PWM signal proportional to desired position that can then be trimmed.

How are DC brushed motors usually speed controlled? I guess as I have a spring holding the throttle closed, a speed is converted mechanically into a position where motor torque meets spring torque. So don't I actually need a speed controller that accepts PWM but converts it to a voltage?

Hi,

OK, the solution was to buy a pre-built motor controller and just send it PWM. I used this one here:

Pololu High-Power Motor Driver 24v12