encoder modify from arduino

Dependencies:   mbed Nucleo_Hello_Encoder

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers encoder1.cpp Source File

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 }