A short demo on InterruptIn usage...

Dependencies:   mbed

Committer:
acracan
Date:
Thu Jun 25 08:57:32 2015 +0000
Revision:
0:5e7363c894ab
First commit...

Who changed what in which revision?

UserRevisionLine numberNew 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 }