[TriEmbed] C Code Question Ralated to Rotary Encoder

Mike Lisanke mikelisanke at gmail.com
Tue Feb 23 06:48:31 CST 2016


The best explanation is visual. Quadrature is two square waves 90 deg out
of phase. This is done by two physical optical slits on the rotary encoder
with a through beam optical coupler. Here's the image that helps understand
up-down counting

[image: Inline image 1]
you can see 2 lows 00, high-low 10, high-high 11, and low-high 01 as an
ever repeating pattern as the rotary encode moves in one direction or the
other. A glitch-free encode is necessary to count up or down on a state
transition as the input is too fast for almost any general purpose cpu
(that's not dedicated to counting).

On Mon, Feb 22, 2016 at 11:21 PM, Rodney Radford via TriEmbed <
triembed at triembed.org> wrote:

> I had to search for the video you watched to see what was being done and
> then find the code.  For those following along, the video is part of a 3
> part video of using a quadrature rotary encoder as an input for a morse
> code sending device.  The one necessary for this discussion is the part 2
> which can be found at https://www.youtube.com/watch?v=FGxLXqzPe3Q
>
> In the video, as the knob is turned to the left or right, a line is
> printed with three values on it, like this:
>
> 11      1      70
> 11      1      71
> 10      -1     70
> 10      -1     69
>
> The first column represents the two bits of the quadrature, the second
> column indicates whether we are counting up (+1) or down (-1) and the third
> column represents the current value.
>
> The question is how can the compiler know that the 11 represents a binary
> number whose value is 3, and how does it know that 10 represents a binary
> number whose value is 2.
>
> The answer is that it doesn't have to... the internal variable is called
> state and it either has a 0, 1, 2, or 3.
>
> When printing, the author decided to show the value of the number in
> binary, instead of decimal, so he printed the first value like this:
>
>    /* For demo purposes we will create an array of these binary digits */
>    String bits[] = {"00","01","10","11"};
>
>    /* Let's see what happened */
>    Serial.print(bits[state] + "    ");  // show us the two bits
>
> So as you see, the number is the index into a character string array and
> it prints out either the string "00", "01", "10", or "11".  This is just to
> make it easier for you to visualize that the number is really a two bit
> number representing the two outputs of the quadrature knob.
>
> The second value in the line is printed with this line (this is the one
> you showed).  This prints out only the
>
>    int bump[] = {0,0,-1,1};
>    Serial.print(bump[state],DEC);       // show us the direction of the
> turn
>
> Here we see the same 0..3 state variable indexing into a numerical array
> and printing out either 0, 0, -1 or +1 as a DECimal number.
>
> And then the third value is printed with these lines:
>
>     Serial.print("    ");
>     Serial.println(level);               // show us the new value
>
> Here we just print out the integer level variable that has already been
> incremented or decremented.
>
>
>
> On Mon, Feb 22, 2016 at 10:10 PM, Dwight Morgan via TriEmbed <
> triembed at triembed.org> wrote:
>
>> I’m trying to understand and use a rotary encoder on an Arduino project
>> and I have a simple demo circuit working with the encoder and output to the
>> serial monitor. I see how the code is working but I can’t find
>> documentation that confirms what I’m seeing.
>>
>>
>>
>> The C code builds a two digit binary number that is used as a pointer to
>> values in an array that is used to output either a 1 or -1 to indicate if
>> the encoder is rotating clockwise or counterclockwise – all well and fine.
>>
>>
>>
>> The variable used as a pointer is a type byte initially set to zero (byte
>> state = 0) with a function called by an interrupt to build the two digit
>> pointer. I looked it up and a byte can either hold 8 bits or a decimal
>> value from 0 to 255.
>>
>>
>>
>> The pointer works fine and prints out either a 1 or -1 on the serial
>> monitor.
>>
>>
>>
>> My question is, how does the code know that a binary 10 is not the number
>> ten as the pointer or binary 11 is not the number eleven as the pointer
>> instead of knowing it is the number 2 or 3 to be used as the pointer to
>> pick out values in the following array?
>>
>>
>>
>> int bump[] = {0,0,-1,1};
>>
>>
>>
>> The output is like this: Serial.print(bump[state]),DEC);  //state being
>> the built pointer of either binary 10 or 11 for a value of either decimal 2
>> or 3, respectively.
>>
>>
>>
>> Thanks to C code by Budd Churchward on YouTube.
>>
>>
>>
>> Input appreciated. Thanks!
>>
>>
>>
>> Dwight
>>
>>
>>
>>
>>
>> _______________________________________________
>> Triangle, NC Embedded Computing mailing list
>> TriEmbed at triembed.org
>> http://mail.triembed.org/mailman/listinfo/triembed_triembed.org
>> TriEmbed web site: http://TriEmbed.org
>>
>>
>
> _______________________________________________
> Triangle, NC Embedded Computing mailing list
> TriEmbed at triembed.org
> http://mail.triembed.org/mailman/listinfo/triembed_triembed.org
> TriEmbed web site: http://TriEmbed.org
>
>


-- 
Best regards,  Mike
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.triembed.org/pipermail/triembed_triembed.org/attachments/20160223/707c5959/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 15101 bytes
Desc: not available
URL: <http://mail.triembed.org/pipermail/triembed_triembed.org/attachments/20160223/707c5959/attachment.png>


More information about the TriEmbed mailing list