Quadrature decoder
qed.cpp@0:0e8cb3139868, 2013-07-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |