DIY Electric Car Forums banner
121 - 140 of 167 Posts
I'm thinking pump speed could be correlated to pressure if they have a flow restriction at the steering actuator. The system is always "leaking", in other words.

To maintain constant pressure, steering wheel torque/speed(derived from position) would need to be an input and the pump speed would need to map to those inputs to derive a pressure ("assist"). More pump displacement (speed) means more assist. More operator steering speed means the pump needs to increase its displacement to keep assist constant - if that's what's desired. The third dimension in the map is vehicle speed which increases or decreases the assist.

I seriously doubt you actually set the pressure as Brian suggested. You have to constantly read steering position and torque, and vehiclecspeed, and 3D map pump speed to it all is my thinking.

A dry pump would go into fail as a motor current sense being too small - implicit broken hose fault which is likely why it stops. You need a wet loop with a flow control valve (fairly cheap hydraulics piece) to simulate it on the bench, if my hypothesis is correct.

I think running it in the car, only mapped to vehicle speed will be kinda sucky and open loop with a constant pump motor speed command will also suck.

Need the steering wheel torque and position sensors and vehicle speed as a 3D map to pump speed to get it right.
The thing is the pump doesn't actually stop. For those first five seconds, the pump is responding to the command and changing RPM in correlation to byte changes. After those five seconds, it stops responding to the byte changes but keeps whatever RPM it was previously running (and becomes much quieter on the network) and keeps on running at that RPM.

It's worth noting that this car was originally equipped with normal hydro steering setup, thus at idle (open loop constant pump speed essentially) the steering performed just fine. Thus my hypothesis is that if I were to run this pump at a constant speed as well (mimicking a belt driven pump) it'd perform similarly to the original setup. From what I've read, though, the failsafe speed (that 50% - 70% people have mentioned) might not be high enough for very quick turns, hence is why I would like to gain control over the speed. I can add a sensor to my steering column and when the sensor sees me turning the wheel very quickly it'll bump up the pump speed accordingly.

Otherwise, this post basically sums up my assumptions about this unit!

Thanks.
Of course that's not how a steering system works - it's never just short-circuited. The pump provides a regulated pressure to a control valve at the end of the steering column shaft. When the driver turns the wheel, part of the valve moves against a torsion spring (that tries to keep the valve centred) and so the harder you turn the more the valve opens to route fluid to one side of the steering rack (or box). So if you're not turning the wheel, the only fluid flowing is through the pressure regulator (which is presumably the bypass type, short-circuiting fluid from the pump outlet to the inlet), right at the pump.

Fluid volumetric flow rate (not pressure) is proportional to pump speed; the pump only needs to turn fast enough to move the fluid used to move the rack (zero if not turning the wheels) plus the regulator bypass flow. As a result, maintaining constant pressure (constant amount of boost) means a varying pump speed - very slow when not turning and much faster when spinning the wheel to park. It would make absolutely no sense for a control unit somewhere else commanding that speed, since it is pressure that needs to respond to vehicle speed and steering angle.

As a result, you could test the system with the fluid routed through a simple manual valve: closed is driving straight, partially open is turning the steering wheel slowly, fully open is turning the steering wheel quickly.

The varying speed is actually the original purpose of electro-hydraulic steering: rather than an engine-driven pump turning a something proportional to engine speed all of the time, regardless of what is actually needed, an electrically-driven pump only needs to turn as fast as required to meet steering needs, saving power on average. Ironically, the highest fluid flow demand is during parking maneouvers at very slow speed when the engine is nearly idling, and the lowest fluid flow demand is on a straight highway or while accelerating in a straight line when the engine is turning fast; directly belted to the engine was always a really unfortunate way to drive a steering assist pump.
Brian, you still seem to be under the impression that I'm saying the message I mentioned directly controls the speed. This is not the case. I am not saying this command directly controls the speed. I'm saying that when I change the contents of that message, the pump speed changes. I am not saying this is a speed control command. This is a cause-effect statement. When I change that byte, the speed is changed in a predictable and repeatable manner.

