Author
Topic: Controlling Motor Speed (Read 1311 times)

I'm not sure if this is more of a software or electronics question, but software seems more appropriate.

I was wondering what the best practice for setting the speed of a motor is. By speed I mean angular velocity, and the situation is one where there is perhaps 10-bit angular position sensing (e.g. a potentiometer attached to the axis of a motor).

The obvious way would be to apply negative feedback to poll for position at some frequency, record the time interval to get the average speed over that interval, and use negative feedback to change the average speed by changing the pulse-width of the motor. The only problem I see with this (and I'm not sure how much of an issue this is in practice) is that the speed is potentially not very accurately set. Of course, the accuracy is dependent on polling frequency, position resolution, etc. But what I'm wondering is, given an ATMega8 or similar and sensing in the order of 10-bit, is this generally an effective method and, if not, what is a better method?

Additionally, there are cases where I might want to set speed such that a final position is reached over some interval of time (but perhaps with non-constant speed to get there). i would imagine in this sort of case, the method for setting speed changes a little such that the accuracy of the final position is increased (such as applying negative feedback to the speed history, not just the most recent average speed). What is the best practice in this case?

Yes, what you're describing is generally "how it's done" -- sometimes with the addition of already knowing things about the motor, the load, and the controller, to get a good "best guess" for the first iteration.

Also, to get to a specific position at a specific time, you'd typically use a PID controller. Read the Wikipedia article if you haven't encountered those before. This translates to both a desired position and desired velocity being inputs to the speed determination, and the desired speed & velocity must also follow an acceleration/decceleration curve to make movement smooth.

The original question already included a sensor attached to the motor.You don't use a potentiometer for that, though; you typically use either an optical encoder or a magnetic encoder of some sort. Absolute or relative have different use cases.

So is an optical encoder (an absolute optical encoder in my case, since position is more important than speed) the best way to go? I would have thought that an optical encoder would either be low resolution or expensive compared to a potentiometer.

A potentiometer is only barely good enough for a hobby servo used for little RC cars. I don't know of one that covers the entire range of movement, even -- you'll have a "dead zone" where there is no output. It is also usually noisy, because it relies on a mechanical wiper moving over a resistive material, and it also will wear out over time.

An optical encoder is a LOT better. It may have some sensitivity to dirt and grime if you don't get an enclosed one, and it still needs mechanical connections, but optical encoders are used in many industrial control and "pro" servo solutions.

If you can get away with it, absolute magnetic encoders can be fully contactless, and can give as good resolution as optical, if not better. From what I hear, they are generally less plug-and-play, though, requiring calibration after set-up before they can perform right. I have not used one myself (other than as integrated in servos like the Dynamixel MX-64T.)