倾角测量论文.doc_第1页
倾角测量论文.doc_第2页
倾角测量论文.doc_第3页
倾角测量论文.doc_第4页
倾角测量论文.doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录第一章 简介(8-11)11 引言 (8)12 三轴倾角传感器ADXL345简介(8)13 三轴倾角的计算 (8-9)第二章 总体设计方案及原理框图 (13-15) 21 原理框图 (13) 22 总体设计方案 (13-15)第三章 硬件设计 (16-18) 31 传感器硬件电路 (16)32 液晶显示器硬件电路 (16-17)33 报警电路 (17-18) 34 总硬件原理图 (18)第四章 软件设计 (19-24)41 软件的功能需求 (19)42 各部分程序框图 (19-24)第九章 参考文献(28)附录 器件清单全部程序和实物图片 (30-41)第一章 简 介1.1 引言随着市场需求和科技的发展,人们对工程、机械、航空、航海设备的可靠性和稳定性提出了更高的要求,其中姿态测量是一项重要的指标。倾角传感器是测量关于某一基准面的倾斜角或者是姿态的装置。目前,市场上已有单轴、双轴、三轴的倾角传感器,但大多都价格昂贵或者体积较大。本文提出以三轴传感器ADXL345和STC89C51单片机实现的设计,可大大降低系统成本,不但可以构成一个单独的数字输出传感器,也可以作为一个测量模块,嵌入到测量控制系统中,广泛应用于机器人控制、平台姿态(俯仰和滚转)测量、双轴加速度测量等系统中。1.2 三轴倾角传感器ADXL34简介 ADXL345是一款小巧纤薄的低功耗三轴加速度计,可以对高达16 g的加速度进行高分辨率(13位)测量。数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或者I2C数字接口访问。ADXL345非常适合移动设备应用。它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。它具有高分辨率(4 mg/LSB),能够测量约0.25的倾角变化。使用ADXL345等数字输出加速度计时,无需进行模数转换,从而可以节省系统成本和电路板面积。此外, ADXL345内置多种功能。活动/非活动检测、单击/双击检测以及自由落体检测均在内部完成,无需主机处理器执行任何计算。内置32级FIFO存储缓冲器可以减轻主机处理器的负担,起到简化算法和省电的作用。利用内置的活动/非活动检测功能,将ADXL345用作“运动开关”(无活动时关闭整个系统,检测到活动时才开启),系统可以实现进一步省电。 ADXL345是一款小巧纤薄的低功耗三轴加速度计,可以对高达16 g的加速度进行高分辨率(13位)测量。数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或者I2C数字接口访问。 ADXL345非常适合移动设备应用。它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。它具有高分辨率(4 mg/LSB),能够测量约0.25的倾角变化。使用ADXL345等数字输出加速度计时,无需进行模数转换,从而可以节省系统成本和电路板面积。此外, 2ADXL345通过IC或SPI接口进行通信。 1.3 三轴倾斜的计算引入第三轴时可在全球范围内确定传感器的方向。可通过传统的直角坐标系(x,y,z)球面(,)转换法来表征xy平面倾斜角及重力矢量倾斜角,ADXL345输出的X、Y、Z三个轴向德原始数据,要得出角度值必须要经过实际换算,其公式如下所示:1.4 STC89C51单片机简介 1.4.1 STC89C51系列单片机的主要性能特点STC89C51系列单片机是宏晶科技推出的新一代超强抗干扰、高速、低功耗的单片机,指令代码与传统8051单片机完全兼容。MCS51的主要特点为:CPU为8位;片内带振荡器,频率范围为1.212MHz;片内带128字节的数据存储器;(RAM)片内带4KB的Flash程序存储器;(ROM)程序存储器的寻址空间为64KB;(需要扩展ROM)片外数据存储器的寻址空间为64KB;(需要扩展RAM)128位(16字节)用户位寻址空间;(在128个字节中)18个字节特殊功能寄存器SFR(MCS52子系列为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.2 MCS-51系列单片机的基本组成图1-5 管脚图AT89C51与51系列中各种型号芯片的引脚互相兼容。目前多采用40只引脚双列直插,如图2-2所示。引脚按其功能可分为如下3类: 电源及时钟引脚VCC、VSS;XTAL1、XTAL2; 控制引脚、和; I/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-2 SCA100t-D02引脚图2.2.2液晶显示器选用 本方案中选用的液晶显示器的型号是1602,引脚图见图3-3,LCD1602显示器有20个引脚,能够双行显示20为字符,本方案的思想是显示器的两行分别显示传感器的X和Y轴对应角度;当角度超过20时,在对应角度后面显示DANGER!字符,警示倾斜角度过大。 图2-3 LCD1602引脚图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 -Dout0)/ Sensitivity其中Dout为X或Y通道的数字输出量,Dout0为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的电流为35mA时,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-2 LCD显示子程序图4-3 倾斜角采集框图图4-4 报警程序框图第九章 参考文献程德福、林君、智能仪器、机械工业出版社张毅刚、单片机原理及应用、高等教育出版社附录附录一:元器件清单STC89C52单片机个MAX232串行接口个ADXL345倾斜角传感器个LCD1602液晶显示器个蜂鸣器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.hsbit RS = P36; /定义端口 sbit RW = P35;sbit EN = P34;#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P1/*- 判忙函数-*/ bit LCD_Check_Busy(void) DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); /*- 写入命令函数-*/ void LCD_Write_Com(unsigned char com) while(LCD_Check_Busy(); /忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; /*- 写入数据函数-*/ void LCD_Write_Data(unsigned char Data) while(LCD_Check_Busy(); /忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; /*- 清屏函数-*/ void LCD_Clear(void) LCD_Write_Com(0x01); DelayMs(5); /*- 写入字符串函数-*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) if (y = 0) LCD_Write_Com(0x80 + x); /表示第一行 else LCD_Write_Com(0xC0 + x); /表示第二行 while (*s) LCD_Write_Data( *s); s +; /*- 写入字符函数-*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); /*- 初始化函数-*/ void LCD_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); /*显示开及光标设置*/void LCD_cursor(unsigned char X,unsigned char Y) if (Y = 0) LCD_Write_Com(0x80 + X); else LCD_Write_Com(0xC0 + X); LCD_Write_Com(0x0e); #include ADXL345.h#include delay.h#define uchar unsigned char#define uint unsigned int/使用的端口,请按照以下接线sbit SCL=P06; /IIC时钟引脚定义sbit SDA=P05; /IIC数据引脚定义typedef unsigned char BYTE;typedef unsigned short WORD;#defineSlaveAddress 0xA6 /定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改extern uchar BUF8; /接收数据缓存区/*起始信号*/void ADXL345_Start() SDA = 1; /拉高数据线 SCL = 1; /拉高时钟线 Delay5us(); /延时 SDA = 0; /产生下降沿 Delay5us(); /延时 SCL = 0; /拉低时钟线/*停止信号*/void ADXL345_Stop() SDA = 0; /拉低数据线 SCL = 1; /拉高时钟线 Delay5us(); /延时 SDA = 1; /产生上升沿 Delay5us(); /延时/*发送应答信号入口参数:ack (0:ACK 1:NAK)*/void ADXL345_SendACK(bit ack) SDA = ack; /写应答信号 SCL = 1; /拉高时钟线 Delay5us(); /延时 SCL = 0; /拉低时钟线 Delay5us(); /延时/*接收应答信号*/bit ADXL345_RecvACK() SCL = 1; /拉高时钟线 Delay5us(); /延时 CY = SDA; /读应答信号 SCL = 0; /拉低时钟线 Delay5us(); /延时 return CY;/*向IIC总线发送一个字节数据*/void ADXL345_SendByte(BYTE dat) BYTE i; for (i=0; i8; i+) /8位计数器 dat = 1; /移出数据的最高位 SDA = CY; /送数据口 SCL = 1; /拉高时钟线 Delay5us(); /延时 SCL = 0; /拉低时钟线 Delay5us(); /延时 ADXL345_RecvACK();/*从IIC总线接收一个字节数据*/BYTE ADXL345_RecvByte() BYTE i; BYTE dat = 0; SDA = 1; /使能内部上拉,准备读取数据, for (i=0; i8; i+) /8位计数器 dat = 1; SCL = 1; /拉高时钟线 Delay5us(); /延时 dat |= SDA; /读数据 SCL = 0; /拉低时钟线 Delay5us(); /延时 return dat;/*单字节写入*void Single_Write_ADXL345(uchar REG_Address,uchar REG_data) ADXL345_Start(); /起始信号 ADXL345_SendByte(SlaveAddress); /发送设备地址+写信号 ADXL345_SendByte(REG_Address); /内部寄存器地址,请参考中文pdf22页 ADXL345_SendByte(REG_data); /内部寄存器数据,请参考中文pdf22页 ADXL345_Stop(); /发送停止信号/*单字节读取*uchar Single_Read_ADXL345(uchar REG_Address) uchar REG_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(); /停止信号 return REG_data; /*/连续读出ADXL345内部加速度数据,地址范围0x320x37/*void Multiple_read_ADXL345(void) uchar i; ADXL345_Start(); /起始信号 ADXL345_SendByte(SlaveAddress); /发送设备地址+写信号 ADXL345_SendByte(0x32); /发送存储单元地址,从0x32开始 ADXL345_Start(); /起始信号 ADXL345_SendByte(SlaveAddress+1); /发送设备地址+读信号 for (i=0; i6; i+) /连续读取6个地址数据,存储中BUF BUFi = ADXL345_RecvByte(); /BUF0存储0x32地址中的数据 if (i = 5) ADXL345_SendACK(1); /最后一个数据需要回NOACK else ADXL345_SendACK(0); /回应ACK ADXL345_Stop(); /停止信号 Delay5ms();/*/初始化ADXL345,根据需要请参考pdf进行修改*void Init_ADXL345() Single_Write_ADXL345(0x31,0x0B); /测量范围,正负16g,13位模式 Single_Write_ADXL345(0x2C,0x08); /速率设定为12.5 参考pdf13页 Single_Write_ADXL345(0x2D,0x08); /选择电源模式 参考pdf24页 Single_Write_ADXL345(0x2E,0x80); /使能 DATA_READY 中断 Single_Write_ADXL345(0x1E,0x00); /X 偏移量 根据测试传感器的状态写入pdf29页 Single_Write_ADXL345(0x1F,0x00); /Y 偏移量 根据测试传感器的状态写入pdf29页 Single_Write_ADXL345(0x20,0x05); /Z 偏移量 根据测试传感器的状态写入pdf29页#include 1602.h#include delay.hsbit RS = P36; /定义端口 sbit RW = P35;sbit EN = P34;#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P1/*- 判忙函数-*/ bit LCD_Check_Busy(void) DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); /*- 写入命令函数-*/ void LCD_Write_Com(unsigned char com) while(LCD_Check_Busy(); /忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; /*- 写入数据函数-*/ void LCD_Write_Data(unsigned char Data) while(LCD_Check_Busy(); /忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; /*- 清屏函数-*/ void LCD_Clear(void) LCD_Write_Com(0x01); DelayMs(5); /*- 写入字符串函数-*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) if (y = 0) LCD_Write_Com(0x80 + x); /表示第一行 else LCD_Write_Com(0xC0 + x); /表示第二行 while (*s) LCD_Write_Data( *s); s +; /*- 写入字符函数-*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); /*- 初始化函数-*/ void LCD_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); /*显示开及光标设置*/void LCD_cursor(unsigned char X,unsigned char Y) if (Y = 0) LCD_Write_Com(0x80 + X); else LCD_Write_Com(0xC0 + X); LCD_Write_Com(0x0e); #include #include /Keil library #include /Keil library#include 1602.h#include delay.h#include ADXL345.h#include uart.hsbit Key1=P22; /度数设置键sbit Key2=P27; /加键sbit Key3=P01; /减键sbit Key4=P00; /返回设置键sbit Speak=P20;#define uchar unsigned char#define uint unsigned intuchar BUF8; /接收数据缓存区 uchar ge,shi,bai,qian,wan; /显示变量uchar Flag;uchar angle_flag=0;int dis_data; /变量unsigned char counter; /时间时分秒选项计数,1:设置小时,2:设置分钟,3:设置秒int Angle_up=40;/角度报警上限int Angle_down=30;/角度报警下限int max,min;void conversion(uint temp_data);int angle_int;int dis_data; /变量float Roll,Pitch,zz,Q,T,K;/-/*void conversion(uint temp_data) unsigned char aa,bb,cc; wan=temp_data/10000+0x30 ; temp_data=temp_data%10000; /取余运算aa=temp_data/1000;qian=temp_data/1000+0x30 ; temp_data=temp_data%1000; /取余运算bb=temp_data/100; bai=temp_data/100+0x30 ; temp_data=temp_data%100; /取余运算cc=temp_data/10; shi=temp_data/10+0x30 ; temp_data=temp_data%10; /取余运算 ge=temp_data+0x30; angle_int=aa*100+bb*10+cc;/*/显示x轴void display_x() dis_data=(BUF18)+BUF0; /合成数据 if(dis_data0)dis_data=-dis_data; LCD_Write_Char(10,0,-); /显示正负符号位else LCD_Write_Char(10,0, ); /显示空格 Q=(float)dis_data*3.9; /计算数据和显示,查考ADXL345快速入门第4页 conversion(Q); /转换出显示需要的数据LCD_Write_Char(8,0,X); LCD_Write_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论