I have a servo motor that outputs a resolver signal (sine, cosine, and reference). Each of the three signals is a differential pair (+A/-A, +B/-B, etc.). And the three signals are encoded using an 8 kHz carrier signal. Below is a plot that I made from an oscilloscope data capture.

enter image description here

The plot shows the sine (A) signal only. I took the difference (+A - -A) to reduce the noise. The three colors (red, blue, green) represent measurements at three RPMs: 10, 20, and 40, respectively. The bands, or what look like bands, are actually the envelope functions. If you zoom in (see small breakout plot above the larger plot), you can see that each band is composed of a higher frequency (8 kHz) carrier signal. The 8 kHz frequency does not change with motor RPMs, but the phase between the sine and cosine signals does change with each zero-level crossing. My understanding is that this is a normal way to encode resolver data.

My question is this: What is the best way to extract the RPMs? I do not need the azimuth, just the RPMs. I would like a robust way of extracting the motor speed, and I would prefer simple solutions over complex solutions. I have an idea of how to do it, but I want to make sure I'm doing this is the best way before I burn too many more calories on this.

Thank you in advance

Edit: My current strategy is to demodulate the signal with a diode and a low-pass filter. Then digitize it using a LM311/Schmitt trigger, and measure the frequency using a Teensy 4.0 microcontroller. I would like accuracy in the 1% range or better. As for resources, I can design and build SM and TH boards. I have standard equipment: DMMs, oscilloscopes, signal generators, lab power supplies, etc.

As for 'simple,' sorry for the subjectivity of the word. That just means that I would prefer not to have to involve an FPGA or anything at that level. I don't want to curve-fit the data to get the derivative if I can just digitize and count pulses. That sort of thing.

  • \$\begingroup\$ Define "simple": your "simple" may be my "horrendously complex", or visa versa. Do this by editing your question. While you're doing that give us an idea of the resources you have available (i.e., processor, it's speed, whether you're designing a board or putting together off-the-shelf motion control components). Also let us know what sort of accuracy you need, and the sample rate. \$\endgroup\$
    – TimWescott
    Mar 27, 2023 at 2:53
  • \$\begingroup\$ @TimWescott Thanks. I will add those details. \$\endgroup\$
    – njs
    Mar 27, 2023 at 3:02
  • \$\begingroup\$ do you have the 8Khz reference available? \$\endgroup\$ Mar 27, 2023 at 3:51
  • \$\begingroup\$ @JasenСлаваУкраїні I do. The connector I'm splicing into has A, -A, B (cosine), -B, and a plus-minus reference signal. \$\endgroup\$
    – njs
    Mar 27, 2023 at 3:53

1 Answer 1


Trigger a sampling of the A signal when the reference peaks. (pick positive or negative peak) thses peaks should be at the same time the A (also b and c waves are peaking)

Count how many times the sampled A signal changes polarity in a minute (or see howe long it takes for it to change)

You'll probably need to de-noise the signal a bit, (maybe ignore readings with low magnitude, boxcar average, etc)

  • \$\begingroup\$ Thank you for the response. This is what I'm in the process of doing: Signal --> Active Filter --> Schmitt Trigger --> Microcontroller. I just wanted to make sure there wasn't a more elegant solution before going too far down this path. \$\endgroup\$
    – njs
    Mar 28, 2023 at 14:50
  • \$\begingroup\$ If your microcontroller has a fast enough ADC you can possibly do some of those steps in software. \$\endgroup\$ Mar 28, 2023 at 20:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.