Arduino version 2

Dependencies:   mbed arduino

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?

UserRevisionLine numberNew 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 }