Test code to read a tyco dpl12 quadrature encoder and vary the level of the 2 inbuilt leds. Fades colour from red, through orange and yellow, to green. Push button momentarily extinguishes the leds.

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 DigitalIn sw_in (p5);
00004 InterruptIn enc_a (p6);
00005 InterruptIn enc_b (p7);
00006 PwmOut led1 (p22);
00007 PwmOut led2 (p23);
00008 
00009 void enc_a_int_routine (void);
00010 void enc_b_int_routine (void);
00011 
00012 bool enc_a_state;
00013 bool enc_b_state;
00014 bool old_enc_a_state;
00015 bool old_enc_b_state;
00016 int val_min = 0;
00017 int val_max = 100;
00018 int val = ((val_max - val_min) / 2) + val_min;
00019 int val_old = val;
00020 
00021 int main() {
00022     sw_in.mode(PullUp);
00023     enc_a.mode(PullUp);
00024     enc_b.mode(PullUp);
00025     enc_a_state = enc_a;
00026     enc_b_state = enc_b;
00027     enc_a.rise(&enc_a_int_routine);
00028     enc_b.rise(&enc_b_int_routine);
00029     enc_a.fall(&enc_a_int_routine);
00030     enc_b.fall(&enc_b_int_routine);
00031     while (1) {
00032         if (val != val_old) {
00033             printf("\n\r%i",val);
00034         } // if (val != val_old)
00035         val_old = val;
00036         if (sw_in) {
00037             led1 = val / 100.0;
00038             led2 = 1.0 - (val / 100.0);
00039         } else {
00040             printf("button\n\r");
00041             led1 = 0;
00042             led2 = 0;
00043         } // if (sw_in)
00044     } // while(1)
00045 } // end main
00046 
00047 void enc_a_int_routine (void) {
00048     old_enc_a_state = enc_a_state;
00049     old_enc_b_state = enc_b_state;
00050     enc_a_state = enc_a;
00051     enc_b_state = enc_b;
00052     if (((enc_a_state != old_enc_a_state) && (enc_b_state != old_enc_b_state)) || ((enc_a_state == old_enc_a_state) && (enc_b_state == old_enc_b_state))) {
00053         val = val;
00054     } else {
00055         if (enc_a_state ^ old_enc_b_state) {
00056             val -= 1;
00057         } else {
00058             val += 1;
00059         } // (enc_a_state ^ old_enc_b_state)
00060     } // if ((enc_a_state != old_enc_a_state) && (enc_b_state != old_enc_b_state))
00061 } // end enc_a_int_routine
00062 
00063 void enc_b_int_routine (void) {
00064     old_enc_a_state = enc_a_state;
00065     old_enc_b_state = enc_b_state;
00066     enc_a_state = enc_a;
00067     enc_b_state = enc_b;
00068     if (((enc_a_state != old_enc_a_state) && (enc_b_state != old_enc_b_state)) || ((enc_a_state == old_enc_a_state) && (enc_b_state == old_enc_b_state))) {
00069         val = val;
00070     } else {
00071         if (enc_a_state ^ old_enc_b_state) {
00072             val -= 1;
00073         } else {
00074             val += 1;
00075         } // (enc_a_state ^ old_enc_b_state)
00076     } // if ((enc_a_state != old_enc_a_state) && (enc_b_state != old_enc_b_state))
00077 } // end enc_a_int_routine