完整word版ADXL345角度传感器测二维角度Keil C程序.docx
- 文档编号:26693508
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:20
- 大小:19.44KB
完整word版ADXL345角度传感器测二维角度Keil C程序.docx
《完整word版ADXL345角度传感器测二维角度Keil C程序.docx》由会员分享,可在线阅读,更多相关《完整word版ADXL345角度传感器测二维角度Keil C程序.docx(20页珍藏版)》请在冰豆网上搜索。
完整word版ADXL345角度传感器测二维角度KeilC程序
程序说明:
该程序中有两个C文件,均为同一Keil或TKstudio工程下的C源文件,分别为ADXL345_main和ADXL345_LCD,此程序在KeiluVision2或TKstudioversion4.5编译环境下均可正常运行,"ADXL345"-0Error(s),0Warning(s).
项目说明:
采用全集成的三轴加速度传感器ADXL345进行二维倾角的测量,用1602液晶(LCD省去了测忙函数)显示角度值,其值精确到小数点后两位。
ADXL345_main.c文件:
/**********************头文件*************************/
#include
#include
#include
/***********************宏定义***********************/
#defineucharunsignedchar
#defineuintunsignedint
/**********************位定义************************/
sbitCS=P2^1;//片选信号端
sbitSCLK=P3^1;//时钟
sbitSDI=P3^0;//数据读/写
/***********************函数声明**********************/
//voidwrite_comd(uchar);
//voidwrite_data_LCD(uchar);
voidLCD_init();//LCD初始化
voiddisplay_LCD();//LCD显示
voidcalculate();//ASCII码计算
/***********************全局变量**********************/
uintData_X_2[2];//读出的数据储存XYZ
uintData_Y_2[2];
uintData_Z_2[2];
intData_X,Data_Y,Data_Z;//数值转换后的值
floatXX,YY,ZZ;//3轴的重力加速度分量
ucharID;//机器ID值用于看读的是否对(调试时用)
floatroll,pitch;
/********************************************************************
**
*函数名:
Delayms()*
*功能描述:
产生延迟*
*形参:
ms延迟的时间,单位ms*
*返回值:
无*
*局部变量:
i*
*全局变量:
无*
*函数调用:
无*
**
********************************************************************/
voiddelay_ms(ucharms)
{
uchari;
while(ms--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();//空执行消耗CPU时间达到等待的效果
_nop_();
_nop_();
}
}
}
/********************************************************************
**
*函数名:
Write_Data(ucharData_write)*
*功能描述:
写指令到寄存器*
*形参:
Data_write要写的数据8位*
*返回值:
无*
*局部变量:
i*
*全局变量:
无*
*函数调用:
_nop_();*
**
********************************************************************/
/*************************写数据函数*******************/
voidWrite_Data(ucharAdress_Reg,ucharData_write)
{
uchari=0;
Adress_Reg=(Adress_Reg&0x7f);//置最高位位0写状态
Adress_Reg=(Adress_Reg&0xbf);//置第二高位0单字节读写
CS=0;
_nop_();
SCLK=1;
_nop_();
for(i=0;i<8;i++)//8位串行输出寄存器地址值
{
SCLK=0;
_nop_();
SDI=(bit)(Adress_Reg&0x80);
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
Adress_Reg<<=1;
}
for(i=0;i<8;i++)//8位串行输出指令值
{
SCLK=0;
_nop_();
SDI=(bit)(Data_write&0x80);
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
Data_write<<=1;
}
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
SDI=1;
CS=1;
}
/********************************************************************
**
*函数名:
Read_Data_Reg(ucharAdress_Reg)*
*功能描述:
往寄存器读数据*
*形参:
Adress_Reg寄存器地址*
*返回值:
Data_Read读取的数据*
*局部变量:
iData_Read读取的数据*
*全局变量:
无*
*函数调用:
_nop_();*
**
********************************************************************/
ucharRead_Data_Reg(ucharAdress_Reg)
{
uchari=0;
ucharData_Read;
Adress_Reg=(Adress_Reg|0x80);//置最高位为1,读状态
Adress_Reg=(Adress_Reg&0xbf);//置第二高位位0,单字节读写
CS=0;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
for(i=0;i<8;i++)//8位串行输出寄存器地址值
{
SCLK=0;
_nop_();
SDI=(bit)(Adress_Reg&0x80);
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
Adress_Reg<<=1;
}
for(i=0;i<8;i++)//8位串行读入数据(8位)
{
SCLK=0;
Data_Read<<=1;
_nop_();
Data_Read|=(uchar)SDI;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
}
for(i=0;i<8;i++)//产生8个脉冲(手册要求,目的不知道)
{
SCLK=0;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
}
_nop_();
_nop_();
SCLK=1;
_nop_();
CS=1;
returnData_Read;
}
/********************************************************************
**
*函数名:
Read_Data()*
*功能描述:
读出6字节XYZ轴各两字节的数据*
*形参:
无*
*返回值:
无*
*局部变量:
无*
*全局变量:
Data_X_2[2]Data_Y_2[2]Data_Z_2[2]存放读出值*
*函数调用:
Read_Data_Reg(__);delay_ms(__);*
**
********************************************************************/
voidRead_Data()
{
/*DATAX0是X轴加速度的低字节寄存器,DATAX1是高字节寄存器*/
Data_X_2[0]=Read_Data_Reg(0x32);//读出X轴低位
Data_X_2[1]=Read_Data_Reg(0x33);//读出X轴高位
delay_ms(10);
Data_Y_2[0]=Read_Data_Reg(0x34);//读出Y轴低位
Data_Y_2[1]=Read_Data_Reg(0x35);//读出Y轴高位
delay_ms(10);
Data_Z_2[0]=Read_Data_Reg(0x36);//读出Z轴低位
Data_Z_2[1]=Read_Data_Reg(0x37);//读出Z轴高位
}
/********************************************************************
**
*函数名:
ADXL345_init()*
*功能描述:
ADXL345初始化对寄存器写指令*
*形参:
无*
*返回值:
无*
*局部变量:
无*
*全局变量:
无*
*函数调用:
Write_Data_Reg(__,__);*
**
********************************************************************/
voidADXL345_init()
{
Write_Data(0x31,0x4f);//测量范围为正负16g13位模式3线SPI中断低有效禁用自测力左对齐(MSB)模式
delay_ms(10);
Write_Data(0x2C,0x08);//速率设定为25HZ,带宽12.5HZ
delay_ms(10);
Write_Data(0x2D,0x08);//选择电源模式
delay_ms(10);
Write_Data(0x2E,0x80);//使能DATA_READY中断
delay_ms(10);
Write_Data(0x2f,0x00);//中断功能设定,不使用中断
delay_ms(10);
/*Write_Data(0x1E,0x00);//X偏移量根据测试传感器的
delay_ms(10);
Write_Data(0x1F,0x00);//Y偏移量根据测试传感器的
delay_ms(10);
Write_Data(0x20,0x00);//Z偏移量根据测试传感器的
delay_ms(10);
Write_Data(0x21,0x00);//敲击延时0:
禁用;(1.25ms/LSB)
delay_ms(10);
Write_Data(0x22,0x00);//检测第一次敲击后的延时0:
禁用;(1.25ms/LSB)
delay_ms(10);
Write_Data(0x23,0x00);//敲击窗口0:
禁用;(1.25ms/LSB)
delay_ms(10);
Write_Data(0x24,0x00);//保存检测活动阀值;(62.5mg/LSB)
delay_ms(10);
Write_Data(0x25,0x00);//保存检测静止阀值;(62.5mg/LSB)
delay_ms(10);
Write_Data(0x26,0x2b);//检测活动时间阀值;(1s/LSB)
delay_ms(10);
Write_Data(0x27,0x00);//活动静止检测禁止
delay_ms(10);
Write_Data(0x28,0x09);//保存检测活动阀值;(62.5mg/LSB)
delay_ms(10);
Write_Data(0x29,0xff);//保存检测静止阀值;(62.5mg/LSB)
delay_ms(10);
Write_Data(0x2a,0x80);
delay_ms(10);*/
}
/********************************************************************
**
*函数名:
transform(void)*
*功能描述:
数值整合和转换,并转换为加速度放大1000倍*
*形参:
无*
*返回值:
无*
*局部变量:
无*
*全局变量:
Data_X=0,Data_Y=0,Data_Z整合后的XYZ轴值*
*函数调用:
无*
**
********************************************************************/
/*从数据寄存器中获取加速度数据后,用户必须对数据进行重建*/
/***************************数值转换***********************/
voidtransform(void)
{
(int)Data_X=(Data_X_2[0])+(Data_X_2[1]<<8);
(int)Data_Y=(Data_Y_2[0])+(Data_Y_2[1]<<8);
(int)Data_Z=(Data_Z_2[0])+(Data_Z_2[1]<<8);
if(Data_X&0x2000)
{//若位负数转换为补码
Data_X=(~Data_X)+1;
Data_X=Data_X*3.90625;//乘比例因素
Data_X=-Data_X;
}
else
{
Data_X=Data_X*3.90625;
}
if(Data_Y&0x2000)
{//若位负数转换为补码
Data_Y=(~Data_Y)+1;
Data_Y=Data_Y*3.90625;//乘比例因素
Data_Y=-Data_Y;
}
else
{
Data_Y=Data_Y*3.90625;
}
if(Data_Z&0x2000)
{//若位负数转换为补码
Data_Z=(~Data_Z)+1;
Data_Z=Data_Z*3.90625;//乘比例因素
Data_Z=-Data_Z;
}
else
{
Data_Z=Data_Z*3.90625;
}
/*if(Data_X<0)
{
Data_X=-Data_X;
Data_X=(float)Data_X*3.9;//Data_X单位为1000倍的g,即mg
}
else
{
Data_X=(float)Data_X*3.9;
}
if(Data_Y<0)
{
Data_Y=-Data_Y;
Data_Y=(float)Data_Y*3.9;
}
else
{
Data_Y=(float)Data_Y*3.9;
}
if(Data_Z<0)
{
Data_Z=-Data_Z;
Data_Z=(float)Data_Z*3.9;
}
else
{
Data_Z=(float)Data_Z*3.9;
}*/
/*扩大1000倍后结果*/
/*检测轴始终检测到的是正加速度*/
XX=Data_X;//X轴重力加速度分量
YY=Data_Y;//Y轴重力加速度分量
ZZ=Data_Z;//Z轴重力加速度分量
}
/********************************************************************
**
*函数名:
calculate_angle(floatV_x,floatV_y,floatV_z)*
*功能描述:
计算横滚角和俯仰角*
*形参:
G_xG_xG_zXYZ轴的加速度值*
*返回值:
无*
*局部变量:
无*
*全局变量:
rollpitch横滚角和俯仰角*
*函数调用:
atan2(_,_);*
**
********************************************************************/
/*********计算角度函数***************/
voidcalculate_angle(floatG_x,floatG_y,floatG_z)
{
roll=-(float)(((atan2(G_z,G_x)*180)/3.1415926535)-90);//弧度转成角度
pitch=-(float)(((atan2(G_z,G_y)*180)/3.1415926535)-90);
roll=roll*100;
pitch=pitch*100;
}
/*************************主函数***************************/
voidmain(void)
{
delay_ms(5);//上电延时
ADXL345_init();//ADXL345的初始化
LCD_init();//LCD的初始化
ID=Read_Data_Reg(0x00);//读出机器ID值,DEVID寄存器保存0xE5的固定器件ID代码
while
(1)
{
Read_Data();//读出XYZ轴加速度值
transform();//数据重建过程
calculate_angle(XX,YY,ZZ);//计算x和y轴相对于水平面的倾角
calculate();//ASCII码计算
display_LCD();//显示
}
}
ADXL345_LCD.c文件:
#include
#include
/***********************宏定义***********************/
#defineucharunsignedchar
#defineuintunsignedint
/**********************位定义及变量声明************************/
sbitLCDEN=P3^4;
sbitRS=P3^5;
sbitDULA=P2^6;
sbitWEILA=P2^7;
externucharID;
externfloatroll,pitch;
uchardis1[16]={"X+00.00Y+00.00"};
uchardis2[16]={"ID:
000"};
/*******************计算函数********************/
voidcalculate()
{
//ucharflag_X,flag_Y;
if(roll<0)
{
roll=-roll;
dis1[1]='-';//flag_X=45;
}
else
{
dis1[1]='+';
}
if(pitch<0)
{
pitch=-pitch;
dis1[10]='-';//flag_Y=45;
}
else
{
dis1[10]='+';
}
dis1[0]='X';
//dis1[1]=flag_X;
dis1[2]=(int)roll%10000/1000+48;
dis1[3]=(int)roll%10000%1000/100+48;
dis1[4]='
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整word版ADXL345角度传感器测二维角度Keil C程序 完整 word ADXL345 角度 传感器 二维 Keil 程序