Output the angle data of Encoder
Dependencies: AD5754 FatFileSystem Impact_nagano_0630 MSCFileSystem QEI mbed
main.cpp@2:8b24c7cfc9b2, 2016-10-11 (annotated)
- 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?
User | Revision | Line number | New 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 |