调试旋转编码器成功
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;
今晚上一直在调旋转编码器,已调试成功。我买的是有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;
相关文章推荐
- 嵌入式C语言强化笔记--__I、 __O 、__IO
- 2015.04.06 手腕3D打印失败。
- mongo集群合并空的数据块
- 78XX系列稳压芯片
- 2015.02.15 Keil中*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
- Keil中 "STARTUP.A51" SET (SMALL) DEBUG EP问题解决方法
- 2014.11.27
- Win8系统执行自己Vc编写的程序时回车闪退解决方法。
- 64位Win7,Win8和Win8.1使用VC++6.0方法。
- ubuntu wifi 硬件关闭的临时处理方法
- Beyond video games: New artificial intelligence beats tactical experts in combat simulation
- 摄像机标定终极总结版02
- oracle undo 解析
- 转向ARC的说明——翻译Apple官方文档
- 实现背景透明文字不透明
- 剑指offer(46)-把字符串转换成整数
- 51nod1174区间最大数(RMQ)
- 配置spring的web.xml
- Electric Power Systems Research (EPSR) 的审稿周期
- JavaScript数据存储 Cookie篇