please dont rip this site

Stepper Motor As Rotary Encoder

by Jinx (copied with permission from

A stepper motor can be used as an encoder. As the rotor is turned, its movement past
the coils induces a voltage in them. Much as the motor is driven by energising the coils
in a particular sequence or pattern, so the induced voltages appear when the motor is
used as a generator

Background reading - Jones On Stepper Motors

These voltages can be used as a measure of step direction and rotational speed

The waveform from a stepper coil is poorly-defined at low speed and single-stepping

However, by slightly energising the coils, the waveform can be dramatically improved

This picture shows the difference. Traces are on the same voltage scale

(Note - the waveforms were captured using the computer's soundcard)

'Unenergised' - the voltage measured is from simply turning the rotor. Step pulses are there
but indistinct

'Energised' - approximately 6mA of DC is passed through one coil of a bipolar motor. The
pulses are what appear on the other. Previously hidden amongst the noise, they are now clear.

Additionally, the energising introduces an amount of cogging or detent, ie the rotor is less
free-running. This enhances the stepping 'feel' and helps produces sharper and higher pulses
by momentarily causing an increase in speed of the rotor as it passes the pole

Taking this further, both coils are energised with a few mA of current

Each step of the rotor produces a voltage, as shown, measured at 'X1' or X2. Note that, as
mentioned above re sequencing, the voltage produced at X2 will follow or precede that at X1,
depending on which way the rotor is turning. '60ms' will decrease as the turning speed increases
and is just an example at a step rate of about 2Hz

If X1 and X2 are taken to a comparator, the trimpot is set for a normally high output that
goes low when the input on the -ve pin goes above that on the +ve pin. The result is a logic-
level quadrature signal that can be interpreted by a micro. The time difference between leading
edges of A and B pulses can be as low as a few hundred microseconds or as high as several
milliseconds, depending on rotational speed and effectiveness of the motor as a generator.

Alternatively, the voltages at X1 and X2 can be measured directly by a micro's ADC or internal

Interface suggestions

In Fig1, A and B are taken to inputs which are polled, as program flow has time for. If speed
measurement is important, then a more immediate reaction to a new pulse may be desirable.
An interrupt can be enabled to do this. For micros with just one INT pin, the diode OR-ing
of Fig2 will cause an interrupt - or at least INT0IF to be set - on either A or B going high
or low (INTEDG sets the polarity-change trigger). The two pins can then be examined to find
which caused the interrupt, that one being the leading pulse. A pull down is required to stop
INT0 floating high when the comparator goes low. >10k should work. Micros with more
than one INT can use Fig3. Speed is measured by timing the interval between pulses on the A
or B line

10k is not an overly high source impedance, and pulse detection is the goal rather than
accurate measurement of the voltage produced. A buffer/amplifier of Fig4 could be used,
or the 10k resistors reduced. With this particular motor, a 1k resistor results in an X1/X2
voltage of around 1V, which is still adequate for reliable processing.

Fig5 shows how the X1/X2 analogue voltages are converted to logic. This arrangement
will invert the signal. ie the collector of the transistor will be normally high and go low
when the transistor turns on with a sufficient voltage on its base. In Fig6, voltages may
be high enough to meet the Vin threshold of some logic families.

The technique has been tested on many types of stepper motor and works well. The user needs
to consider the coil resistance and voltage rating. For example, one motor tried was a 24V, 7.5
degree unipolar with centre-tapped 190 ohm coils. To get performance similar to that above, a
12V supply was needed. However, this was with the 680 ohm resistors. With lower resistors,
5V would work. The point being that much of the above circuits and software to interpret the
signals and voltages can be customised to suit any particular motor or application


M. Adam Davis for suggesting energisation - Micro Basics
The PICList - PICList home page

file: /Techref/io/sensor/pos/enc/stepper_as_encoder.htm, 5KB, , updated: 2008/12/6 18:37, local time: 2024/6/17 19:45,

 ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF=""> Stepper Motor, Rotory Encoder</A>

After you find an appropriate page, you are invited to your to this massmind site! (posts will be visible only to you before review) Just type a nice message (short messages are blocked as spam) in the box and press the Post button. (HTML welcomed, but not the <A tag: Instead, use the link box to link to another page. A tutorial is available Members can login to post directly, become page editors, and be credited for their posts.

Link? Put it here: 
if you want a response, please enter your email address: 
Attn spammers: All posts are reviewed before being made visible to anyone other than the poster.
Did you find what you needed?


Welcome to!


Welcome to!