Edge-triggered quadrature decoder

Dependencies:   mbed

Committer:
wac
Date:
Fri Oct 29 20:28:45 2010 +0000
Revision:
0:646cd75bed54

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wac 0:646cd75bed54 1 // 9430 Quadrature Decoder using mbed edge-triggered interrupts
wac 0:646cd75bed54 2 //
wac 0:646cd75bed54 3 // Read quadrature encoder and drive LEDs
wac 0:646cd75bed54 4 // Version 0.1
wac 0:646cd75bed54 5 // Created by Wayne Chin
wac 0:646cd75bed54 6 // October 28, 2010
wac 0:646cd75bed54 7
wac 0:646cd75bed54 8 #include "mbed.h"
wac 0:646cd75bed54 9
wac 0:646cd75bed54 10 #define ON 0 // LED drives are inverted
wac 0:646cd75bed54 11 #define OFF 1 // LED drives are inverted
wac 0:646cd75bed54 12 #define MAXAMPS200 200
wac 0:646cd75bed54 13 #define MINAMPSET 25
wac 0:646cd75bed54 14 #define DEBOUNCETIME 6000 // Debounce delay in us
wac 0:646cd75bed54 15
wac 0:646cd75bed54 16 // mbed LEDs
wac 0:646cd75bed54 17 DigitalOut led1(LED1);
wac 0:646cd75bed54 18 DigitalOut led2(LED2);
wac 0:646cd75bed54 19 DigitalOut led3(LED3);
wac 0:646cd75bed54 20 DigitalOut led4(LED4);
wac 0:646cd75bed54 21
wac 0:646cd75bed54 22 // Quadrature encoder inputs
wac 0:646cd75bed54 23 InterruptIn quada(p21);
wac 0:646cd75bed54 24 InterruptIn quadb(p22);
wac 0:646cd75bed54 25 InterruptIn quadsw(p30);
wac 0:646cd75bed54 26
wac 0:646cd75bed54 27 // mbed API timers used for edge sensing and debouncing
wac 0:646cd75bed54 28 Timer debouncetimerrisea;
wac 0:646cd75bed54 29 Timer debouncetimerfalla;
wac 0:646cd75bed54 30 Timer debouncetimerriseb;
wac 0:646cd75bed54 31 Timer debouncetimerfallb;
wac 0:646cd75bed54 32 Timeout debouncerisea;
wac 0:646cd75bed54 33 Timeout debouncefalla;
wac 0:646cd75bed54 34 Timeout debounceriseb;
wac 0:646cd75bed54 35 Timeout debouncefallb;
wac 0:646cd75bed54 36
wac 0:646cd75bed54 37 Ticker updateserial;
wac 0:646cd75bed54 38 Serial pc(USBTX, USBRX); // tx, rx
wac 0:646cd75bed54 39
wac 0:646cd75bed54 40 int counter; // Global counter variable
wac 0:646cd75bed54 41
wac 0:646cd75bed54 42 void serialout()
wac 0:646cd75bed54 43 {
wac 0:646cd75bed54 44 pc.printf("%d\n\r", counter);
wac 0:646cd75bed54 45 }
wac 0:646cd75bed54 46
wac 0:646cd75bed54 47 void display()
wac 0:646cd75bed54 48 {
wac 0:646cd75bed54 49 if (counter > MAXAMPS200)
wac 0:646cd75bed54 50 counter = MAXAMPS200; // Clip counter at high end
wac 0:646cd75bed54 51 else if (counter < MINAMPSET)
wac 0:646cd75bed54 52 counter = MINAMPSET; // Clip at low end
wac 0:646cd75bed54 53 switch (counter % 4) // Get 2 LSBs and display sequence on mbed LEDs
wac 0:646cd75bed54 54 {
wac 0:646cd75bed54 55 case 0:
wac 0:646cd75bed54 56 led1 = 1; led2 = 0; led3 = 0; led4 = 0;
wac 0:646cd75bed54 57 break;
wac 0:646cd75bed54 58 case 1:
wac 0:646cd75bed54 59 led1 = 0; led2 = 1; led3 = 0; led4 = 0;
wac 0:646cd75bed54 60 break;
wac 0:646cd75bed54 61 case 2:
wac 0:646cd75bed54 62 led1 = 0; led2 = 0; led3 = 1; led4 = 0;
wac 0:646cd75bed54 63 break;
wac 0:646cd75bed54 64 default:
wac 0:646cd75bed54 65 led1 = 0; led2 = 0; led3 = 0; led4 = 1;
wac 0:646cd75bed54 66 break;
wac 0:646cd75bed54 67 } // switch
wac 0:646cd75bed54 68 }
wac 0:646cd75bed54 69
wac 0:646cd75bed54 70 // Read quadrature encoder, update counter variable, and update LEDs
wac 0:646cd75bed54 71 // Quadrature clockwise states: 00 -> 10 -> 11 -> 01
wac 0:646cd75bed54 72 // Quadrature counter-clockwise states: 00 -> 01 -> 11 -> 10
wac 0:646cd75bed54 73 void checkrisea()
wac 0:646cd75bed54 74 {
wac 0:646cd75bed54 75 debouncetimerrisea.stop();
wac 0:646cd75bed54 76 debouncetimerrisea.reset();
wac 0:646cd75bed54 77 debouncerisea.detach();
wac 0:646cd75bed54 78 if (quada == 1 && quadb == 0)
wac 0:646cd75bed54 79 counter++;
wac 0:646cd75bed54 80 else if (quada == 1 && quadb == 1)
wac 0:646cd75bed54 81 counter--;
wac 0:646cd75bed54 82 display();
wac 0:646cd75bed54 83 }
wac 0:646cd75bed54 84
wac 0:646cd75bed54 85 void checkfalla()
wac 0:646cd75bed54 86 {
wac 0:646cd75bed54 87 debouncetimerfalla.stop();
wac 0:646cd75bed54 88 debouncetimerfalla.reset();
wac 0:646cd75bed54 89 debouncefalla.detach();
wac 0:646cd75bed54 90 if (quada == 0 && quadb == 1)
wac 0:646cd75bed54 91 counter++;
wac 0:646cd75bed54 92 else if (quada == 0 && quadb == 0)
wac 0:646cd75bed54 93 counter--;
wac 0:646cd75bed54 94 display();
wac 0:646cd75bed54 95 }
wac 0:646cd75bed54 96
wac 0:646cd75bed54 97 void checkriseb()
wac 0:646cd75bed54 98 {
wac 0:646cd75bed54 99 debouncetimerriseb.stop();
wac 0:646cd75bed54 100 debouncetimerriseb.reset();
wac 0:646cd75bed54 101 if (quadb == 1 && quada == 1)
wac 0:646cd75bed54 102 counter++;
wac 0:646cd75bed54 103 else if (quadb == 1 && quada == 0)
wac 0:646cd75bed54 104 counter--;
wac 0:646cd75bed54 105 display();
wac 0:646cd75bed54 106 }
wac 0:646cd75bed54 107
wac 0:646cd75bed54 108 void checkfallb()
wac 0:646cd75bed54 109 {
wac 0:646cd75bed54 110 debouncetimerfallb.stop();
wac 0:646cd75bed54 111 debouncetimerfallb.reset();
wac 0:646cd75bed54 112 if (quadb == 0 && quada == 0)
wac 0:646cd75bed54 113 counter++;
wac 0:646cd75bed54 114 else if (quadb == 0 && quada == 1)
wac 0:646cd75bed54 115 counter--;
wac 0:646cd75bed54 116 display();
wac 0:646cd75bed54 117 }
wac 0:646cd75bed54 118
wac 0:646cd75bed54 119 // Start of edge-triggered interrupts
wac 0:646cd75bed54 120 void risea()
wac 0:646cd75bed54 121 {
wac 0:646cd75bed54 122 if (debouncetimerrisea.read_ms() == 0)
wac 0:646cd75bed54 123 {
wac 0:646cd75bed54 124 debouncetimerrisea.start();
wac 0:646cd75bed54 125 debouncerisea.attach_us(&checkrisea, DEBOUNCETIME); // Check on switch later
wac 0:646cd75bed54 126 }
wac 0:646cd75bed54 127 } // risea()
wac 0:646cd75bed54 128
wac 0:646cd75bed54 129 void falla()
wac 0:646cd75bed54 130 {
wac 0:646cd75bed54 131 if (debouncetimerfalla.read_ms() == 0)
wac 0:646cd75bed54 132 {
wac 0:646cd75bed54 133 debouncetimerfalla.start();
wac 0:646cd75bed54 134 debouncefalla.attach_us(&checkfalla, DEBOUNCETIME); // Check on switch later
wac 0:646cd75bed54 135 }
wac 0:646cd75bed54 136 } // falla()
wac 0:646cd75bed54 137
wac 0:646cd75bed54 138 void riseb()
wac 0:646cd75bed54 139 {
wac 0:646cd75bed54 140 if (debouncetimerriseb.read_ms() == 0)
wac 0:646cd75bed54 141 {
wac 0:646cd75bed54 142 debouncetimerriseb.start();
wac 0:646cd75bed54 143 debounceriseb.attach_us(&checkriseb, DEBOUNCETIME); // Check on switch later
wac 0:646cd75bed54 144 }
wac 0:646cd75bed54 145 } // riseb()
wac 0:646cd75bed54 146
wac 0:646cd75bed54 147 void fallb()
wac 0:646cd75bed54 148 {
wac 0:646cd75bed54 149 if (debouncetimerfallb.read_ms() == 0)
wac 0:646cd75bed54 150 {
wac 0:646cd75bed54 151 debouncetimerfallb.start();
wac 0:646cd75bed54 152 debouncefallb.attach_us(&checkfallb, DEBOUNCETIME); // Check on switch later
wac 0:646cd75bed54 153 }
wac 0:646cd75bed54 154 } // fallb()
wac 0:646cd75bed54 155
wac 0:646cd75bed54 156 int main() {
wac 0:646cd75bed54 157 quada.mode(PullUp); // Enable pullup
wac 0:646cd75bed54 158 quadb.mode(PullUp); // Enable pullup
wac 0:646cd75bed54 159 quadsw.mode(PullUp); // Enable pullup
wac 0:646cd75bed54 160 quada.rise(&risea); // Call function risea() on rising edge
wac 0:646cd75bed54 161 quada.fall(&falla); // Call function falla() on falling edge
wac 0:646cd75bed54 162 quadb.rise(&riseb); // Call function riseb() on rising edge
wac 0:646cd75bed54 163 quadb.fall(&fallb); // Call function fallb() on falling edge
wac 0:646cd75bed54 164 counter = 0; // Reset counter
wac 0:646cd75bed54 165
wac 0:646cd75bed54 166 pc.baud(19200);
wac 0:646cd75bed54 167 pc.printf("\n\rConnected to mBed...\r\n");
wac 0:646cd75bed54 168
wac 0:646cd75bed54 169 debouncetimerrisea.stop();
wac 0:646cd75bed54 170 debouncetimerrisea.reset();
wac 0:646cd75bed54 171 debouncetimerfalla.stop();
wac 0:646cd75bed54 172 debouncetimerfalla.reset();
wac 0:646cd75bed54 173 debouncetimerriseb.stop();
wac 0:646cd75bed54 174 debouncetimerriseb.reset();
wac 0:646cd75bed54 175 debouncetimerfallb.stop();
wac 0:646cd75bed54 176 debouncetimerfallb.reset();
wac 0:646cd75bed54 177
wac 0:646cd75bed54 178 // Set up interrupt call for serial port update
wac 0:646cd75bed54 179 //updateserial.attach_us(&serialout, 500000); // setup updateserial to call serialout every 500 ms
wac 0:646cd75bed54 180
wac 0:646cd75bed54 181 while (1)
wac 0:646cd75bed54 182 {
wac 0:646cd75bed54 183 }// while (1)
wac 0:646cd75bed54 184 } // main()