encoder

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers encoderarduino.cpp Source File

encoderarduino.cpp

00001 #include "mbed.h"
00002 
00003 #define PinA1 A0 //外部中断0
00004 #define PinZ1 A2 //外部中断1
00005 #define PinB1 A1 //编码器的OUT_B信号连接到数字端口8
00006 #define T 30    //定义采集时间周期单位ms
00007 #define LOW 0
00008 #define HIGH 1
00009 
00010 
00011 unsigned long time1 = 0; // 时间标记
00012 volatile long PulSum_CW = 0;   //定义长整型不可修改脉冲数
00013 volatile long PulSum_CCW = 0;   
00014 
00015 
00016 long PulSum_CW_t0 = 0;         //定义记录顺时针方向 t0 时刻脉冲数变量
00017 long PulSum_CW_t0_T = 0;       //定义记录顺时针方向 t0+T 时刻脉冲数变量
00018 
00019 
00020 float Rad_CW_Speed = 0.000;    //定义顺时针角速度
00021 float Rad_CCW_Speed = 0.000;    //定义逆时针角速度
00022 
00023 
00024 long PulSum_CCW_t0 = 0;        //定义记录逆时针方向 t0 时刻脉冲数变量
00025 long PulSum_CCW_t0_T = 0;      //定义记录逆时针方向 t0+T 时刻脉冲数变量
00026 
00027 // 记录角度
00028 int Rad = 180;
00029 
00030 
00031 DigitalIn a11(PinA1);
00032 DigitalIn a12(PinB1);
00033 DigitalIn a13(PinZ1);
00034 
00035 void loop()
00036 { 
00037   // 角度计算程序
00038   Rad = int((PulSum_CW - PulSum_CCW)/6) % 360; 
00039   if (Rad >= 180) {
00040     Rad = Rad - 360;
00041   }
00042   
00043   PulSum_CW_t0   = PulSum_CW;  
00044   PulSum_CCW_t0   = PulSum_CCW;    //采集t0时刻的脉冲数
00045   wait(T);                                                     //等待一个T时间
00046   PulSum_CW_t0_T = PulSum_CW;  
00047   PulSum_CCW_t0_T = PulSum_CCW;    //采集t0+T时刻的脉冲数
00048   wait(T);                                                     //等待一个T时间
00049   
00050   // 如果检测到正向角速度,那么就打印角速度,以及累计的角度
00051   if (PulSum_CW_t0_T - PulSum_CW_t0 != 0){
00052     Rad_CW_Speed = (PulSum_CW_t0_T - PulSum_CW_t0);   //
00053     // 显示正向(CW)角速度 Rad_CW_Speed--->              //打印出来速度
00054     //Serial.print("AS:");                            //打印出来速度w
00055     printf("%f", Rad_CW_Speed);
00056     printf(":");            
00057     //Serial.print("/A:");
00058     printf("%d",Rad);
00059     printf("\n");
00060     }  
00061   
00062   // 如果检测到反向角速度,那么就打印角速度,以及累计的角度
00063   if (PulSum_CCW_t0_T - PulSum_CCW_t0 != 0){
00064     Rad_CCW_Speed = (PulSum_CCW_t0 - PulSum_CCW_t0_T);
00065     //Serial.print("AS:");
00066     printf("%f", Rad_CCW_Speed);
00067     printf(":");            
00068     //Serial.print("/A:");
00069     printf("%d",Rad);
00070     printf("\n");
00071     }
00072 
00073 
00074 
00075 }
00076 //void Encode()
00077 //当编码器码盘的OUTA脉冲信号下跳沿每中断一次,
00078 //  if ((millis() - time1) > 5)
00079 //  {
00080 //    if ((a11 == LOW) && (a12 == HIGH))
00081 //    {PulSum_CW ++;}
00082 //    else
00083 //    {PulSum_CCW ++;}
00084 //  }
00085 //    time1 = millis();
00086 //}