Arcadie Cracan
/
interruptDemo
A short demo on InterruptIn usage...
main.cpp@0:5e7363c894ab, 2015-06-25 (annotated)
- Committer:
- acracan
- Date:
- Thu Jun 25 08:57:32 2015 +0000
- Revision:
- 0:5e7363c894ab
First commit...
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
acracan | 0:5e7363c894ab | 1 | #include "mbed.h" |
acracan | 0:5e7363c894ab | 2 | |
acracan | 0:5e7363c894ab | 3 | DigitalIn A(D15); |
acracan | 0:5e7363c894ab | 4 | DigitalIn B(D14); |
acracan | 0:5e7363c894ab | 5 | PwmOut squareSignal(D10); |
acracan | 0:5e7363c894ab | 6 | InterruptIn riseEvent(D9); |
acracan | 0:5e7363c894ab | 7 | Serial pc(USBTX, USBRX); |
acracan | 0:5e7363c894ab | 8 | Timer displayTimer; |
acracan | 0:5e7363c894ab | 9 | |
acracan | 0:5e7363c894ab | 10 | Timer periodTimer; |
acracan | 0:5e7363c894ab | 11 | Timer freqUpdateTimer; |
acracan | 0:5e7363c894ab | 12 | float period; |
acracan | 0:5e7363c894ab | 13 | float generatorPeriod = 1.0e-3f; |
acracan | 0:5e7363c894ab | 14 | float delta = 50.0e-6f; |
acracan | 0:5e7363c894ab | 15 | |
acracan | 0:5e7363c894ab | 16 | void readEncoder(); |
acracan | 0:5e7363c894ab | 17 | void onRisingEdge(); |
acracan | 0:5e7363c894ab | 18 | |
acracan | 0:5e7363c894ab | 19 | int main() |
acracan | 0:5e7363c894ab | 20 | { |
acracan | 0:5e7363c894ab | 21 | // configuram semnalul dreptunghiular |
acracan | 0:5e7363c894ab | 22 | // perioada = 1ms |
acracan | 0:5e7363c894ab | 23 | // latimea pulsului = 0.5ms |
acracan | 0:5e7363c894ab | 24 | squareSignal.period(generatorPeriod); |
acracan | 0:5e7363c894ab | 25 | squareSignal = 0.5f; |
acracan | 0:5e7363c894ab | 26 | |
acracan | 0:5e7363c894ab | 27 | riseEvent.rise(onRisingEdge); |
acracan | 0:5e7363c894ab | 28 | periodTimer.start(); |
acracan | 0:5e7363c894ab | 29 | |
acracan | 0:5e7363c894ab | 30 | displayTimer.start(); |
acracan | 0:5e7363c894ab | 31 | freqUpdateTimer.start(); |
acracan | 0:5e7363c894ab | 32 | while (true) { |
acracan | 0:5e7363c894ab | 33 | readEncoder(); |
acracan | 0:5e7363c894ab | 34 | if (displayTimer.read() > 0.5f) { |
acracan | 0:5e7363c894ab | 35 | pc.printf("Frequency: %g, period: %g\n", 1.0f / period, period); |
acracan | 0:5e7363c894ab | 36 | displayTimer.reset(); |
acracan | 0:5e7363c894ab | 37 | } |
acracan | 0:5e7363c894ab | 38 | if (freqUpdateTimer.read_us() > 1000) { |
acracan | 0:5e7363c894ab | 39 | squareSignal.period(generatorPeriod); |
acracan | 0:5e7363c894ab | 40 | squareSignal = 0.5f; |
acracan | 0:5e7363c894ab | 41 | freqUpdateTimer.reset(); |
acracan | 0:5e7363c894ab | 42 | } |
acracan | 0:5e7363c894ab | 43 | } |
acracan | 0:5e7363c894ab | 44 | } |
acracan | 0:5e7363c894ab | 45 | |
acracan | 0:5e7363c894ab | 46 | void onRisingEdge() |
acracan | 0:5e7363c894ab | 47 | { |
acracan | 0:5e7363c894ab | 48 | period = periodTimer.read(); |
acracan | 0:5e7363c894ab | 49 | periodTimer.reset(); |
acracan | 0:5e7363c894ab | 50 | } |
acracan | 0:5e7363c894ab | 51 | |
acracan | 0:5e7363c894ab | 52 | void readEncoder() |
acracan | 0:5e7363c894ab | 53 | { |
acracan | 0:5e7363c894ab | 54 | static int state = 0; |
acracan | 0:5e7363c894ab | 55 | int currentState; |
acracan | 0:5e7363c894ab | 56 | const int stateOrder[] = {0, 2, 3, 1}; |
acracan | 0:5e7363c894ab | 57 | const int stateIndex[] = {0, 3, 1, 2}; |
acracan | 0:5e7363c894ab | 58 | int ccwState, cwState; |
acracan | 0:5e7363c894ab | 59 | |
acracan | 0:5e7363c894ab | 60 | currentState = (A << 1) | B; |
acracan | 0:5e7363c894ab | 61 | ccwState = stateOrder[(stateIndex[state] + 3) & 3]; |
acracan | 0:5e7363c894ab | 62 | cwState = stateOrder[(stateIndex[state] + 1) & 3]; |
acracan | 0:5e7363c894ab | 63 | if (currentState == cwState) |
acracan | 0:5e7363c894ab | 64 | encoderIncrement(); |
acracan | 0:5e7363c894ab | 65 | else if (currentState == ccwState) |
acracan | 0:5e7363c894ab | 66 | encoderDecrement(); |
acracan | 0:5e7363c894ab | 67 | state = currentState; |
acracan | 0:5e7363c894ab | 68 | } |
acracan | 0:5e7363c894ab | 69 | |
acracan | 0:5e7363c894ab | 70 | void encoderIncrement() |
acracan | 0:5e7363c894ab | 71 | { |
acracan | 0:5e7363c894ab | 72 | generatorPeriod += delta; |
acracan | 0:5e7363c894ab | 73 | } |
acracan | 0:5e7363c894ab | 74 | |
acracan | 0:5e7363c894ab | 75 | void encoderDecrement() |
acracan | 0:5e7363c894ab | 76 | { |
acracan | 0:5e7363c894ab | 77 | generatorPeriod -= delta; |
acracan | 0:5e7363c894ab | 78 | } |