Using an encoded DC motor as a stepper equavalent. CNC.
Harprit
Posts: 539
I am developing the SPIN code needed to use a servomotor in the place of a stepper motor.
There are tremendous advantages and high speeds can be achieved.
And of course there are problems!
I was unable to find others who may have worked on this problem.
I do not want to reinvent the wheel.
Can someone shed some light on this.
If there is not one else working on this, I will discuss this rather interesting subject further
on this forum. I have discovered that it is not a trivial conversion.
Harprit
Post Edited (Harprit) : 6/20/2010 4:04:56 PM GMT
There are tremendous advantages and high speeds can be achieved.
And of course there are problems!
I was unable to find others who may have worked on this problem.
I do not want to reinvent the wheel.
Can someone shed some light on this.
If there is not one else working on this, I will discuss this rather interesting subject further
on this forum. I have discovered that it is not a trivial conversion.
Harprit
Post Edited (Harprit) : 6/20/2010 4:04:56 PM GMT
Comments
is this what you mean by servomotor?
Otherwise if you're talking about brushed permanent magnet DC motors, there are some severe low-speed standstill disadvantages, and it's going to be tough to control overshoot on the high-end.
If you are talking about brushless motors, then it becomes a whole science of current control loops, speed control loops, phase angle considerations, and tuning, along with the higher-level position control and speed/acceleration ramp generation.
I plan to use a DC motor with a gearbox and an attached encoder.
I would define a servomotor as a motor that is under the control of a master signal. A Master - Slave relationship
Pretty much the standard definition. (The idea that only Hobby R/C motors are servos are to be called servos
is counter productive.)
As for the stand still and high speed problems, if the errors are within acceptable limits then things may be considered
to be under control. The usual case for most problems.
All the problems mentioned in the third paragraph have to be addressed and that is what makes it an interesting problem.
Harprit
Post Edited (Harprit) : 6/20/2010 4:43:59 PM GMT
As Whicker said, you are in for quite a challenge. I presume you will be using ball screws, likely and with a pitch of 8 or so TPI. That means for 1 thou positioning accuracy you need to park the armature within 2.88 degrees.... similar as to what would be needed in the case of a stepping motor.
But you are right on the speed issue as well as torque at high RPM. I too will be pursuing this after I first finish my project with steppers, but I will be using brushless motors and encoders. The three phase drive issues will be more difficult than they first appear.
However, good luck!
Cheers,
Peter, (pjv)
Lets start with (we can change it later).
Direction signal 0 or 1
Speed pulses from 1 to 100_000 pulses per second.
Resolution 0.0005 inches
Do it, complete compliance
Don't miss a count/pulse.
Harprit
I have previously experimented with the motors, and have for now settled on using steppers.
I'm presently working on the mechanics, and to get precision that is already quite a challenge. I see you have specced one half thou.... that will be incredible if you can actually achieve that. Even commercial (at least, affordable) lead screws with ball nuts spec 4 thou per foot accuracy, but the rpeatability is good. I'm targeting a modest 3 thou and will be ecstatic if I get 2. And all that is with only modest forces of a pound or two. We'll see how it turns out as I continue to make changes to the design.
Cheers,
Peter (pjv)
Post Edited (Todd Chapman) : 6/20/2010 5:42:00 PM GMT
It's already geared down, quite powerful, and should
be easy to add an encoder onto to tell position. You
could control it using 2 pins connected to an H-bridge
circuit and PWM. Perhaps a very fast back and forth
pulse series would serve to act as a brake? I don't know
much about this but this seems a cheap approach.
Powerful, reversible, controllable, cheap..and it already
has a chuck thing to tighten onto a shaft...seems perfect.
I bet if you opened one up you could find a good way to
add an optical encoder setup at a point that would give
really good fine resolution.
Post Edited (HollyMinkowski) : 6/20/2010 6:00:25 PM GMT
Not sure if anyone here has done it, but it's a pretty common thing. Gecko drives are driven by step/dir for example.
The mechanical resolutions are not of interest to us at this time. Mechanical slop has its problems but not now!
I included the resolution to allow us to estimate what kind of encoder counts, gear box reductions etc. we would need to have a realistic situation
We can ignore that till the motor is under adequate control.
Here is what my mind experiments have yielded.
So this is what I am working on in the software and hardware.
The problem that has to be resolved is the problem that arises when the motor direction bit changes.
Assume you get pulse, pulse,.......direction change, pulse, pulse......
You cannot execute the direction change till all the initial pulses have been executed or the machine will not be doing what was intended
100 positive moves and one negative move does not equate to 99 positive moves.
So each pulse stream between direction changes has to be accumulated in a register that the motor is emptying.
(We cannot change direction till the one register goes to zero. In the mean while the next register is filling up.)
So as soon as the direction changes, we start accumulating into the next register. And so on. We go to this register after the
last one has been satisfied.
What are the dynamics of the requirements to fulfill these requirements?
Am I on the right track?
Is there an easier way to do this?
Have I seen the problem clearly?
What to the extreme margin conditions look like?
What kind of errors are likely to arise in such a scheme?
The solution must be in SPIN and must be learner friendly.
@ Holly, drill is not a good idea. Bin there, done that.
@James, its more complicated.
@ Todd, I'm not looking for a commercial solution, just one we hobbyists will find competent and acceptable.
The code crunchers can take it from there once we define the fundamentals properly.
The running of the motors is pretty well understood. PID loop etc. Gearbox slack etc in not important right now, we will get to it later.
My motor has a 19.5 to 1 gearbox and 500 encoder counts per rev. It stops to within + or - 4 counts and can be held there with ease.
Harprit.
Post Edited (Harprit) : 6/20/2010 7:35:23 PM GMT
Where is this defined in a real world situation.
It has to be defined somewhere or there will be slip.
Is it defined in the set up of the software that sends out the pulses?
We need to define this number realistically as a part of our problem definition.
We could do it arbitrarily for now. Lets say 1000 pulses a second.
Harprit
It is not more complicated at all...
Take the number of steps per revolution with the stepper, that is the same as the number of pulses on your encoder. Scale accordingly if needed. Now when a step signal is given, take the direction and either add or subtract this from your current position. Now take the current position and the target position (both in steps/encoder counts) and throw that into a PID function. What you get back is a value that is used to drive the motor. There is scaling to get that right for any physical system, that's what PID tuning is for.
You don't have to keep track of direction changes. If any of the motor controllers on market are given 100+ steps then a -1 step, they don't wait, they just go to the current position stored internally. It's the job of the controller above that (CNC) to wait for it to be at a position before starting another. Infact if you do that (100+ then -1) on a _stepper_ controller you will loose steps on most of them. You can't even send 2 steps without the controller being done with the last step. The reason is that the step frequency going out to the controller is also determining the speed of the motor in a step/dir control scheme. If you send 100 steps, the controller will try to move to those 100 steps as fast as it can, which will be faster than the physical limitations of the motor. You will miss steps.
There are a _few_ stepper controllers that can be configured to buffer steps and limit their max speed. For a servo controller, this is all irrelevant however. Since you have feedback, all you have to do is keep track of the current position (via encoder) and the target position (accumulation of steps with direction). The PID loop will generate the appropriate error signal scaled by tuning parameters to a signal that can be fed back into the motor. It really is that _simple_. Also note that I keep saying PID, but the same is true for any closed loop control method. A simple P(gain) loop would work, but you would have a motor speed completely proportional to the difference between the current and target locations. This will mean that you either slowly creep up to the desired position, or you approach it quickly and overshoot, then oscillate. The I will help your error signal adjust depending on the accumulation of error. It adds a sort of acceleration that trys to ramp up and down. The D will adjust your error signal even more taking into account the change in error, or it's slope. Really it's too much for me to explain here...
Once again, all you need is a PID controller with a simple step/direction interface for modifying the target position. The only difference is that instead of setting the target location directly, your setting it through an accumulation of +1/-1 pulses.
A real machine will have considerably more complicated requirements than your description suggests. Principally it relates to getting X,Y andZ pulses (assuming direction is already set) out at exactly the right times, relative to each other. This is called linear interpolation for straight lines in 3 axex simultaneously, and circular interpolation for curved lines in 3 dimensions. Imagine your cutter needing to trace the path of a helix..... xyz all at the same time with varying speeds. NOT TRIVIAL. I believe this to be more easily accomplished, at least initially with steppers. Faster performance, if required can be attempted with brushless motors later, and besides, perhaps 48 volt on the steppers will be sufficient for my market.
Contrary to yourself, I believe it is ALL about the mechanics and slop etc. If these are not adequately held within your desired tolerances, then there is no point in proceding with the electronics or harware. Well, crappy mechanical, I've "Bin There". I'm building a respectable machine that I expect to sell on the commercial hobby market.
At 24 Volts, with the drivers I built, and acceleration software I wrote, so far the steppers seem happy to run up to 4000 steps/s, and can be nudged to 5000 steps/sec. Tweaking can get me to 7000, but there is not enough torque left to be reliable. Upping the voltage to 48 should give a buch more speed, but first I need to get some logic FETs with higher voltge.
Now, back to the mechanics.......
Cheers,
Peter (pjv)
I have two CNC systems that use stepper motors, neither one has encoder feed back for the motors
(I have not put either one in use at this time but am getting ready to, on a mill).
The motors do not have encoders on them in any case. There is no connection for encoders either.
Pulse and direction pins only for each axis (and micro switch limits).
Neither one has a way to tell the PC that a move/step has been completed, no acknowledge pin for that
Maybe these are old technology.
I do not at this time completely understand what comes from the PC and how it might be configured.
I'll be back, and I very much appreciate your thoughtful responses. This is great.
Harprit
I will agree somewhat that the physical components are of little matter at the moment. (Especially if it's a system that is already built and running.) Your PC software will have a configuration area to set how many steps/counts per unit of travel are needed. Backlash and other things like it are a physical problem unrelated to the electronics, and so are a different battle. Ofcourse a small amount of backlash can be less of a problem with a bit of backlash compensation in the pc software. Once again, should already be there somewhere.
I would get a cheap servo, or just hook a dc motor to an encoder. (Though real servos have much better physical and electrical properties like inertia and such, due to being made to be driven in a back-forth manner.) Then build the electronics to be able to move that motor with variable speed/torque. (H-Bridge with pwm or scr based drive system.) Then use the obex encoder object to get keep count on your encoder. Then write software in the prop to keep a variable, and add/subract 1 from it based on the pulse/direction pins. Then write a PID loop that takes that variable and the current encoder value and generates a value that is fed into your pwm/scr control software. Optionally if you've never written a PID loop, write a P one. That's a simple as taking the difference between the current location, and the target location, and scaling it by some value (make this adjustable via a pot or something so you can tune it during operation), then feeding that into your pwm/scr driver.
Hope that helps, and when you get it working, take some pics and video for us all. [noparse]:)[/noparse]
Edit: Ohh, forgot to mention that if the servos aren't permanent magnet based, then you'll also have a field to take care of. I would just run it with a constant voltage that the motors field is rated at. After you get everything working like that, you can do some research into field weakening and get some higher speeds. This is a trade-off for torque, but only after you hit the motors rated speed. You probably won't use it for servos, but for a spindle that's another story.
Post Edited (James Newman) : 6/20/2010 10:10:54 PM GMT
OK
I have thought about it enough to reply intelligently.
I am taking about using a servo motor to replace a stepper motor. The posters are talking about
making it easy to do it all with steppers. Wrong focus. Therefore: ?? answer.
As I said I have two stepper based CNC kits. They are good to go. I want to investigate what it takes
to use a servo with the express purpose of improving the high speed end of the operations. So far
I have every reason to believe that I will be successful. I actually built a one axis drive to experiment with.
Photo attached. I can really get the thing going. Very good response and very, very fast but I am diriving it
direct from the motor, no gearbox.
Now to determining if it works just as well under load. I will report back. Then I will actually build a
simple CNC machine to see how well the "composite machine" works.
I will report back on that too. We may well change they way things are done in hobby CNC.
Thoughts, comments, discussion and ideas are as always, welcome.
Harprit.
You should be able to do it, there isn't any reason I can think of why it won't work.· Gecko makes a step and direction input drive for servos which is what you are describing.· There are other servo drives that also use step and direction inputs.· The last step and direction servo drive I assembled was "controlled" by an Atmel Atiny micro which is far less powerful than a propeller.·
Chris
I am working on the code and have posted a request on the Propeller forum for help converting the positionController from C to SPIN, and then eventually to PASM.
This might be "the droid you're looking for".
ps Take a look at Probotix.com for an inexpensive (less than $1000 mill).
Good group of guys.
H
As for results, yes, you'll wip the *** off a stepper any day. But, as has been said, mechanical rigidity is number one for performance.
What you do is virtualise the stepping function and feed that to your internal servo routine. Have one Cog just for the servo even. So, no external stepping would occur. Instead, you are controlling the motor current with a DAC, amplifier/drive operates in current mode, and monitoring the position of the encoder making sure it is staying where the desired position says it should be.
Holding the actual position steady wrt to the target position, even when it is a moving target, is the function of the PID code. Once that is stable then you are free to create elaborate motion profiles that can give rather impressive accuracy at high speed.
A nice side effect of being in the servo loop like that is you can truly examine any inaccuracies of the motor motion and determine if an imperfection is coming from the control or the mechanics. And, of course, can make changes to improve the handling and even maybe compensate.
Stripped timing belts, bound slip plates and jammed ball screws ... always best if the motor stalls before breaking the equipment! Heh, lots of fun. Highly recommended exercise.
Be wary of using low res encoders.
I don't want to discourage you. Your project might be some great chance to learn something about control theory and what it takes to make a good CNC system. However, I doubt that it makes much sense from the technical point of view. I don't see a reason why you want to replace stepper motors of a hobby or small commercial cnc machine.
A well designed stepper drive can reach speeds of 2000 to 3000 RPM. With a ball screw of 5mm pitch and 1/10 microstepping this means a resolution of 1/400mm or around 0.0001" and a top speed of at least 10m/min or almost 400 IPM. Servo motors can spin a little faster (4000 to 6000 RPM) but have less torque for the same motor size. So you need a gear which cancels out the speed advantage.
IMHO,·you need a very precise and expensive mechanical system and low inertia brushless servos to see any benefit from a servo. Affordable "low end" servo drives typically have inferior stiffness and make more noise than a good stepper system with comparable price. Only if you need high power (>200W mechanical output per motor) steppers get expensive (and hot) so servos may be the better choice.
BTW, I sell stepper and servo drives for a living. I have a propeller based stepper drive (http://forums.parallax.com/showthread.php?p=870152, look at the videos in post 4/1/2010) and I'm currently developping a brushless servo controller with a propeller inside. I use encoders with at least 2000 CPR.
Cheers
Post Edited (ManAtWork) : 6/26/2010 2:41:06 PM GMT
I personally don't learn much by buying tricky high tech goodies.
I have to build it and discover what the problems are for myself.
I already said I understood about the need for a precision machine. Its not about the machine at this time.
For me this is about learning what the real world software problems are.
Once I understand that, expensive hardware can follow.
My experience has been that steppers are woefully inadequate at high speed and under high loads.
No large industrial machines that I know of use steppers. None of the fast pen plotters used steppers.
I'm going to leave it at that for now. I'm busy writing code and building my machine
Report back to you guys later, pictures maybe, but its bye of now.
Thanks for all the great feedback.
Regards
Harprit
They normally have 3 coils.· Each coil can be forward/reverse or off.
You need 3 H bridges to control the 3 motors.
That's really all you need to know [noparse]:)[/noparse]
Figure out the inductance of each coil and relate the current to a pwm frequency to the current you want to pop through it.
You can read the position of the encoder/hall effect sensors·and figure out the position.
Implement a PID loop to control the velocity.
You probably want an DC and current sense resistors to figure out the voltage.
It's interesting because a stepper motor is simply a 2 phase brushless DC motor.·
Other people have used H bridges to put stepper motors into·brushless·DC·control (vector drive):
http://www.quicksilvercontrols.com/SP/WP/QCI-WP003_ServoControlOfMicrostepMotor.pdf
Look at the picture and it's very simple: two LMD18200 H bridges and a MCU (well they throw a dsp on there but it's not necessary).
Here is a 100% complete reference design:
http://www.luminarymicro.com/products/rdk_bldc.html
It's very easy to change it over to step/direction controller.
I have it and it works great to 60,000 rpm.
You can just read the code and translate it to propeller speak [noparse]:)[/noparse]
Board layout is already done for you along with the complete BOM.
·
www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2125¶m=en026178
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Leon Heller
Amateur radio callsign: G1HSM
My home made encoder has 42 slots in it, it can be read to 4 times that many counts. I have sold these
all over the world. They are quite inexpensive and therefore popular. See encodergeek.com
The purpose of these encoder motor combinations is to actually allow one to see the encoder move a
single count and come back to where it was to make sure that the commands are being executed to one's
satisfaction. You can actually see the motor oscillate if you over control etc etc.
Once the problems have been all sorted out, it will be time for higher counts and smooth tight moves.
Thank you for your caveats.
Harprit
Post Edited (Harprit) : 6/27/2010 6:56:22 PM GMT
Good luck.
Graham
Considering that I already have it working pretty well, I don't understand it either.
I will post the results of my experiments after all the bugs are worked out and
I have a table to prove that the software and hardware together. I need control from a PC
too and I have not started on that yet so there is still quite a lot of work to be done.
I'll need some pics and some movies. It'll be a while.
Stay tuned.
Thanks for your thoughtful comments.
Harprit.
I realize this in an old thread I know I'll probably go under fire for trying to revive it, but I've been trying to get my head around this and I'm sure I can learn from your experience.
The more I research the more questions I have
I have good quality medical dc motors with gear box and quad encoder and would like these to be a direct replacement for a stepper motor.
Basically I'd like to give it step and direction control signals, obviously the DC motor has to respond and settle in a very short time in order to not miss steps. or if a step is missed, do i just increment a position counter in my controller and the motor will catch up when it can?. I calculated a 'step' is only 6 pulses on the encoder so i doubt the motor would ever move at full speed. Is this the correct approach?
My other question is about PID control. the 'I' term is confusing me, seems to me like the 'I' would be useful when there's a higher load on my motor, say I'm only a count out so normally my pwm_min would be enough to get it back into location, but with the load at the PWM i'm not moving at all, in this case 'I' would accumulate and contribute to a higher PWM until I'm back on track.... but once I'm on track, my 'I' term would continue to contribute to my output, which I now want to be 0pwm... do I just 0 that value?? is this 'pure' PID ? I'm confused cause I can see that I need 'I' sometimes but not all the time...
Anyway if you do find time to reply I'm looking forward to it.
Cheers