This message could be:
1. Steering velocity (how fast the steering wheel is turning)
2. Vehicle speed (how fast the car is moving)
3. Steering torque (how hard the user is turning the wheel)
4. A direct speed command (yes, it could also be what you seem to think I'm saying it is)
5. Any number of other variables the pump cares about.

It may then use that data to calculate a final RPM (or current draw, or duty cycle, or etc etc).

I do not know what it actually is. It's proprietary, so I can't know what it actually is without more effort that doesn't seem to justify the end result. Existing documentation on these pumps indicates that these pumps listen for steering velocity and vehicle speed, and do some magic proprietary math to calculate how fast to spin the pump motor. The post I quoted above this by remy_martian sums it up pretty well.

Also, I agree with remy_martian in that I don't believe this unit cares about pressure at all. It's likely not operating in any sort of closed loop, though I haven't seen inside yet so I can't see if it has a pressure sensor or not. I only think this simply because it doesn't need to care about pressure. No existing belt driven pumps care about pressure at all, and this unit seems to be designed to directly replace those. It's probably only varying the RPM at all to conserve energy and reduce waste heat, and is maybe basing that RPM based on steering velocity and vehicle speed. Supposing there is some sort of 3D map that takes both steering velocity and vehicle speed as an input and produces pump RPM as an output, you'd just have to tune that map to always be fast enough so you can steer comfortably.

I should make clear that all of this is just a broad assumption. This is a closed source proprietary device. We can't know exactly how it works. Hence is why I'm interested in replacing it's brain with something that I can make work however I'd like.
 
Brian, you still seem to be under the impression that I'm saying the message I mentioned directly controls the speed. This is not the case. I am not saying this command directly controls the speed.
Yes, I got that.

Also, I agree with remy_martian in that I don't believe this unit cares about pressure at all. It's likely not operating in any sort of closed loop, though I haven't seen inside yet so I can't see if it has a pressure sensor or not. I only think this simply because it doesn't need to care about pressure. No existing belt driven pumps care about pressure at all, and this unit seems to be designed to directly replace those.
You're making "closed loop" sound complicated. Of course there's no closed-loop control over CAN using feedback of pressure to control anything; it's just a pressure regulator in the pump or the rack, whether that is a simple mechanical valve or a local electronic control.

The system certainly does care about pressure, because that determines the level of assist. Even systems with belt-driven pumps regulate pressure. If all of that pressure regulation is at the spool valve on the rack (or steering box), then the pump can be relatively dumb (controlling pressure only with a high limit, which is implemented in engine-driven pumps with a pressure relief bypass valve) and just run at a sufficient flow rate (dependent on speed) to meet requirements, with CAN messages telling the pump unit when more flow is needed to account for rapid steering movement.
 
Hi everyone. I am new to the site, just joined today but have been lurking for some time.
I am building a small scale electric car just to learn the basics. Then I will try my hand at a larger vehicle.
I am now working out the power steering and have hit a road block.
I aquired an electric over hydraulic power steering pump from a 2005 V50 Volvo.
I am hoping that someone here can help me get this pump running. I know it works as I have tested it in a working volvo.
However it is not as easy as hooking up 12VDC to get it to turn on. The host vehicle employs a host of sensors to comunicate with the pumps motor.
Does anyone have any idea as to how to bypass the sensors and still allow the motor to run? Here is a PDF file and a picture that explains much of the pumps workings. Thank you very much for any and all help,
Marco
View attachment 6704

Image

applinked
Mounting is really going to depend on your engine bay set up. I did some research a while back on using a electric pump from a mini cooper. They are BMW prices though, and you have to make sure the pressures are reasonably close or you can start blowing seals in the rack. I think your best bet is finding the SR parts.
For more options on electric, look into electric pump set ups for hot rods. I remember there being a few. You can find whole assemblies, but they are expensive.
 
Hi All
think I have a way to control them
Have it working on the Dodge/Jeep EPS using a ESC 60 Amp Brushless Motor controller and Arduino I still need to attach a Hall Effect sensor to monitor RPM but right now have a pot connected to control the speed and it works well

Does anyone have internal pictures of the Volvo Pump so I can see if it may work
thanks
 
I guess that's completely up to you Remy If you want something Automotive temperature rated that will be placed in a high temperature environment *(I didnt intend on putting it inside the pump housing) then build your own BLDC controller I guess
 
It's not just high temperature. Commercial temperature rated devices are not guaranteed operational below 0C (32F).

Our techs used to troubleshoot intermittents with cold spray...it was weird seeing a chip come back to life on the oscilloscope after warming up. Consistently. Troubleshooting tricks a snot-nosed kid fresh out of engineering school wasn't aware of. The intermittent at room temperature devices happened to be the ones, in a sea of like devices on a board, that would not operate when cold.

Anyway, the automotive-rated parts are more expensive, but there are good reasons for using them, including factory test screening.

Then there's connector reliability...
 
Howdy everyone. I got one of these units on eBay and decided to take a poke at the CAN comms. I downloaded the log generated by adrianm and proceeded to replay it to the unit. It does affect the RPM of the pump, however, only for the first five seconds of runtime. A few notes below:

When you power this unit on (with the two large power wires, and one small ignition wire) it will wait for two seconds, then enter failsafe mode when there aren't any CAN comms present. Failsafe mode seems to run the pump at around 50%-70% RPM.

The unit appears to only care about two IDs, 2e414003 and 0e410003.
0e410003: It seems to use this to to know if the CAN bus is alive. If it is seeing messages with this ID upon startup, it immediately starts cranking and doesn't wait that two second failsafe delay.
2e414003: Seems to affect the speed. The second byte (ie index 1) causes the speed to change, but only for the first five seconds of runtime. More notes below. Maybe is steering velocity, vehicle speed, or a hydraulic pressure?

I can successfully command the units speed using 2e414003, however, only for the first five seconds of runtime. After that it stops listening to me. During those first five seconds it's quite busy on the network, sending a ton of messages. After those five seconds, though, it stops accepting my messages, gets very quiet on the network (but is still sending a few messages every second) and seems to go into failsafe mode. I'm guessing it's making requests to something else on the network, not getting a response, and entering failsafe. Without a working car I can't really proceed much further.

An interesting thing is that it seems to keep the speed it was previously set to when entering failsafe mode. So, you could bring the ignition wire high, blast some commands for the desired speed, and it should keep that speed. If you desire to change the speed, bring it low (powering the pump off real fast), then back high, blast speed messages, be on your way. It's a hack, but it's all I got for now.

I'm currently at the point where I'm considering other options. I'm not very familiar with how to fuzz on the CAN bus so I'm not sure if I even want to keep trying to make it work given how much time it could potentially make, especially considering I'd never have 'full control' over the unit as it's really listening for things like vehicle speed and steering angle, which my car doesn't have. I'd rather be able to just tell it what speed to run at based on other factors I'd collect, and be able to change it on my own.

This brings me to replacing the brains of the operation. Other people are saying this is a TRW pump, and that it's powered using a brushless motor. I'm familiar with the VESC motor controller which would suit this project. It has a CAN interface with a transceiver on board already so I can have it on my already existing CAN bus, is open source, and has provisions to add custom code to act upon messages from my CAN bus. Thus I'm having a hard time justifying hacking the existing proprietary CAN bus. Unfortunately, it looks like if I decide to go this route I may end up destroying my pump as there doesn't seem to be a way to open it without some sort of major tampering. I'll likely just run it as it is now and see how it fares. If I need more assist, I'll proceed further.

Howdy! I am working on getting this unit to work well in my Jeep currently, as I need the full capacity of the pump for my steering ram, and this post, in particular, has been an amazing help with R&D however now I am stuck.
I downloaded both files regarding the Can dump from adrianm as well, I have been searching for the IDs mentioned above to try with my benchtop test setup to no avail. (2e414003 and 0e410003) CTRL F will not bring any ID or string up that matches what you put above. Can you elaborate on what ID and string you have had luck with changing pump rpm? Or what program you are using to send the whole log? I am currently using an Arduino setup where I have to manually type every message to be sent.
I have a transmitter and reader hooked up to the Canbus to monitor everything. I see what you mean that the bus is very busy for 5 seconds, even in failsafe mode, then the pump sends out what may be a request and goes silent while it seems to be waiting for a response back before making any further changes.

I attached some pictures below to show what I have done and am trying to power with this unit. While it does look like the ram is oversized for this pump it actually does decent on the failsafe mode I would feel comfortable diving it down the 2 lane highway by my house however, at slow speeds, there is a lot to be desired. While anecdotal I have seen and driven vehicles where people run these size steering rams with their factory steering pumps putting out only 3.4 ish GPM, whereas this pump is rated at 4.4 GPM. I want to try this pump out at 100% rpm and see what the limitations of this pump really are. I get some resistance at the wheel when I try to turn quickly, which I am guessing is a lack of flow due to the low pump RPM. I hypothesize this is the case due to the mechanical pump vehicles I have driven with the same steering ram setup. As engine rpm increases so do the responsiveness and lack of resistance at the wheel, which is why I am pursuing this. Having a constant steering rate through the rpm band would be great, but depending on what is found here, maybe even speed dependant Pump RPM just as Ford/Volvo intended it.

Also, Yes I do have the factory return blocked off as I am using an external reservoir, to feed the pump, with its own return, filter, and temp sensor that goes to my Arduino HMI on the dash that I designed.

Thank you all for your help!

*******Edit
Upon further attempts and reading, I found my transmitter was not sending out the extended CAN ID, once I got that sorted, the pump audibly had a softer start with a pause then ramp-up of the pump. However, I could not get the pump to do an Immediate start as described by @Blackthumb. Also after 5-8 seconds of run time, the pump will still wind down some before leveling out. I must not be sending the correct commands from the 0e410003 ID for it to do an immediatestart up and maintain a higher RPM.
I will continue to update as I find more out.

Thank you all again.
 

Attachments

Hello friends. I run one of these pumps in my race car (combustion engine, sorry!), and wanted to control it. I'm a developer on rusEFI, so I pooled some resources (including the logs from this thread, and a MaxxECU that can control these pumps) to try and reverse engineer the CAN protocol, and I think I've done it.


Here's the post on our forum with the Lua script that makes my pump work: Volvo electric power steering pump CAN bus control - rusefi.com

Here's the script on GitHub: pump.lua

It just waits until it sees the "I'm alive!" message from the pump, then starts sending.

The 1ae0092c frame seems to just keep the pump alive and listening/sending over CAN, and it's sent at 1/30 the rate of the other message.

The 2104136 frame sends something that's probably vehicle speed based on the logs from other people above. Most of the bits are (or can be) static, last two bytes are 16-bit big endian unsigned speed. Small values make the pump run fast, large values slow it down.

I'll keep this thread updated in case I figure anything else out!
 
Hello friends. I run one of these pumps in my race car (combustion engine, sorry!), and wanted to control it. I'm a developer on rusEFI, so I pooled some resources (including the logs from this thread, and a MaxxECU that can control these pumps) to try and reverse engineer the CAN protocol, and I think I've done it.


Here's the post on our forum with the Lua script that makes my pump work: Volvo electric power steering pump CAN bus control - rusefi.com

Here's the script on GitHub: pump.lua

It just waits until it sees the "I'm alive!" message from the pump, then starts sending.

The 1ae0092c frame seems to just keep the pump alive and listening/sending over CAN, and it's sent at 1/30 the rate of the other message.

The 2104136 frame sends something that's probably vehicle speed based on the logs from other people above. Most of the bits are (or can be) static, last two bytes are 16-bit big endian unsigned speed. Small values make the pump run fast, large values slow it down.

I'll keep this thread updated in case I figure anything else out!
I updated my Arduino code to send all 5 of those Can Frames that you provided, the 2 main plus the rolling data, I can independently verify your data is accurate and can control the speed! You sir are a lifesaver, I was going to be borrowing a MaxxECU this week and I bet it would have taken me some time to figure those frames out! I will be testing on the jeep this week!
 
Mind posting the source code here for everyone?
It's linked as a GitHub gist in my message above: pump.lua

Here's a text description though:

Two frames:
0x02104136 sends at 71hz.
0x1ae0092c sends at 2.4hz, exactly 1/30 the rate of the first frame.

'92c has data { roll, 00, 22, E0, 41, 90, 00, 00 } where roll cycles through 00, 40, 80, C0 for each consecutive message.

'136 has data { BB, 00, 3F, FF, 06, E0, spd_msb, spd_lsb } where speed_msb/lsb are the most/least significant bits of the 16-bit 'speed' value. 0 makes the pump run fast (car stopped), and ~6000 is the car "driving quickly" (unknown units, but it slows the pump down considerably).
 
I was going to be borrowing a MaxxECU this week
I'm actually still a little bit curious what the MaxxECU sends... I did some reverse engineering of their firmware image to see what frames they send to the pump, then didn't bother actually fully decoding the contents of the frames. Instead I just looked at those frames in the logs in this thread, and noticed that they didn't have a checksum present, so they're pretty easy to 'fake' without any hard work.

The pump seems to maybe either ignore the checksum, or support multiple different frame formats, because MaxxECU does this (decompilation, not necessarily valid variable names, but correct logic):

Image

That's clearly a checksum (and even depends on the speed bytes I'm changing) - but I'm not computing it and the pump seems to not complain.
 
