encoder modify from arduino
Dependencies: mbed Nucleo_Hello_Encoder
encoder1.cpp
00001 #include "mbed.h" 00002 00003 #define PinA1 D14 //外部中断0 00004 #define PinZ1 D12 //外部中断1 00005 #define PinB1 D15 //编码器的OUT_B信号连接到数字端口8 00006 00007 #define PinA2 D8 //外部中断0 00008 #define PinZ2 D6 //外部中断1 00009 #define PinB2 D7 //编码器的OUT_B信号连接到数字端口8 00010 00011 #define PinA3 D4 //外部中断0 00012 #define PinZ3 D3 //外部中断1 00013 #define PinB3 D2 //编码器的OUT_B信号连接到数字端口8 00014 #define T 30 //定义采集时间周期单位ms 00015 00016 Timer f; 00017 unsigned long time1 = 0; // 时间标记 00018 volatile long PulSum_CW = 0; //定义长整型不可修改脉冲数 00019 volatile long PulSum_CCW = 0; 00020 00021 00022 long PulSum_CW_t0 = 0; //定义记录顺时针方向 t0 时刻脉冲数变量 00023 long PulSum_CW_t0_T = 0; //定义记录顺时针方向 t0+T 时刻脉冲数变量 00024 00025 00026 float Rad_CW_Speed = 0.000; //定义顺时针角速度 00027 float Rad_CCW_Speed = 0.000; //定义逆时针角速度 00028 00029 DigitalIn ain11(PinA1);//因为编码器信号为欧姆龙E6B2-CWZ6C,为开漏输出,因此需要上拉电阻,此处采用arduino的内部上拉输入模式,置高 00030 DigitalIn ain12(PinB1);//同上 00031 DigitalIn ain13(PinZ1);//脉冲中断函数:捕捉A相信号,并判断A、B相先后顺序 00032 00033 DigitalIn ain21(PinA2);//因为编码器信号为欧姆龙E6B2-CWZ6C,为开漏输出,因此需要上拉电阻,此处采用arduino的内部上拉输入模式,置高 00034 DigitalIn ain22(PinB2);//同上 00035 DigitalIn ain23(PinZ2);//脉冲中断函数:捕捉A相信号,并判断A、B相先后顺序 00036 00037 DigitalIn ain31(PinA3);//因为编码器信号为欧姆龙E6B2-CWZ6C,为开漏输出,因此需要上拉电阻,此处采用arduino的内部上拉输入模式,置高 00038 DigitalIn ain32(PinB3);//同上 00039 DigitalIn ain33(PinZ3);//脉冲中断函数:捕捉A相信号,并判断A、B相先后顺序 00040 00041 00042 00043 long PulSum_CCW_t0 = 0; //定义记录逆时针方向 t0 时刻脉冲数变量 00044 long PulSum_CCW_t0_T = 0; //定义记录逆时针方向 t0+T 时刻脉冲数变量 00045 00046 // 记录角度 00047 int Rad = 180; 00048 00049 00050 00051 void loop() 00052 { 00053 // 角度计算程序 00054 Rad = int((PulSum_CW - PulSum_CCW)/6.944) % 360; 00055 if (Rad>=180) { 00056 Rad = Rad - 360; 00057 } 00058 00059 PulSum_CW_t0 = PulSum_CW; 00060 PulSum_CCW_t0 = PulSum_CCW; //采集t0时刻的脉冲数 00061 wait(T); //等待一个T时间 00062 PulSum_CW_t0_T = PulSum_CW; 00063 PulSum_CCW_t0_T = PulSum_CCW; //采集t0+T时刻的脉冲数 00064 wait(T); //等待一个T时间 00065 00066 // 如果检测到正向角速度,那么就打印角速度,以及累计的角度 00067 if (PulSum_CW_t0_T - PulSum_CW_t0 != 0){ 00068 Rad_CW_Speed = (PulSum_CW_t0_T - PulSum_CW_t0); // 00069 // 显示正向(CW)角速度 Rad_CW_Speed---> //打印出来速度 00070 //printf("AS:"); //打印出来速度w 00071 printf("%f", Rad_CW_Speed); 00072 printf(":"); 00073 //printf("/A:"); 00074 printf("%d",Rad); 00075 printf("\n"); 00076 } 00077 00078 // 如果检测到反向角速度,那么就打印角速度,以及累计的角度 00079 if (PulSum_CCW_t0_T - PulSum_CCW_t0 != 0){ 00080 Rad_CCW_Speed = (PulSum_CCW_t0 - PulSum_CCW_t0_T); 00081 //printf("AS:"); 00082 printf("%f", Rad_CCW_Speed); 00083 printf(":"); 00084 //printf("/A:"); 00085 printf("%d",Rad); 00086 printf("\n"); 00087 } 00088 00089 00090 00091 } 00092 void Encode() 00093 {//当编码器码盘的OUTA脉冲信号下跳沿每中断一次, 00094 f.start(); 00095 uint32_t m = f.read_ms(); 00096 if ((m - time1) > 5) 00097 { 00098 if (((ain11 == 0) && (ain12 == 1)) || ((ain21 == 0) && (ain22 == 1)) || ((ain31 == 0) && (ain32 == 1)) ) 00099 {PulSum_CW ++;} 00100 else 00101 {PulSum_CCW ++;} 00102 } 00103 time1 = m; 00104 f.stop(); 00105 }
Generated on Mon Aug 15 2022 22:17:57 by
1.7.2