Quadrature decoder

Dependents:   Telliskivi2_2014

Committer:
Reiko
Date:
Mon Jul 29 20:25:05 2013 +0000
Revision:
0:0e8cb3139868
Child:
1:83b43784d90c
Created decoder library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Reiko 0:0e8cb3139868 1 #include "qed.h"
Reiko 0:0e8cb3139868 2
Reiko 0:0e8cb3139868 3 QED::QED(PinName channelA, PinName channelB)
Reiko 0:0e8cb3139868 4 : interruptA(channelA), interruptB(channelB) {
Reiko 0:0e8cb3139868 5
Reiko 0:0e8cb3139868 6 pulses = 0;
Reiko 0:0e8cb3139868 7
Reiko 0:0e8cb3139868 8 //Workout what the current state is.
Reiko 0:0e8cb3139868 9 int chanA = interruptA.read();
Reiko 0:0e8cb3139868 10 int chanB = interruptB.read();
Reiko 0:0e8cb3139868 11
Reiko 0:0e8cb3139868 12 //2-bit state.
Reiko 0:0e8cb3139868 13 currState = (chanA << 1) | (chanB);
Reiko 0:0e8cb3139868 14 prevState = currState;
Reiko 0:0e8cb3139868 15
Reiko 0:0e8cb3139868 16 interruptA.rise(this, &QED::decode);
Reiko 0:0e8cb3139868 17 interruptA.fall(this, &QED::decode);
Reiko 0:0e8cb3139868 18 interruptB.rise(this, &QED::decode);
Reiko 0:0e8cb3139868 19 interruptB.fall(this, &QED::decode);
Reiko 0:0e8cb3139868 20 }
Reiko 0:0e8cb3139868 21
Reiko 0:0e8cb3139868 22 int QED::read() {
Reiko 0:0e8cb3139868 23 int pulseCount = pulses;
Reiko 0:0e8cb3139868 24 pulses = 0;
Reiko 0:0e8cb3139868 25 return pulses;
Reiko 0:0e8cb3139868 26 }
Reiko 0:0e8cb3139868 27
Reiko 0:0e8cb3139868 28 void QED::decode() {
Reiko 0:0e8cb3139868 29
Reiko 0:0e8cb3139868 30 int change = 0;
Reiko 0:0e8cb3139868 31 int chanA = interruptA.read();
Reiko 0:0e8cb3139868 32 int chanB = interruptB.read();
Reiko 0:0e8cb3139868 33
Reiko 0:0e8cb3139868 34 currState = (chanA << 1) | (chanB);
Reiko 0:0e8cb3139868 35
Reiko 0:0e8cb3139868 36 change = (prevState & PREV_MASK) ^ ((currState & CURR_MASK) >> 1);
Reiko 0:0e8cb3139868 37
Reiko 0:0e8cb3139868 38 if (change == 0) {
Reiko 0:0e8cb3139868 39 change = -1;
Reiko 0:0e8cb3139868 40 }
Reiko 0:0e8cb3139868 41
Reiko 0:0e8cb3139868 42 pulses -= change;
Reiko 0:0e8cb3139868 43
Reiko 0:0e8cb3139868 44 prevState = currState;
Reiko 0:0e8cb3139868 45 }