倾角测量论文讲解.docx
《倾角测量论文讲解.docx》由会员分享,可在线阅读,更多相关《倾角测量论文讲解.docx(43页珍藏版)》请在冰豆网上搜索。
![倾角测量论文讲解.docx](https://file1.bdocx.com/fileroot1/2023-2/4/b8efca76-d8a7-4bb8-91c1-6a0dfb457436/b8efca76-d8a7-4bb8-91c1-6a0dfb4574361.gif)
倾角测量论文讲解
目录
第一章简介…………………………………………………………………(8-11)
1.1引言………………………………………………………………………(8)
1.2三轴倾角传感器ADXL345简介…………………………………………(8)
1.3三轴倾角的计算……………………………………………………(8-9)
第二章总体设计方案及原理框图………………………………………(13-15)
2.1原理框图………………………………………………………………(13)
2.2总体设计方案………………………………………………………(13-15)
第三章硬件设计…………………………………………………………(16-18)
3.1传感器硬件电路………………………………………………………(16)
3.2液晶显示器硬件电路………………………………………………(16-17)
3.3报警电路……………………………………………………………(17-18)
3.4总硬件原理图…………………………………………………………(18)
第四章软件设计…………………………………………………………(19-24)
4.1软件的功能需求………………………………………………………(19)
4.2各部分程序框图……………………………………………………(19-24)
第九章参考文献…………………………………………………………………(28)
附 录器件清单全部程序和实物图片……………………………………(30-41)
第一章简介
1.1引言
随着市场需求和科技的发展,人们对工程、机械、航空、航海设备的可靠性和稳定性提出了更高的要求,其中姿态测量是一项重要的指标。
倾角传感器是测量关于某一基准面的倾斜角或者是姿态的装置。
目前,市场上已有单轴、双轴、三轴的倾角传感器,但大多都价格昂贵或者体积较大。
本文提出以三轴传感器ADXL345和STC89C51单片机实现的设计,可大大降低系统成本,不但可以构成一个单独的数字输出传感器,也可以作为一个测量模块,嵌入到测量控制系统中,广泛应用于机器人控制、平台姿态(俯仰和滚转)测量、双轴加速度测量等系统中。
1.2三轴倾角传感器ADXL34简介
ADXL345是一款小巧纤薄的低功耗三轴加速度计,可以对高达±16g的加速度进行高分辨率(13位)测量。
数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或者I2C数字接口访问。
ADXL345非常适合移动设备应用。
它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。
它具有高分辨率(4mg/LSB),能够测量约0.25°的倾角变化。
使用ADXL345等数字输出加速度计时,无需进行模数转换,从而可以节省系统成本和电路板面积。
此外,ADXL345内置多种功能。
活动/非活动检测、单击/双击检测以及自由落体检测均在内部完成,无需主机处理器执行任何计算。
内置32级FIFO存储缓冲器可以减轻主机处理器的负担,起到简化算法和省电的作用。
利用内置的活动/非活动检测功能,将ADXL345用作“运动开关”(无活动时关闭整个系统,检测到活动时才开启),系统可以实现进一步省电。
ADXL345是一款小巧纤薄的低功耗三轴加速度计,可以对高达±16g的加速度进行高分辨率(13位)测量。
数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或者I2C数字接口访问。
ADXL345非常适合移动设备应用。
它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。
它具有高分辨率(4mg/LSB),能够测量约0.25°的倾角变化。
使用ADXL345等数字输出加速度计时,无需进行模数转换,从而可以节省系统成本和电路板面积。
此外,2ADXL345通过IC或SPI接口进行通信。
1.3三轴倾斜的计算
引入第三轴时可在全球范围内确定传感器的方向。
可通过传统的直角坐标系(x,y,z)球面(ρ,θ,φ)转换法来表征xy平面倾斜角θ及重力矢量倾斜角,ADXL345输出的X、Y、Z三个轴向德原始数据,要得出角度值必须要经过实际换算,其公式如下所示:
1.4STC89C51单片机简介
1.4.1STC89C51系列单片机的主要性能特点
STC89C51系列单片机是宏晶科技推出的新一代超强抗干扰、高速、低功耗的单片机,指令代码与传统8051单片机完全兼容。
MCS-51的主要特点为:
◆CPU为8位;
◆片内带振荡器,频率范围为1.2~12MHz;
◆片内带128字节的数据存储器;(RAM)
◆片内带4KB的Flash程序存储器;(ROM)
◆程序存储器的寻址空间为64KB;(需要扩展ROM)
◆片外数据存储器的寻址空间为64KB;(需要扩展RAM)
◆128位(16字节)用户位寻址空间;(在128个字节中)
◆18个字节特殊功能寄存器SFR(MCS—52子系列为21个);
◆4个8位的并行I/O接口:
P0、P1、P2、P3;
◆2个16位定时器/计数器T0、T1;(MCS-52子系列为3个,T2)
◆2个优先级别的5个中断源;(高、低2个)
◆1个全双工的串行I/O接口,可多机通信;
◆片内采用单总线结构;
◆有较强的位处理能力;
1.4.2MCS-51系列单片机的基本组成
图1-5管脚图
AT89C51与51系列中各种型号芯片的引脚互相兼容。
目前多采用40只引脚双列直插,如图2-2所示。
引脚按其功能可分为如下3类:
1电源及时钟引脚——VCC、VSS;XTAL1、XTAL2;
2控制引脚——
、
、
、和
;
3I/O口引脚——P0、P1、P2、P3,为4个8位I/O口。
第二章设计总体方案及原理框图
2.1原理框图
本课题设计原理框图如下图(图2-1):
图2-1原理框图
该车体倾斜姿态测量仪原理框图主要由传感器、单片机、液晶显示器、报警电路,串口通信电路等组成;通过传感器感应被测物体角度的变化,单片机通过读取传感器的数字量,然后由单片机输出信号控制显示、报警等。
2.2设计方案
2.2.1传感器选用
本方案中选用的传感器是ADXL345,引脚图见图2-2。
ADXL345是一款小而薄的超低功耗3轴加速度计,分辨率高(13位)测量范围达±16g。
数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或I2C数字接口访问。
ADXL345非常适合移动设备应用。
它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。
其高分辨率(3.9mg/LSB),能够测量不到1.0°的倾斜角度变化。
而且ADXL345是三,可以测量X,Y,Z三方向的加速度。
图2-2SCA100t-D02引脚图
2.2.2液晶显示器选用
本方案中选用的液晶显示器的型号是1602,引脚图见图3-3,LCD1602显示器有20个引脚,能够双行显示20为字符,本方案的思想是显示器的两行分别显示传感器的X和Y轴对应角度;当角度超过20°时,在对应角度后面显示‘DANGER!
!
!
’字符,警示倾斜角度过大。
图2-3LCD1602引脚图
2.2.3单片机选用
单片机选用的是STC89C51系列,具体资料参见1.4节STC89C51简介。
2.2.4报警电路
根据设计要求,当倾斜角度超过设定报警角度时,要报警;本方案中的报警思想是:
倾斜角超过上限报警家督时,通过I/O口发出控制信号,控制蜂鸣器发生模拟报警。
如图2-5,
图2-5报警电路
第三章硬件设计
3.1传感器硬件电路
传感器与单片机的连接如图3-1
图3-1传感器与单片机连接图
传感器选用倾斜角传感器ADXL345,按照图3-1连接,此时传感器输出量为数字量,数字输出到角度转化公式为:
α=arcsin[(Dout-Dout@0°)/Sensitivity]
其中Dout为X或Y通道的数字输出量,Dout@0°为0°时X或Y通道的数字输出量,Sensitivity芯片灵敏度为1638LSB/g。
3.2液晶显示器硬件电路
LCD1602显示器与单片机的连接如图3-2
图3-2显示器与单片机连接图
LCD1602液晶模块内部的字符发生器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号和日文假名等,每一个字符都有一定的代码,比如大写字母‘A’的代码是01000001(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就可以看到‘A’。
因此,传感器测得的倾斜角经过单片机软件处理程序处理后,通过P0口输出即可显示。
3.3报警电路
报警电路如图3-4
图3-4报警电路
(1)R1、R2的选择
当通过LED的电流为3~5mA时,LED就可以发光;忽略LED的内阻,分析计算得:
R1(R2)=5V/5mA=1000
=1K
(2)蜂鸣器外围电路设计
如图所示,当三极管8550基极电压为0时,三极管工作,蜂鸣器就可以发
声,R3、R4均为限流作用,同时也与电容一起起到保护电路的作用。
3.5总硬件原理图
综合前几节的分析可得设计的总体硬件原理图,如图3-5
图3-5总体硬件原理图
第4章软件设计
4.1软件的功能需求
因为所采用的传感器是直接输出数字量的,所以程序的编写就变的简单了。
不需要进行A/D转换了。
而且因为传感器输出的时间和单片机处理的速度很匹配所以我们也没有进行中断处理。
采用的是查询的方式。
软件的功能主要包括:
(1)能在LCD上面显示传感器传出的角度。
(2)判断值是否在报警范围内从而做出不同的判断。
(3)能进行串口通信。
4.2各部分程序框图
图4-1总体软件原理框图
图4-2LCD显示子程序
图4-3倾斜角采集框图
图4-4报警程序框图
第九章参考文献
程德福、林君、智能仪器、2009、机械工业出版社
张毅刚、单片机原理及应用、2010、高等教育出版社
附 录
附录一:
元器件清单
STC89C52单片机 1个
MAX232串行接口 1个
ADXL345倾斜角传感器 1个
LCD1602液晶显示器 1个
蜂鸣器 1个
LED发光二极管 2个
三极管8550 1个
1K电阻 3个
10K电阻 2个
470电阻 1个
10K滑动变阻器 1个
0.1uF电容 6个
30pF电容 2个
10uF电解电容 2个
12MHz晶振 1个
附录二:
完整程序
#include"1602.h"
#include"delay.h"
sbitRS=P3^6;//定义端口
sbitRW=P3^5;
sbitEN=P3^4;
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP1
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bitLCD_Check_Busy(void)
{
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return(bit)(DataPort&0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
voidLCD_Write_Com(unsignedcharcom)
{
while(LCD_Check_Busy());//忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort=com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
voidLCD_Write_Data(unsignedcharData)
{
while(LCD_Check_Busy());//忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort=Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
voidLCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)
{
if(y==0)
{
LCD_Write_Com(0x80+x);//表示第一行
}
else
{
LCD_Write_Com(0xC0+x);//表示第二行
}
while(*s)
{
LCD_Write_Data(*s);
s++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
{
if(y==0)
{
LCD_Write_Com(0x80+x);
}
else
{
LCD_Write_Com(0xC0+x);
}
LCD_Write_Data(Data);
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
voidLCD_Init(void)
{
LCD_Write_Com(0x38);/*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);/*显示关闭*/
LCD_Write_Com(0x01);/*显示清屏*/
LCD_Write_Com(0x06);/*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C);/*显示开及光标设置*/
}
voidLCD_cursor(unsignedcharX,unsignedcharY)
{
if(Y==0)
{
LCD_Write_Com(0x80+X);
}
else
{
LCD_Write_Com(0xC0+X);
}
LCD_Write_Com(0x0e);
}
#include"ADXL345.h"
#include"delay.h"
#defineucharunsignedchar
#defineuintunsignedint
//使用的端口,请按照以下接线
sbitSCL=P0^6;//IIC时钟引脚定义
sbitSDA=P0^5;//IIC数据引脚定义
typedefunsignedcharBYTE;
typedefunsignedshortWORD;
#defineSlaveAddress0xA6//定义器件在IIC总线中的从地址,根据ALTADDRESS地址引脚不同修改
externucharBUF[8];//接收数据缓存区
/**************************************
起始信号
**************************************/
voidADXL345_Start()
{
SDA=1;//拉高数据线
SCL=1;//拉高时钟线
Delay5us();//延时
SDA=0;//产生下降沿
Delay5us();//延时
SCL=0;//拉低时钟线
}
/**************************************
停止信号
**************************************/
voidADXL345_Stop()
{
SDA=0;//拉低数据线
SCL=1;//拉高时钟线
Delay5us();//延时
SDA=1;//产生上升沿
Delay5us();//延时
}
/**************************************
发送应答信号
入口参数:
ack(0:
ACK1:
NAK)
**************************************/
voidADXL345_SendACK(bitack)
{
SDA=ack;//写应答信号
SCL=1;//拉高时钟线
Delay5us();//延时
SCL=0;//拉低时钟线
Delay5us();//延时
}
/**************************************
接收应答信号
**************************************/
bitADXL345_RecvACK()
{
SCL=1;//拉高时钟线
Delay5us();//延时
CY=SDA;//读应答信号
SCL=0;//拉低时钟线
Delay5us();//延时
returnCY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
voidADXL345_SendByte(BYTEdat)
{
BYTEi;
for(i=0;i<8;i++)//8位计数器
{
dat<<=1;//移出数据的最高位
SDA=CY;//送数据口
SCL=1;//拉高时钟线
Delay5us();//延时
SCL=0;//拉低时钟线
Delay5us();//延时
}
ADXL345_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTEADXL345_RecvByte()
{
BYTEi;
BYTEdat=0;
SDA=1;//使能内部上拉,准备读取数据,
for(i=0;i<8;i++)//8位计数器
{
dat<<=1;
SCL=1;//拉高时钟线
Delay5us();//延时
dat|=SDA;//读数据
SCL=0;//拉低时钟线
Delay5us();//延时
}
returndat;
}
//******单字节写入*******************************************
voidSingle_Write_ADXL345(ucharREG_Address,ucharREG_data)
{
ADXL345_Start();//起始信号
ADXL345_SendByte(SlaveAddress);//发送设备地址+写信号
ADXL345_SendByte(REG_Address);//内部寄存器地址,请参考中文pdf22页
ADXL345_SendByte(REG_data);//内部寄存器数据,请参考中文pdf22页
ADXL345_Stop();//发送停止信号
}
//********单字节读取*****************************************
ucharSingle_Read_ADXL345(ucharREG_Address)
{ucharREG_data;
ADXL345_Start();//起始信号
ADXL345_SendByte(SlaveAddress);//发送设备地址+写信号
ADXL345_SendByte(REG_Address);//发送存储单元地址,从0开始
ADXL345_Start();//起始信号
ADXL345_SendByte(SlaveAddress+1);//发送设备地址+读信号
REG_data=ADXL345_RecvByte();//读出寄存器数据
ADXL345_SendACK
(1);
ADXL345_Stop();//停止信号
returnREG_data;
}
//*********************************************************
//
//连续读出ADXL345内部加速