这个编码器的型号为BMQ380605SP。图片
我旋转编码器的轴,直到显示4095或0001,证实这个编码器为12位的,测量范围在0000—4095,不旋转时,数据是连续的,表明编码器的稳定性很好。
这是我编写的角度采集程序
#include <STC15F2K60S2.H>
//#include "STC15W4K.H" // 包含STC115F2K60S2单片机寄存器定义文件
#include <stdio.h> // 为使用KEIL自带的库函数printf而加入
void delay500ms(void);
void Delay1us(); //@22.1184MHz
void UART_init(void);
sbit CSn=P4^0; //使能控制
sbit CLK=P4^1; //时钟脉冲
sbit DO=P4^2; //串口数据
void Delay1us()
{
unsigned char i;
i = 3;
while (--i);
}
void delay500ms(void)
{
unsigned char i,j,k;
for(i=93;i>0;i--)
for(j=235;j>0;j--)
for(k=125;k>0;k--);
}
void UART_init(void)
{
//下面代码设置定时器1
TMOD = 0x20;// 0010 0000 定时器1工作于方式2(8位自动重装方式)
TH1 = 0xFA;// 波特率:9600 /22.1184MHZ
TL1 = 0xFA;// 波特率:9600 /22.1184MHZ
TR1 = 1;
//下面代码设置定串口
AUXR = 0x00; // 很关键,使用定时器1作为波特率发生器,S1ST2=0
SCON = 0x50; // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允许接受)
TI=1; // 串口发送完标志,很关键,使用printf函数时必须有此命令
}
unsigned int ReadAngle12Code() //只读取12位角度位数,后面的5位状态数据位忽略
{
unsigned int angle;//12位数据
char i;
angle=0;
//启动CSn线
CLK=1;
CSn=1;
Delay1us(); //延时时间应等于或大于1us,加大延时时间有利于抗干扰
CSn=0;
Delay1us();
CLK=0;
Delay1us();
//开始读数据
for(i=11;i>=0;i--) //连续读取12次位数据
{
CLK=1;
Delay1us();
angle|=DO; //读取位数据,并保留上一次的位数据
if(i)
{
angle<<=1; //将刚读取的位左移1位并存入angle,SSI串行数据是从高位开始
CLK=0;
Delay1us();
}
}
Delay1us();
CSn=1;
Delay1us();
return(angle);
}
void main(void)
{
unsigned int jdz ; //角度值变量
UART_init(); // 串口初始化9600/22.1184MHz
while(1)
{
jdz=ReadAngle12Code(); // 获取12位角度值
printf("%.4D ",jdz); //打印(显示)4位数的十进制数(0-4095)对应(0—360)
delay500ms(); //间隔500ms的读取一次角度值,无限反复
}
}
楼主最近还看过