您的位置:首页 > 其它

调试旋转编码器成功

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





 


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

 




输出结果:




//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;                                  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: