Sik Chiu Chow
/
arduino2
Arduino version 2
arduino2.cpp@0:c9022327ece6, 2021-11-01 (annotated)
- Committer:
- ea78anana
- Date:
- Mon Nov 01 15:41:50 2021 +0000
- Revision:
- 0:c9022327ece6
- Child:
- 1:4df9f94facd5
encoder from arduino version 2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ea78anana | 0:c9022327ece6 | 1 | #include "mbed.h" |
ea78anana | 0:c9022327ece6 | 2 | #include "arduino.h" |
ea78anana | 0:c9022327ece6 | 3 | |
ea78anana | 0:c9022327ece6 | 4 | #define PinA A0 //A phase |
ea78anana | 0:c9022327ece6 | 5 | #define PinZ A2 //Z phase |
ea78anana | 0:c9022327ece6 | 6 | #define PinB A1 //B phase |
ea78anana | 0:c9022327ece6 | 7 | |
ea78anana | 0:c9022327ece6 | 8 | #define HIGH 1 |
ea78anana | 0:c9022327ece6 | 9 | #define LOW 0 |
ea78anana | 0:c9022327ece6 | 10 | |
ea78anana | 0:c9022327ece6 | 11 | //Initialize Variable |
ea78anana | 0:c9022327ece6 | 12 | unsigned long time1 = 0; // Time |
ea78anana | 0:c9022327ece6 | 13 | float time_cw; |
ea78anana | 0:c9022327ece6 | 14 | float time_ccw; |
ea78anana | 0:c9022327ece6 | 15 | int counter = 0; |
ea78anana | 0:c9022327ece6 | 16 | const float d = 6/100; //Radius of the wheel |
ea78anana | 0:c9022327ece6 | 17 | const float pi = 3.141592654;//PI |
ea78anana | 0:c9022327ece6 | 18 | int num = 0;//number of turns |
ea78anana | 0:c9022327ece6 | 19 | double t;//time per turn |
ea78anana | 0:c9022327ece6 | 20 | float velocity; |
ea78anana | 0:c9022327ece6 | 21 | double time3;//外部中断1产生时的时间,即捕捉到Z相的置零信号时,用于在loop循环内进行一圈时间长短的计算 |
ea78anana | 0:c9022327ece6 | 22 | |
ea78anana | 0:c9022327ece6 | 23 | DigitalIn a11(PinA); |
ea78anana | 0:c9022327ece6 | 24 | DigitalIn a12(PinB); |
ea78anana | 0:c9022327ece6 | 25 | DigitalIn a13(PinZ); |
ea78anana | 0:c9022327ece6 | 26 | Serial pc(USBTX, USBRX); |
ea78anana | 0:c9022327ece6 | 27 | |
ea78anana | 0:c9022327ece6 | 28 | |
ea78anana | 0:c9022327ece6 | 29 | |
ea78anana | 0:c9022327ece6 | 30 | void loop() |
ea78anana | 0:c9022327ece6 | 31 | |
ea78anana | 0:c9022327ece6 | 32 | { |
ea78anana | 0:c9022327ece6 | 33 | double distance; |
ea78anana | 0:c9022327ece6 | 34 | //clockwise turning |
ea78anana | 0:c9022327ece6 | 35 | if (counter == 2500) |
ea78anana | 0:c9022327ece6 | 36 | { |
ea78anana | 0:c9022327ece6 | 37 | // Printf("ok");//Testing |
ea78anana | 0:c9022327ece6 | 38 | num = num++; |
ea78anana | 0:c9022327ece6 | 39 | time_cw = millis(); |
ea78anana | 0:c9022327ece6 | 40 | t = time_cw - time3; |
ea78anana | 0:c9022327ece6 | 41 | t = t / 1000; |
ea78anana | 0:c9022327ece6 | 42 | distance = num * d * pi; |
ea78anana | 0:c9022327ece6 | 43 | velocity = d * pi / t; |
ea78anana | 0:c9022327ece6 | 44 | pc.printf("The wheel has run ");pc.printf("%f", distance); pc.printf("m."); |
ea78anana | 0:c9022327ece6 | 45 | pc.printf("The cw_speed is ");pc.printf("%f", velocity); pc.printf("m/s."); |
ea78anana | 0:c9022327ece6 | 46 | pc.printf("The time is ");pc.printf("%f", t); pc.printf("s."); |
ea78anana | 0:c9022327ece6 | 47 | } |
ea78anana | 0:c9022327ece6 | 48 | //anti-clockwise turning |
ea78anana | 0:c9022327ece6 | 49 | else if (counter == -2500) |
ea78anana | 0:c9022327ece6 | 50 | { |
ea78anana | 0:c9022327ece6 | 51 | // Printf("ok");//Testing |
ea78anana | 0:c9022327ece6 | 52 | num = num++; |
ea78anana | 0:c9022327ece6 | 53 | time_ccw = millis(); |
ea78anana | 0:c9022327ece6 | 54 | t = time_ccw - time3; |
ea78anana | 0:c9022327ece6 | 55 | t = t / 1000; |
ea78anana | 0:c9022327ece6 | 56 | distance = num * d * pi; |
ea78anana | 0:c9022327ece6 | 57 | velocity = d * pi / t; |
ea78anana | 0:c9022327ece6 | 58 | pc.printf("The wheel has run ");pc.printf("%f", distance); pc.printf("m."); |
ea78anana | 0:c9022327ece6 | 59 | pc.printf("The cw_speed is ");pc.printf("%f", velocity); pc.printf("m/s."); |
ea78anana | 0:c9022327ece6 | 60 | pc.printf("The time is ");pc.printf("%f", t); pc.printf("s."); |
ea78anana | 0:c9022327ece6 | 61 | } |
ea78anana | 0:c9022327ece6 | 62 | } |
ea78anana | 0:c9022327ece6 | 63 | |
ea78anana | 0:c9022327ece6 | 64 | // 编码器计数中断子程序 |
ea78anana | 0:c9022327ece6 | 65 | |
ea78anana | 0:c9022327ece6 | 66 | void Encode() |
ea78anana | 0:c9022327ece6 | 67 | |
ea78anana | 0:c9022327ece6 | 68 | { |
ea78anana | 0:c9022327ece6 | 69 | |
ea78anana | 0:c9022327ece6 | 70 | //为了不计入噪音干扰脉冲, |
ea78anana | 0:c9022327ece6 | 71 | |
ea78anana | 0:c9022327ece6 | 72 | //当2次中断之间的时间大于5ms时,计一次有效计数 |
ea78anana | 0:c9022327ece6 | 73 | |
ea78anana | 0:c9022327ece6 | 74 | if ((millis() - time1) > 5) |
ea78anana | 0:c9022327ece6 | 75 | |
ea78anana | 0:c9022327ece6 | 76 | { |
ea78anana | 0:c9022327ece6 | 77 | |
ea78anana | 0:c9022327ece6 | 78 | //当编码器码盘的OUTA脉冲信号下跳沿每中断一次, |
ea78anana | 0:c9022327ece6 | 79 | |
ea78anana | 0:c9022327ece6 | 80 | if ((a11 == LOW) && (a12 == HIGH)) |
ea78anana | 0:c9022327ece6 | 81 | |
ea78anana | 0:c9022327ece6 | 82 | { |
ea78anana | 0:c9022327ece6 | 83 | |
ea78anana | 0:c9022327ece6 | 84 | counter--; |
ea78anana | 0:c9022327ece6 | 85 | |
ea78anana | 0:c9022327ece6 | 86 | } |
ea78anana | 0:c9022327ece6 | 87 | |
ea78anana | 0:c9022327ece6 | 88 | else |
ea78anana | 0:c9022327ece6 | 89 | |
ea78anana | 0:c9022327ece6 | 90 | { |
ea78anana | 0:c9022327ece6 | 91 | |
ea78anana | 0:c9022327ece6 | 92 | counter++; |
ea78anana | 0:c9022327ece6 | 93 | |
ea78anana | 0:c9022327ece6 | 94 | } |
ea78anana | 0:c9022327ece6 | 95 | |
ea78anana | 0:c9022327ece6 | 96 | } |
ea78anana | 0:c9022327ece6 | 97 | |
ea78anana | 0:c9022327ece6 | 98 | time1 = millis(); |
ea78anana | 0:c9022327ece6 | 99 | |
ea78anana | 0:c9022327ece6 | 100 | } |
ea78anana | 0:c9022327ece6 | 101 | void Set_state(){ |
ea78anana | 0:c9022327ece6 | 102 | counter = 0; |
ea78anana | 0:c9022327ece6 | 103 | time3 = millis();//发生中断时的时间 |
ea78anana | 0:c9022327ece6 | 104 | } |