I know it was in your posting, and thanks for sharing the lua.

A lot of people on here do Arduino, so I thought it would be useful for them to have Arduino source as well. Tells them which libraries they need, loop structures, etc. Creates a living thing for further codebuilds.

Trying to enhance the site as a useful resource, like you used as a base for getting this far, vs storytelling.

Mind sharing your Arduino source code here, @WireNutCJ7 ?
 
I know it was in your posting, and thanks for sharing the lua.

A lot of people on here do Arduino, so I thought it would be useful for them to have Arduino source as well. Tells them which libraries they need, loop structures, etc. Creates a living thing for further codebuilds.

Trying to enhance the site as a useful resource, like you used as a base for getting this far, vs storytelling.

Mind sharing your Arduino source code here, @WireNutCJ7 ?
@remy_martian
I do not mind, pulling relevant code for 100% pump RPM from my BCM code for the CJ7 now. Saves you all from wading through another 2000+ lines and storytelling to try and decipher it. LOL, Standby.

Waiting on mod approval since my next post had a youtube video in it I guess.
 


Code:
//Volvo Power Steering Pump 100% RPM
//
//Written by WirenutCJ7, with help from mck1117
//
//This is a basic and somewhat sloppy code as I removed it from a much larger sketch
//but this can get you started, or at least steering better.
//
//I have a relay on pin 4 for turning the pump on, timed correctly with can messages
//
// this was setup for a Arudino Mega 2560


