I recently received an e-mail asking for some help picking the right resolution for an Optical Incremental Encoder. I have removed the personal information and the drive/controller information, otherwise the e-mail is verbatim:

I think I see what you are after, but you are missing some information. The Encoder calculator on the web site is a bit too simple for what you are trying to do. It is really meant to be a quick conversion tool to find out of your Incremental Encoder is going to violate controller input frequency limitations, and the like.

The ability of the system to regulate to a given speed will depend on more than just the line count of the encoder. The real question that needs to be answered before we can determine Incremental Encoder resolution is “How many pulses are needed per update?” this is a question that will need to be asked of the Drive manufacturer/supplier, but I am sure they will have further questions about the motor size and loading as well.

It is easy to see that a motor without a load is easier to regulate than one with a dynamic (changing) load. Therefore the size of the motor (and it’s inertia) and the size of the load (and it’s inertia) will need to be taken into account.

With all that being said, we can do some quick math to get a feel for what we do know about the application.

Before I get started, one major thing to note here is that it appears that you are asking for regulation to occur on the output of the gearbox. I am guessing that the Incremental Encoder is on the motor side (input) of the gear box, so there will be a scaling factor of the input to output ratio that will need to be taken into account along with the following math:

We know that you want to regulate speed within a range of 0.1 RPM to 230 RPM.

After this we really need to ask is “What can the drive do?” At the top speed we will travel over a degree before the drive can update the loop for any error component. In the minimum speed example, the drive will not see a change in count over 1667 loop updates. How does the drive handle this?

To see what this means in Incremental Encoder pulses vs Drive Loop Updates we can take the highest line count encoder we currently provide, a 20,000 LC QR12:

Just taking a very rough look at it, a 20,000 line count incremental Encoder appears to have more than enough data per update to give the drive a good idea of how fast the motor is turning at the high speed, while at the slow speed the drive has to wait for several loop updates to pass until it sees even one edge of the Incremental Encoder Signals.

Will the drive be able to regulate at this lower speed without falling out of the 1% tolerance? My guess is probably not, but only the drive manufacturer can answer that for sure. I am also wondering if 1% regulation is really needed at these slow speeds.

Keep in mind that these numbers would also need to be scaled by the input to output shaft ratio if the encoder is on the input side to the gearbox and the RPM’s above are actually referring to the output shaft speed.

Can the application tolerate being out of the 1% specification momentarily while the drive recovers? If so, your focus should likely be on loop response time.

At the very least I am guessing tuning the loop to accommodate for both full speed and slow speed may be difficult.

We recently teamed up with one of our distributors to create a Demo box that showcased our QD145 optical encoder with a Delta Tau PLC and touchscreen panel. It was sent off to a trade show where potential customers would get to spin the encoder and watch on the screen as counts were incremented and decremented and needles on dials spun.

I thought the Optical Encoder Demo box would make for a fantastic topic to write a post on, so that was my plan as soon as the demo box returned from the show.

Well… it never did come back. I would love to tell you that I did such a great job on it that our distributor insisted on keeping it but the truth of the matter is that it was lost in shipping.

What I do have is the code and screenshot of the Optical Encoder Demo box, which should be more than enough to explain the functionality. What I don’t have are pictures, or video of the Optical Encoder Demo box in action, so you will have to use a little imagination on your part.
I mounted the PLC, HMI and encoder to an enclosure that can set on a table. The default screen (shown above) tells a little about the encoder. From this screen you can select a few different screens that allow you to interact with the encoder.

This screen shows mechanical degrees. The needle rotates in conjunction with encoder rotation:

Optical Encoder Mechanical Degree Screen

Pulse Count:
This screen shows the direct read count of the encoder, the needle rotates in conjunction with encoder rotation:

Optical Encoder Pulse Count Screen

Tank Screen:
This is sort of a fun screen where rotation the encoder fills tanks in sequence, tank one fills, when tank one is full it “empties” into tank 2, when tank 2 is full it “empties” into tank 3. Tank 3 continues to accumulate until 2 billion counts or so. The Drain button clears the levels on all of the tanks.

Optical Encoder Tank Filling Screen

ABZ screen:
This screen indicates status of inputs coming from the encoder. Since I used a 5000 LC encoder, the screen was not be able to keep up real time when the encoder was rotated really fast, and it was nearly impossible to land on Z(Index) and have it light.

Optical Encoder Incremental Signals Screen

Programming

The Delta Tau was pretty easy to program, with only a couple hiccups. The manual was a little vague in its explanation of the way two registers were used for some of the counter functions, but a little troubleshooting showed me which bits were activated when the counter set point was hit.

