Output the angle data of Encoder

Dependencies:   AD5754 FatFileSystem Impact_nagano_0630 MSCFileSystem QEI mbed

Committer:
chinacaonan
Date:
Tue Oct 11 03:38:51 2016 +0000
Revision:
2:8b24c7cfc9b2
Parent:
1:f37787740470
Angle Encoder. Out put the angle data.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hikaru24 0:27283d71db7d 1 #include "mbed.h"
hikaru24 0:27283d71db7d 2 #include "QEI.h" // for encoder
chinacaonan 2:8b24c7cfc9b2 3 #include "MSCFileSystem.h"
hikaru24 0:27283d71db7d 4 #include "AD5754.h" // for DA converter
hikaru24 0:27283d71db7d 5
chinacaonan 2:8b24c7cfc9b2 6
hikaru24 0:27283d71db7d 7 #define ENCODER_PERIOD_US 1000 // 1kHz
hikaru24 0:27283d71db7d 8 //#define ENCODER_PERIOD_US 100000 // 10Hz
chinacaonan 2:8b24c7cfc9b2 9
hikaru24 0:27283d71db7d 10
hikaru24 0:27283d71db7d 11 //// State in main phase ////
hikaru24 0:27283d71db7d 12 #define INITIALISATION_STATE 0
hikaru24 0:27283d71db7d 13 #define RECORD_PERIOD 1.0
hikaru24 0:27283d71db7d 14 #define AVE_WINDOW 10
hikaru24 0:27283d71db7d 15 #define VEL_WINDOW 10
hikaru24 0:27283d71db7d 16
chinacaonan 2:8b24c7cfc9b2 17
hikaru24 0:27283d71db7d 18 Serial pc(USBTX, USBRX);
hikaru24 0:27283d71db7d 19 QEI encoder(p21, p22, NC, 2000); // encoder
hikaru24 0:27283d71db7d 20 AD5754 dac(p5, NC, p7, p8); // spi_(mosi, miso, sck), nCS_(cs)
hikaru24 0:27283d71db7d 21
hikaru24 0:27283d71db7d 22
hikaru24 0:27283d71db7d 23 Ticker encoder_t;
hikaru24 0:27283d71db7d 24 Timer t;
hikaru24 0:27283d71db7d 25
hikaru24 0:27283d71db7d 26 volatile bool encoder_flag = false;
chinacaonan 2:8b24c7cfc9b2 27 void encoder_interrupt()
chinacaonan 2:8b24c7cfc9b2 28 {
hikaru24 0:27283d71db7d 29 encoder_flag = true;
hikaru24 0:27283d71db7d 30 }
hikaru24 0:27283d71db7d 31
hikaru24 0:27283d71db7d 32
chinacaonan 2:8b24c7cfc9b2 33 int main()
chinacaonan 2:8b24c7cfc9b2 34 {
chinacaonan 2:8b24c7cfc9b2 35 pc.baud(115200);
hikaru24 0:27283d71db7d 36 encoder_t.attach_us(&encoder_interrupt, ENCODER_PERIOD_US);
chinacaonan 2:8b24c7cfc9b2 37
hikaru24 0:27283d71db7d 38 bool start_flag = true;
hikaru24 0:27283d71db7d 39 bool main_flag = false;
chinacaonan 2:8b24c7cfc9b2 40
hikaru24 0:27283d71db7d 41 //// Encoder ////
hikaru24 0:27283d71db7d 42 int encoder_cnt = 0;
hikaru24 0:27283d71db7d 43 int encoder_buf[AVE_WINDOW] = {};
hikaru24 0:27283d71db7d 44 int encoder_ave = 0;
chinacaonan 2:8b24c7cfc9b2 45
hikaru24 0:27283d71db7d 46 //// Option ////
hikaru24 0:27283d71db7d 47 int print_cnt = 0;
chinacaonan 2:8b24c7cfc9b2 48
hikaru24 0:27283d71db7d 49 pc.printf("'S' key: Start state\n\n");
hikaru24 0:27283d71db7d 50 wait(1);
hikaru24 0:27283d71db7d 51
hikaru24 0:27283d71db7d 52 dac.rangeSelect();
hikaru24 0:27283d71db7d 53 dac.setPowerControl();
hikaru24 0:27283d71db7d 54
chinacaonan 2:8b24c7cfc9b2 55 while(start_flag)
chinacaonan 2:8b24c7cfc9b2 56 {
chinacaonan 2:8b24c7cfc9b2 57 if(pc.readable())
chinacaonan 2:8b24c7cfc9b2 58 {
chinacaonan 2:8b24c7cfc9b2 59 if(pc.getc() == 's')
chinacaonan 2:8b24c7cfc9b2 60 {
hikaru24 0:27283d71db7d 61 start_flag = false;
chinacaonan 2:8b24c7cfc9b2 62 pc.printf("\nHAPTIC test start\n");
hikaru24 0:27283d71db7d 63 wait(0.5);
hikaru24 0:27283d71db7d 64 pc.printf("Start initialization\nLift device\n\n");
hikaru24 0:27283d71db7d 65 wait(0.5);
hikaru24 0:27283d71db7d 66 main_flag = true;
hikaru24 0:27283d71db7d 67 }
hikaru24 0:27283d71db7d 68 }
hikaru24 0:27283d71db7d 69 }
hikaru24 0:27283d71db7d 70
hikaru24 0:27283d71db7d 71 t.start();
hikaru24 0:27283d71db7d 72
chinacaonan 2:8b24c7cfc9b2 73 while(main_flag)
chinacaonan 2:8b24c7cfc9b2 74 {
chinacaonan 2:8b24c7cfc9b2 75 if(encoder_flag)
chinacaonan 2:8b24c7cfc9b2 76 {
chinacaonan 2:8b24c7cfc9b2 77 encoder_flag = false;
chinacaonan 2:8b24c7cfc9b2 78 encoder_cnt = encoder.getPulses(); // One of the encoders needs a sign change
hikaru24 0:27283d71db7d 79
chinacaonan 2:8b24c7cfc9b2 80 encoder_ave = encoder_cnt;
chinacaonan 2:8b24c7cfc9b2 81 for(int i=0; i<AVE_WINDOW-1; i++)
chinacaonan 2:8b24c7cfc9b2 82 {
chinacaonan 2:8b24c7cfc9b2 83 encoder_buf[i+1] = encoder_buf[i];
chinacaonan 2:8b24c7cfc9b2 84 encoder_ave += encoder_buf[i];
hikaru24 0:27283d71db7d 85 }
chinacaonan 2:8b24c7cfc9b2 86 encoder_buf[0] = encoder_cnt;
chinacaonan 2:8b24c7cfc9b2 87 encoder_ave = encoder_ave/AVE_WINDOW;
chinacaonan 2:8b24c7cfc9b2 88
chinacaonan 2:8b24c7cfc9b2 89 if(print_cnt > 1000000/ENCODER_PERIOD_US)
chinacaonan 2:8b24c7cfc9b2 90 {
chinacaonan 2:8b24c7cfc9b2 91 printf("encoder = %d\n", encoder_ave);
chinacaonan 2:8b24c7cfc9b2 92 printf("time = %f\n", t.read());
chinacaonan 2:8b24c7cfc9b2 93 print_cnt = 0;
chinacaonan 2:8b24c7cfc9b2 94 }
chinacaonan 2:8b24c7cfc9b2 95 print_cnt++;
chinacaonan 2:8b24c7cfc9b2 96 }
hikaru24 0:27283d71db7d 97 }
chinacaonan 2:8b24c7cfc9b2 98
hikaru24 0:27283d71db7d 99 }
hikaru24 0:27283d71db7d 100
hikaru24 0:27283d71db7d 101