角度传感器程序总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
角度传感器程序总结
——电信101 吴超琼
角度传感器AS5045这种绝对角度测量方式可即时指出磁铁的角度位置,其分辨率达到0.0879°=每圈360°共4096个位置,能够以串行比特流及PWM信号输出的形式给出数字化数据。
2种数字式12位绝对值输出:
-串行接口输出
-脉冲调制(PWM)输出
该程序采用了串行接口输出12位绝对值输出。
角度传感器程序流程图如下:
AS5045采集得的数据是角度位置数据,要得到物体真正转过的角度就要进行计算,一圈360°,共4096个位置(5045芯片就是这样分配的),每个位置就有0.00879°,用读取AS5045得到的数据a乘以0.00879就得到我们所要求的角度。为了精确我们小数点后要有相应的有效数字,若有n位有效数字,就需要再乘以10n。例如:
jiaodu=a*0.00879*10n。
程序如下:
/*********通过AD转换和数字信号处理(DSP)算法**********/
/*********AS5045可提供精确的高分辨率*******************/
/*********绝对角度位置信息*****************************/
/*********AS5045能够检测磁场的方向并计算出12位的二进制编码********
*********此编码通过同步串行接口(SSI)进行访问*****/
/**********屏蔽掉的程序是另一种算法差不多************************/
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
/******液晶引脚定义******/
sbit RST=P0^0;
sbit PSB=P0^1;
sbit E=P0^5;
sbit RW=P0^6;
sbit RS=P0^7;
//用了并行PSB=1,数据口用P2
/*****AS5045引脚定义**************/
sbit D0=P3^2; //同步串行接口的数据输出
sbit CLK=P3^3; //同步串行接口的时钟输入
sbit CSn=P3^4; //片选,低电平有效,施密特触发器输入,内部上拉电阻
uint dd; //算得的最终角度
//float cc;
uint out,bb;
//out为获取得的角度信息(绝对角度位置数据)D[11:0] 串行字包括18位数据,前12位是角度信息
uint dis0[7]; //用来存放角度数据
uchar code tab[]={"角度传感器实验"};
uchar code dis1[]={"当前角度: "};
uchar code dis2[]={"."};
void delay(uint z)
{
uint x,y;
for(y=110;y>0;y--)
for(x=z;x>0;x--);
}
/*******读取忙状态****/
bit lcd_busy()
{
bit result;
RS=0;
RW=1;
E=1;
delay(5);
result=(bit)(P2&0X80);
E=0;
return(result);
}
/******写指令*******/
void write_com(uchar com)
{
while(lcd_busy());
RS=0;
RW=0;
P2=com;
delay(5);
E=1;
delay(5);
E=0;
delay(5); }
/******写数据*******/
void write_data(uchar dat)
{
while(lcd_busy());
RS = 1;
RW = 0;
E = 0;
P2 = dat;
delay(5);
E = 1;
delay(5);
E = 0;
}
//****液晶初始化******//
void lcd_init()
{
PSB = 1; //并行口
RST = 0; //复位
delay(5);
RST = 1;
delay(5);
write_com(0x30); //基本指令操作delay(5);
write_com(0x0c);//开显示
delay(5);
write_com(0x01); //清屏
delay(5);
}
/*****显示坐标********/
void lcd_pos(uchar x,uchar y)
{
uchar pos;
if(x==1)
{x=0x80;}
else if(x==2)
{x=0x90;}
else if(x==3)
{x=0x88;}
else if(x==4)
{x=0x98;}
pos=x+y;
write_com(pos); //显示地址