Test program for quadrature encoder interface

Dependencies:   mbed

Revision:
0:75e3cf27c60b
diff -r 000000000000 -r 75e3cf27c60b main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Dec 31 15:22:03 2012 +0000
@@ -0,0 +1,100 @@
+#include "mbed.h"
+ 
+DigitalIn phaseA( p5 ); // phase a of the quadrature encoder
+DigitalIn phaseB( p6 ); // phase b of the quadrature encoder
+ 
+int encoderClickCount    = 0; // hold the signed value corresponding to the number of clicks left or right since last sample
+int previousEncoderState = 0; // keep a record of the last actioned sample state of the Qb+Qa outputs for comparison on each interrupt
+ 
+void quadratureDecoder( void )
+{
+    int currentEncoderState = (phaseB.read() << 1) + phaseA.read(); // create a two bit value out of phaseB and phaseA
+    
+    if( currentEncoderState == previousEncoderState )
+    {
+        return;
+    }
+    
+    switch( previousEncoderState )
+    {
+        case 0:
+            if( currentEncoderState == 1 )
+            {
+                encoderClickCount--;
+            }
+            else if( currentEncoderState == 2 )
+            {
+                encoderClickCount++;
+            }
+            break;
+            
+        case 1:
+            if( currentEncoderState == 3 )
+            {        
+                encoderClickCount--;
+            }
+            else if( currentEncoderState == 0 )
+            {
+                encoderClickCount++;
+            }
+            break;
+            
+        case 2:
+            if( currentEncoderState == 0 )
+            {
+                encoderClickCount--;
+            }
+            else if( currentEncoderState == 3 )
+            {
+                encoderClickCount++;
+            }
+            break;
+            
+        case 3:
+            if( currentEncoderState == 2 )
+            {
+                encoderClickCount--;
+            }
+            else if( currentEncoderState == 1 )
+            {
+                encoderClickCount++;
+            }
+            break;
+
+        default:
+            break;
+    }
+    previousEncoderState = currentEncoderState;
+}
+ 
+ // read the rotation accumulator, and once read, reset it to zero
+int getClicks( void )
+{
+   int res = encoderClickCount; // this allows the knob to be rotated "while im not looking at it' and still return the 
+    
+    encoderClickCount = 0;      // actual number of clicks that have been rotated since last time I was checking it.
+
+    return res;
+}
+ 
+int main()
+{
+    Serial pc( USBTX, USBRX );
+    Ticker sampleTicker;                                // create a timer to sample the encoder
+    int    currentClicks;
+
+    phaseA.mode( PullUp );                              // phaseA is set with a built in pull-up resistor
+    phaseB.mode( PullUp );                              // phaseB is set with a built in pull-up resistor    
+    sampleTicker.attach_us( &quadratureDecoder, 1000 ); // make the quadrature decoder function check the knob once every 1000us = 1ms
+
+    pc.printf( "Encoder test started\r\n" );
+    while( 1 )
+    {
+        currentClicks = getClicks();
+        if( currentClicks != 0 )
+        {
+            pc.printf( "click count = %d,%d\r\n", currentClicks, previousEncoderState );
+        }
+        wait_ms( 200 );
+    }
+}