#include <SPI.h>
#include <mcp2515.h>

int Alive = 1;
int Freq = 0;
//Listen Frames
struct can_frame canMsg1;
struct can_frame canMsg2;
struct can_frame canMsg3;
struct can_frame canMsg4;
// Speed Frame
struct can_frame canMsg5;
MCP2515 mcp2515(53);

void setup() {
  //Keep Alive and listen 1
  canMsg1.can_id  = 0x1ae0092c | CAN_EFF_FLAG;
  canMsg1.can_dlc = 8;
  canMsg1.data[0] = 0xc0;
  canMsg1.data[1] = 0x00;
  canMsg1.data[2] = 0x22;
  canMsg1.data[3] = 0xe0;
  canMsg1.data[4] = 0x41;
  canMsg1.data[5] = 0x90;
  canMsg1.data[6] = 0x00;
  canMsg1.data[7] = 0x00;

//Keep alive and listen 2
  canMsg2.can_id  = 0x1ae0092c | CAN_EFF_FLAG;
  canMsg2.can_dlc = 8;
  canMsg2.data[0] = 0x00;
  canMsg2.data[1] = 0x00;
  canMsg2.data[2] = 0x22;
  canMsg2.data[3] = 0xe0;
  canMsg2.data[4] = 0x41;
  canMsg2.data[5] = 0x90;
  canMsg2.data[6] = 0x00;
  canMsg2.data[7] = 0x00;
//***********************************************************
//Keep alive and listen 3
  canMsg3.can_id  = 0x1ae0092c | CAN_EFF_FLAG;
  canMsg3.can_dlc = 8;
  canMsg3.data[0] = 0x40;
  canMsg3.data[1] = 0x00;
  canMsg3.data[2] = 0x22;
  canMsg3.data[3] = 0xe0;
  canMsg3.data[4] = 0x41;
  canMsg3.data[5] = 0x90;
  canMsg3.data[6] = 0x00;
  canMsg3.data[7] = 0x00;
//***********************************************************
//Keep alive and listen 4
  canMsg4.can_id  = 0x1ae0092c | CAN_EFF_FLAG;
  canMsg4.can_dlc = 8;
  canMsg4.data[0] = 0x80;
  canMsg4.data[1] = 0x00;
  canMsg4.data[2] = 0x22;
  canMsg4.data[3] = 0xe0;
  canMsg4.data[4] = 0x41;
  canMsg4.data[5] = 0x90;
  canMsg4.data[6] = 0x00;
  canMsg4.data[7] = 0x00;
  //0x2e414003 does seem to work as well?
//************************************************************///////////////////////////
//SPEED 100
  canMsg5.can_id  = 0x02104136 | CAN_EFF_FLAG;
  canMsg5.can_dlc = 8;
  canMsg5.data[0] = 0xbb;
  canMsg5.data[1] = 0x00;
  canMsg5.data[2] = 0x3f;
  canMsg5.data[3] = 0xff;
  canMsg5.data[4] = 0x06;
  canMsg5.data[5] = 0xe0;
  canMsg5.data[6] = 0x00;
  canMsg5.data[7] = 0x00;

  while (!Serial);
  Serial.begin(115200);

  mcp2515.reset();
  //mcp2515.setBitrate(CAN_500KBPS); //check your crystal MHZ and change if need be.
  mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);
  mcp2515.setNormalMode();
  pinMode(4, OUTPUT);
