Quadrature Encoder on StartKit
Posted: Fri Sep 04, 2015 9:30 pm
Hey XCore Community,
I'm looking for some input on my code and some helpful hints. I've been attempting to incorporate a quadrature encoder with my StartKit and ran into some problems.
After sorting out my hardware issues (needs some pull-up resistors) I found out that it looks like my code is missing transitions. I should be getting ~700 counts / revolution but I end up with ~20-30 (it varies) and more if I rotate slowly. This is leading me to believe my code is inefficient or my approach is bad.
Code is below, but to summarize:
1. Use a 4 bit port (with inputs A and B on bits 0 and 1 respectively)
2. Dwell on this port and wait for changes (and change to A or B should trigger a recalculation)
3. Process the new data and share it to a process on another core to give it to the user (my attempt at speeding up the collection)
Any thoughts on this approach?
Thanks!
I'm looking for some input on my code and some helpful hints. I've been attempting to incorporate a quadrature encoder with my StartKit and ran into some problems.
After sorting out my hardware issues (needs some pull-up resistors) I found out that it looks like my code is missing transitions. I should be getting ~700 counts / revolution but I end up with ~20-30 (it varies) and more if I rotate slowly. This is leading me to believe my code is inefficient or my approach is bad.
Code is below, but to summarize:
1. Use a 4 bit port (with inputs A and B on bits 0 and 1 respectively)
2. Dwell on this port and wait for changes (and change to A or B should trigger a recalculation)
3. Process the new data and share it to a process on another core to give it to the user (my attempt at speeding up the collection)
Any thoughts on this approach?
Thanks!
Code: Select all
#include <xs1.h>
#include <timer.h>
#include <stdio.h>
/*
* This code will measure the counts of a quadrature encoder.
*/
// Define the bits that correspond to the signals. Since we are combining them on the 4 bit port this will make it easier to address them
#define quad1_a_mask 1
#define quad1_b_mask 2
// Quadrature Encoder Matrix; props to http://www.robotshop.com/media/files/PDF/tutorial-how-to-use-a-quadrature-encoder-rs011a.pdf for the idea
int quadEncoderMatrix [16] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
/* Inter task-communication layer */
interface my_interface {
void encoderCounts ( int x);
};
// Monitor Encoder Task
void monitorEncoder (client interface my_interface i);
//Print Encoder Task
void printEncoder ( server interface my_interface i);
/* This the port where the leds reside */
port quad = XS1_PORT_4E;
int main(void) {
interface my_interface i1 ;
par {
monitorEncoder(i1);
printEncoder(i1);
}
return 0;
}
void monitorEncoder (client interface my_interface i) {
int quadTicks = 0;
int oldQuadPulse, newQuadPulse;
oldQuadPulse = 0;
newQuadPulse = 0;
while(1) {
quad :> newQuadPulse;
quadTicks += quadEncoderMatrix[oldQuadPulse * 4 + newQuadPulse];
i.encoderCounts (quadTicks);
oldQuadPulse = newQuadPulse;
}
}
void printEncoder ( server interface my_interface i) {
while (1) {
// wait for either encoderCounts over connection 'i '.
select {
case i.encoderCounts ( int x ):
printf("Encoder: %i \n", x);
break ;
}
}
}