This first rung of code is needed to do some basic housekeeping to ensure that D1022 is properly configured with a “1” on the first program scan. It is set by M1002 and forever latched by M110. The value of 1 tells the high speed input that we want a double frequency selection A/B phase counter.

The second rung sets up our high speed counter and checks the count to see if we have gone negative in value. If so, bit M120 is set high.

Rung three turns on a physical output Y11 if the counter set point has been hit.

Rung four moves the set point of 5000 back into the counter if we have gone negative in value. This allows the needles on our display screens to rotate continuously and not peg out to a high or low value.

Rung six divides the counter value by 16 and moves the answer into Register D302. This is where we start our math for the degree conversion. The rest is scaled by the configuring the screen register in the screen editor software.

Run seven uses the trailing edge of our 10 mS clock pulse to move the counter value into register D310. This value is held for comparison in time to get RPM.

Rung eight uses the leading edge of our 10mS clock pulse to find the difference in our stored value and put it out to register D312. D312 is then doubled and sent out to register D350.

For any of you interested in repeating the project, I have included the BOM below.

Of course, I also used some miscellaneous wire and hardware to construct the Optical Encoder Demo box, but the list below includes all the big ticket items.

We only need to measure one of the incremental channels in order to calculate the RPM of an optical encoder. Using an oscilloscope to measure the period of one incremental channel A cycle.

We will need to find the frequency of the incremental signal. Keep in mind that converting from time to frequency is just a simple press of the “one over X” button on a scientific calculator.

Frequency =(1/X time)

Time = (1/X Frequency)

To find RPM Once you have the frequency, Multiply by sixty and divide by the line count.

RPM = (Frequency X 60)/Line count of encoder

The encoder in the video is a 5000 Line Count encoder. Channel A is outputting pulses at a frequency of 224.2 Khz

RPM = (224.2Khz X 60)/5000

RPM = (13452000)/5000

RPM = 2690.4 RPM

I often use this method to either verify the speed of a motor controller I have built, or if I know the RPM of the motor, I will sometimes use this as a quick way to verify the line count of an encoder.

The most important thing to understand about Gray code is that only one bit changes from transition to transition. In binary it is possible for a number to go from all ones to all zeros, as is the case with 11111111 (255 decimal) going back around to 00000000 (zero).

Notice how only one of the 0’s or 1’s of the Gray code change as the number increments? In binary there are times when all of the bits change, (0111 to 1000 (Seven to Eight ) and 1111 back to 0000 (Fifteen to Zero) ).

Error Checking

The advantage to only one bit changing in Gray code is that it gives you error-checking ability. If you sum the number of bits the bit total will always change by only one.

You could also do some error checking knowing that the bit sum will always alternate between even and odd.

Gray Bit Sum0000 00001 10011 20010 10110 2 0111 30101 20100 1

Gray Code in Incremental Encoders

The A & B channels of Incremental Encoders are in quadrature, which makes a two-bit gray code progression. Depending on direction, the Incremental Encoder bit progression with be a cyclical pattern of either 00 – 01 -11 – 10 or 00 – 10 – 11 – 01 – 00.

I have interfaced a 200 LC QD145 to a DL06 PLC to show how to convert from a line count to mechanical degrees. This type of conversion may be useful for any application needing to know an angular measurement.

To calculate a degree measurement we divide 360 by the line count to get the number of degrees per pulse.

(360 Degrees /200 Pulses per revolution) = 1.8 Degrees per pulse.

The High Speed counter we have set up will automatically add one to it’s running total any time the encoder is rotated counter-clockwise, and subtract one from the running total any time the optical encoder is rotated clockwise.

This value is loaded into the PLC’s accumulator and multiplied by 1.8 (K18) to convert to degrees. The number is then outputted to an address(V2500)that we can display on the screen.

When the index (Z) pulse occurs, we reset the counter to let it know we are back at zero.

Below is the PLC code for the pulses to degree conversion.

It is good to note that the PLC is set up to retain the count value when powered off, but if the optical encoder is rotated during this time, the count will not change and the value at power up will be different than the encoders real world position.

It is good practice to rotate an incremental encoder/optical encoder on power up until an index pulse is seen and start counting from there. This is technique is known as “homing”.

By default the quadrature counting mode within the PLC keeps track of negative numbers, so we are able to accumulate a negative degree value depending on the direction of rotation after zero. While this may seem a bit confusing, it is really just a matter of your point of reference. –90 Degrees is the same exact point as a positive 270 Degrees. If we wanted to convert to where we stayed within a positive degree range, you could change the PLC code to add 360 to the measured value any time it went negative.