Using Gray code for rotary encoders

Gray code is well known and widely used in angular movement systems where angular positions have to be known. Gray code encoder can be constructed pretty easily by masked wheel where tracks are read with photocells.

gray code encoder

Did you look at the picture and thought for yourself that gray code is the same binary code. Well, no… the main problem with binary systems was using binary code in tracks; there are many positions where several tracks change state simultaneously. This may result in an error. Actually, in gray code, only one track can change at the same time during rotation. So then, if an error occurs, the resulting error will be only one bit. Gray code is easy to convert to binary this task can be done by any microcontroller using a lookup table:

Gray code to binary analytically

Also, you can convert Gray code to binary analytically. To convert from binary to Gray, start at the MSB and compare it to 0. If MSB is equal to0, then write 0 as the MSB for the Gray coded number, otherwise write 1. Next, compare the next MSB and compare it to the MSB. If they are equal, write a 0 in the Gray coded number; otherwise, 1. Then compare each bit in the binary number to the bit just to the left of it and write 0 for a true comparison and 1 for a false. This procedure continues until the LSB is compared with the second bit.

The image below shows a 5-bit rotation encoder, using a Gray-code pattern and an optical sensor.


  1. > The image bellow shows a 5-bit rotation encoder,
    > using a Gray-code pattern

    Actually, that is a 5 bit binary pattern. It shows one of the apparent impracticalities of binary encoding patterns; the inner ring has a very high ‘frequency’.

    The image on top of the article shows a Gray pattern. Note the lower ‘frequency’ of the inner ring.

    • ahoeben, the pattern on the wheel is a 5-bit gray code, which is a binary pattern, but not in counting order. Only one-bit changes from number to number as the wheel turns. The high frequency on the inner-wheel is not an issue because the electronics can easily be made fast enough to handle faster speeds than the motor. Usually optical sensors are used.

  2. Oops, both wheels are correct. The lower wheel has a different gray code pattern. Note, only one-bit changes there too. I have a program that produces gray code position wheels, and it can produce the wheel below. (It can produce many wheels by changing parameters).

Leave a Reply