digitalWrite(4, LOW);
digitalWrite(4, HIGH);
delay(250);
mcp2515.sendMessage(&canMsg2);

}

void loop() {
  if(Alive == 1){
if (Freq == 30){
  mcp2515.sendMessage(&canMsg1);
// Serial.println("Alive 1");
  //delay(10);
  Freq = 0;
  Alive = 2;
delay(5);
}
}
if(Alive == 2){
if (Freq == 30){
//  Serial.println("Alive 2");
  mcp2515.sendMessage(&canMsg2);
  //delay(10);
  Freq = 0;
  Alive = 3;
  delay(5);
}
}
if(Alive == 3){
if (Freq == 30){
// Serial.println("Alive 3");
  mcp2515.sendMessage(&canMsg3);
  //delay(10);
  Freq = 0;
  Alive = 4;
  delay(5);
}
}
if(Alive == 4){
if (Freq == 30){
  //Serial.println("Alive 4");
  mcp2515.sendMessage(&canMsg4);
  //delay(10);
  Freq = 0;
  Alive = 1;
  delay(5);
}
}
mcp2515.sendMessage(&canMsg5);
  Freq += 1;
  delay(5);
  delay(10);
}
 
Hello,
I own a company that develops and produces controller kits for electric power steering conversions.
We had many requests during past years to develop a controller for the Volvo electro hydraulic steering.
A customer recommended to register in this Forum to share the information.
Finally we have for sale a normal controller with an adjustment knob and a better controller with a small GPS antenna.
Next you can see a simple Youtube video showing how our controller works. Also links to our webstore and Ebay store.

Any question please let me know.
 
121 - 140 of 167 Posts