调试旋转编码器成功

  为了挑战杯国赛能取得一个好成绩,我们准备重新做一个机器人。机械臂的动力源选的电动推杆。初步方案是用旋转编码器做限位开关,简单的来说就是当主控端角度发送至从控端单片机后,势能电动推杆,此时旋转编码器角度变化,通过比较旋转编码器旋转角度与发送角度相等时关闭电动推杆已达到同步角度的目的。来张草图吧:

新技能get√ <wbr>旋转编码器调试成功

 调试旋转编码器成功_第1张图片

今晚上一直在调旋转编码器,已调试成功。我买的是有AB线的400码旋转编码器。相位差90度的脉冲。简单的来说,正转一下A线有1个低电平输出,反转即B线有一个低电平输出,转一圈会有400个低电平输出。我用的STC15系列单片机,利用外部中断得到点评变化信号,进入中断函数后计数,再将记录的数值乘以360/400即可得到旋转角度。

 调试旋转编码器成功_第2张图片


输出结果:


调试旋转编码器成功_第3张图片






//Keil:uVision4
//MCU:STC15F2K60S2
//FOSC:11.0592MHz

 

#include"reg52.h" //头文件

#define FOSC11059200L       //系统频率
#define BAUD9600               //串口波特率

 

typedef unsigned char BYTE;
typedef unsigned int WORD;

 

sfr AUXR  =0x8e;                    //辅助寄存器
sfr P_SW1 =0xA2;                  //外设功能切换寄存器1


sbitrotation=P3^2;               //旋转编码器A线
sbit anotherbit =P3^3;         //旋转编码器B线

 

bitFLAG;                                 //1:上升沿中断 0:下降沿中断
bitbusy;                                  //串口繁忙标志位 
intCW_count                         //旋转计数
      ,angle                                //旋转角度
     ,a                                        //临时变量
     ,b;                                       //临时变量

 


void SendData(BYTE dat)
{
    while(busy);              //等待前面的数据发送完成
    ACC =dat;                 //获取校验位P (PSW.0)
    busy =1;
    SBUF =ACC;              //写数据到UART数据寄存器
   return;
}

 


void SendString(char *s)
{
    while(*s)                    //检测字符串结束标志
    {
       SendData(*s++);    //发送当前字符
    }
   return;
}

 


void init(void)
{
    SCON =0x50;                                        //8位可变波特率
    AUXR =0x40;                                       //定时器1为1T模式
    TMOD =0x00;                                      //定时器1为模式0(16位自动重载)
    TL1 = (65536-(FOSC/4/BAUD));         //设置波特率重装值
    TH1 = (65536- (FOSC/4/BAUD))>>8;
    TR1 =1;                                                //使能定时器1
    INT0 =1;                     
    IT0 =0;                                  

你可能感兴趣的:(调试旋转编码器成功)