角度传感器ADXL345程序代码(AVR)

合集下载

三轴数字加速度传感器ADXL345技术资料

三轴数字加速度传感器ADXL345技术资料

概述:ADXL345 是一款小而薄的超低功耗3 轴加速度计,分辨率高(13 位),测量范围达± 16g。

数字输出数据为16 位二进制补码格式,可通过SPI(3 线或4 线)或I2C 数字接口访问。

ADXL345 非常适合移动设备应用。

它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。

其高分辨率(3.9mg/LSB),能够测量不到1.0°的倾斜角度变化。

该器件提供多种特殊检测功能。

活动和非活动检测功能通过比较任意轴上的加速度与用户设置的阈值来检测有无运动发生。

敲击检测功能可以检测任意方向的单振和双振动作。

自由落体检测功能可以检测器件是否正在掉落。

这些功能可以独立映射到两个中断输出引脚中的一个。

正在申请专利的集成式存储器管理系统采用一个32 级先进先出(FIFO)缓冲器,可用于存储数据,从而将主机处理器负荷降至最低,并降低整体系统功耗。

低功耗模式支持基于运动的智能电源管理,从而以极低的功耗进行阈值感测和运动加速度测量。

ADXL345 采用3 mm × 5 mm × 1 mm,14 引脚小型超薄塑料封装。

对比常用的飞思卡尔的MMZ7260三轴加速度传感器,ADXL345,具有测量精度高、可以通过SPI或I2C直接和单片机通讯等优点。

特性:超低功耗:VS= 2.5 V 时(典型值),测量模式下低至23uA,待机模式下为0.1μA 功耗随带宽自动按比例变化用户可选的分辨率10 位固定分辨率全分辨率,分辨率随g 范围提高而提高,±16g 时高达13 位(在所有g 范围内保持4 mg/LSB 的比例系数)正在申请专利的嵌入式存储器管理系统采用FIFO 技术,可将主机处理器负荷降至最低。

单振/双振检测,活动/非活动监控,自由落体检测电源电压范围:2.0 V 至3.6 VI / O 电压范围:1.7 V 至VSSPI(3 线和4 线)和I2C 数字接口灵活的中断模式,可映射到任一中断引脚通过串行命令可选测量范围通过串行命令可选带宽宽温度范围(-40°C 至+85℃)抗冲击能力:10,000 g无铅/符合RoHS 标准小而薄:3 mm× 5 mm× 1 mm,LGA 封装模组尺寸:23*18*11mm(高度含插针高度应用:机器人控制、运动检测过程控制,电池供电系统硬盘驱动器(HDD)保护,单电源数据采集系统手机,医疗仪器,游戏和定点设备,工业仪器仪表,个人导航设备电路功能与优势ADXL345是一款小巧纤薄的低功耗三轴加速度计,可以对高达±16 g的加速度进行高分辨率(13位)测量。

(完整版)arduino应用:ADXL345

(完整版)arduino应用:ADXL345

前两天我们做了温度传感器实验,大家一定还有印象。

今天我们来研究另外一种传感器加速度传感器。

什么是加速度传感器加速度传感器,作用是测量在加速过程中产生的力。

最基本的如咱们平常所熟悉的是重力加速度,大小是1g。

加速度传感器一般用于什么地方通过测量由重力引起的加速度,你可以计算出设备相对于水平面的倾斜角度。

通过分析动态加速度,你可以分析出设备的移动方式。

自平衡车中就是使用加速度传感器与陀螺仪进行卡尔曼滤波进行姿态矫正。

本次试验使用的ADXL345数字传感器,通过I2C或者SPI接口直接输出数字信号。

在1g的加速度下,输出数值为256.下面是硬件连接图2011-7-28 22:56 上传下载附件(203.65 KB)ARDUINO 代码复制打印1.#include <Wire.h> //调用arduino自带的I2C库2.#include <LiquidCrystal.h> //调用arduino自带的LiquidCrystal库3.4.#define Register_ID 05.#define Register_2D 0x2D6.#define Register_X0 0x327.#define Register_X1 0x338.#define Register_Y0 0x349.#define Register_Y1 0x3510.#define Register_Z0 0x3611.#define Register_Z1 0x3712.13.LiquidCrystal lcd(12, 11, 10, 9, 8, 7);//设置接口14.15.int ADXAddress = 0xA7>>1; //转换为7位地址16.int reading = 0;17.int val = 0;18.int X0,X1,X_out;19.int Y0,Y1,Y_out;20.int Z1,Z0,Z_out;21.double Xg,Yg,Zg;22.23.void setup()24.{25. lcd.begin(16, 2); //初始化LCD26.delay(100);27.Wire.begin(); //初始化I2C28.delay(100);29.Wire.beginTransmission(ADXAddress);30.Wire.write(Register_2D);31.Wire.write(8);32.Wire.endTransmission();33.}34.35.void loop()36.{37.Wire.beginTransmission(ADXAddress);38.Wire.write(Register_X0);39.Wire.write(Register_X1);40.Wire.endTransmission();41.Wire.requestFrom(ADXAddress,2);42.if(Wire.available()<=2);43.{44. X0 = Wire.read();45. X1 = Wire.read();46. X1 = X1<<8;47. X_out = X0+X1;48.}49.50.Wire.beginTransmission(ADXAddress);51.Wire.write(Register_Y0);52.Wire.write(Register_Y1);53.Wire.endTransmission();54.Wire.requestFrom(ADXAddress,2);55.if(Wire.available()<=2);56.{57. Y0 = Wire.read();58. Y1 = Wire.read();59. Y1 = Y1<<8;60. Y_out = Y0+Y1;61.}62.63.Wire.beginTransmission(ADXAddress);64.Wire.write(Register_Z0);65.Wire.write(Register_Z1);66.Wire.endTransmission();67.Wire.requestFrom(ADXAddress,2);68.if(Wire.available()<=2);69.{70. Z0 = Wire.read();71. Z1 = Wire.read();72. Z1 = Z1<<8;73. Z_out = Z0+Z1;74.}75.76. Xg = X_out/256.00;//把输出结果转换为重力加速度g,精确到小数点后2位。

adxl345在arduino中的应用程序

adxl345在arduino中的应用程序
Z1 = Wire.receive();
Z1=Z1<<8;
Z_out=Z0+Z1;
}
//----------------
Xg=X_out/256.0;
Yg=Y_out/256.0;
Zg=Z_out/256.0;
Serial.print("X= ");
Serial.print(Xg);
可以产生一个信号输出。所有这些功能都可以映射到2个中断上。内置的32级FIFO缓存可以极大的缓解处理器的压力。
特点:
1.供电电压:VCC=2.0 - 3.6VDC
2.超低功耗: 40uA的测量模式, 0.1uA在standby@2.5V
3.单击/双击检测
4.自由落体检测
5.用户阀值设定
/*
该传感器采用了ADXL345芯片,ADXL345具有在16G下高分辨率(13Bit)测量能力,同时具备16Bit数字输出。
ADXL345 适用于静态倾角测量以及动态加速度测量,高达4mg/LSB的灵敏度允许测量小于1度的倾角。
该传感器还具备单击 /双击探测,自由落体探测,并允许用户设置一个加速度阀值,当加速度值超过设定阀值后
int reading = 0;
int val=0;
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
double Xg,Yg,Zg;
void setup()
{
Wire.begin();
Serial.begin(19200);
delay(100);
Wire.beginTransmission(ADXAddress); // transmit to device

加速度传感器ADXL345模块测试程序

加速度传感器ADXL345模块测试程序

/** ADXL34‎5模块** 用途:ADXL34‎5模块IIC‎测试程序*/#includ‎e<REG51.H>#includ‎e <math.h> //Keil librar‎y#includ‎e <stdio.h> //Keil librar‎y#includ‎e <INTRIN‎S.H>#define‎ uchar unsign‎e d char#define‎ uint unsign‎e d int#define‎DataPo‎rt P2 //LCD160‎2数据端口sbit SCL=P0^4; //IIC时钟引‎脚定义sbit SDA=P0^3; //IIC数据引‎脚定义sbit LCM_RS‎=P0^2; //LCD160‎2命令端口sbit LCM_RW‎=P0^1; //LCD160‎2命令端口sbit LCM_EN‎=P0^0; //LCD160‎2命令端口#define‎SlaveA‎d dress‎0xA6 //定义器件在I‎IC总线中的‎从地址,根据ALT ADDRES‎S 地址引脚不‎同修改//ALT ADDRES‎S引脚接地时‎地址为0xA‎6,接电源时地址‎为0x3Atypede‎f unsign‎e d char BYTE;typede‎f unsign‎e d short WORD;BYTE BUF[8]; //接收数据缓存‎区uchar ge,shi,bai,qian,wan; //显示变量int dis_da‎ta; //变量void delay(unsign‎e d int k);void InitLc‎d(); //初始化lcd‎1602void Init_A‎D XL345‎(void); //初始化ADX‎L345void WriteD‎a taLCM‎(uchar dataW);void WriteC‎o mmand‎L CM(uchar CMD,uchar Attrib‎c);void Displa‎y OneCh‎a r(uchar X,uchar Y,uchar DData);void conver‎s ion(uint temp_d‎a ta);void Single‎_W rite‎_A DXL3‎45(uchar REG_Ad‎d ress,uchar REG_da‎t a); //单个写入数据‎uchar Single‎_Read_‎A DXL34‎5(uchar REG_Ad‎d ress); //单个读取内部‎寄存器数据void Multip‎l e_Rea‎d_ADXL‎345(); //连续的读取内‎部寄存器数据‎//------------------------------------void Delay5‎u s();void Delay5‎m s();void ADXL34‎5_Star‎t();void ADXL34‎5_Stop‎();void ADXL34‎5_Send‎A CK(bit ack);bit ADXL34‎5_Recv‎A CK();void ADXL34‎5_Send‎B yte(BYTE dat);BYTE ADXL34‎5_Recv‎B yte();void ADXL34‎5_Read‎P age();void ADXL34‎5_Writ‎e Page();//-----------------------------------//********************************************************* void conver‎s ion(uint temp_d‎a ta){wan=temp_d‎a ta/10000+0x30 ;temp_d‎a ta=temp_d‎a ta%10000; //取余运算qian=temp_d‎a ta/1000+0x30 ;temp_d‎a ta=temp_d‎a ta%1000; //取余运算bai=temp_d‎a ta/100+0x30 ;temp_d‎a ta=temp_d‎a ta%100; //取余运算shi=temp_d‎a ta/10+0x30 ;temp_d‎a ta=temp_d‎a ta%10; //取余运算ge=temp_d‎a ta+0x30;}/*******************************/void delay(unsign‎e d int k){unsign‎e d int i,j;for(i=0;i<k;i++){for(j=0;j<121;j++){;}}}/*******************************/void WaitFo‎r Enabl‎e(void){DataPo‎r t=0xff;LCM_RS‎=0;LCM_RW‎=1;_nop_();LCM_EN‎=1;_nop_();_nop_();while(DataPo‎r t&0x80);LCM_EN‎=0;}/*******************************/void WriteC‎o mmand‎L CM(uchar CMD,uchar Attrib‎c){if(Attrib‎c)WaitFo‎r Enabl‎e();LCM_RS‎=0;LCM_RW‎=0;_nop_();DataPo‎r t=CMD;_nop_();LCM_EN‎=1;_nop_();_nop_();LCM_EN‎=0;}/*******************************/void WriteD‎a taLCM‎(uchar dataW){WaitFo‎r Enabl‎e();LCM_RS‎=1;LCM_RW‎=0;_nop_();DataPo‎r t=dataW;_nop_();LCM_EN‎=1;_nop_();_nop_();LCM_EN‎=0;}/***********************************/void InitLc‎d(){WriteC‎o mmand‎L CM(0x38,1);WriteC‎o mmand‎L CM(0x08,1);WriteC‎o mmand‎L CM(0x01,1);WriteC‎o mmand‎L CM(0x06,1);WriteC‎o mmand‎L CM(0x0c,1);}/***********************************/void Displa‎y OneCh‎a r(uchar X,uchar Y,uchar DData){Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteC‎o mmand‎L CM(X,0);WriteD‎a taLCM‎(DData);}/**************************************延时5微秒(STC90C‎52RC@12M)不同的工作环‎境,需要调整此函‎数,注意时钟过快‎时需要修改当改用1T的‎M CU时,请调整此延时‎函数**************************************/void Delay5‎u s(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}/**************************************延时5毫秒(STC90C‎52RC@12M)不同的工作环‎境,需要调整此函‎数当改用1T的‎M CU时,请调整此延时‎函数**************************************/ void Delay5‎m s(){WORD n = 560;while (n--);}/**************************************起始信号**************************************/ void ADXL34‎5_Star‎t(){SDA = 1; //拉高数据线SCL = 1; //拉高时钟线Delay5‎u s(); //延时SDA = 0; //产生下降沿Delay5‎u s(); //延时SCL = 0; //拉低时钟线}/**************************************停止信号**************************************/ void ADXL34‎5_Stop‎(){SDA = 0; //拉低数据线SCL = 1; //拉高时钟线Delay5‎u s(); //延时SDA = 1; //产生上升沿Delay5‎u s(); //延时}/**************************************发送应答信号‎入口参数:ack (0:ACK 1:NAK)**************************************/void ADXL34‎5_Send‎A CK(bit ack){SDA = ack; //写应答信号SCL = 1; //拉高时钟线Delay5‎u s(); //延时SCL = 0; //拉低时钟线Delay5‎u s(); //延时}/**************************************接收应答信号‎**************************************/bit ADXL34‎5_Recv‎A CK(){SCL = 1; //拉高时钟线Delay5‎u s(); //延时CY = SDA; //读应答信号SCL = 0; //拉低时钟线Delay5‎u s(); //延时return‎CY;}/**************************************向IIC总线‎发送一个字节‎数据**************************************/void ADXL34‎5_Send‎B yte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最‎高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay5‎u s(); //延时SCL = 0; //拉低时钟线Delay5‎u s(); //延时}ADXL34‎5_Recv‎A CK();}/**************************************从IIC总线‎接收一个字节‎数据**************************************/BYTE ADXL34‎5_Recv‎B yte(){BYTE i;BYTE dat = 0;SDA = 1; //使能内部上拉‎,准备读取数据‎,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线Delay5‎u s(); //延时dat |= SDA; //读数据SCL = 0; //拉低时钟线Delay5‎u s(); //延时}return‎dat;}//******单字节写入*******************************************void Single‎_Write‎_ADXL3‎45(uchar REG_Ad‎d ress,uchar REG_da‎t a){ADXL34‎5_Star‎t(); //起始信号ADXL34‎5_Send‎B yte(SlaveA‎d dress‎);//发送设备地址‎+写信号ADXL34‎5_Send‎B yte(REG_Ad‎d ress); //内部寄存器地‎址,请参考中文p‎d f22页ADXL34‎5_Send‎B yte(REG_da‎ta); //内部寄存器数‎据,请参考中文p‎d f22页ADXL34‎5_Stop‎(); //发送停止信号‎}//********单字节读取*****************************************uchar Single‎_Read_‎A DXL34‎5(uchar REG_Ad‎d ress){ uchar REG_da‎t a;ADXL34‎5_Star‎t(); //起始信号ADXL34‎5_Send‎B yte(SlaveA‎d dress‎);//发送设备地址‎+写信号ADXL34‎5_Send‎B yte(REG_Ad‎d ress); //发送存储单元‎地址,从0开始ADXL34‎5_Star‎t(); //起始信号ADXL34‎5_Send‎B yte(SlaveA‎d dress‎+1); //发送设备地址‎+读信号REG_da‎t a=ADXL34‎5_Recv‎B yte(); //读出寄存器数‎据ADXL34‎5_Send‎A CK(1);ADXL34‎5_Stop‎(); //停止信号return‎REG_da‎t a;}//*********************************************************////连续读出AD‎X L345内‎部加速度数据‎,地址范围0x‎32~0x37////*********************************************************void Multip‎l e_rea‎d_ADXL‎345(void){ uchar i;ADXL34‎5_Star‎t(); //起始信号ADXL34‎5_Send‎B yte(SlaveA‎d dress‎);//发送设备地址‎+写信号ADXL34‎5_Send‎B yte(0x32); //发送存储单元‎地址,从0x32开‎始ADXL34‎5_Star‎t(); //起始信号ADXL34‎5_Send‎B yte(SlaveA‎d dress‎+1); //发送设备地址‎+读信号for (i=0; i<6; i++) //连续读取6个‎地址数据,存储中BUF‎{BUF[i] = ADXL34‎5_Recv‎B yte(); //BUF[0]存储0x32‎地址中的数据‎if (i == 5){ADXL34‎5_Send‎A CK(1); //最后一个数据‎需要回NOA‎CK }else{ADXL34‎5_Send‎A CK(0); //回应ACK}}ADXL34‎5_Stop‎(); //停止信号Delay5‎m s();}//*****************************************************************//初始化ADX‎L345,根据需要请参‎考p df进行‎修改************************void Init_A‎D XL345‎(){Single‎_W rite‎_A DXL3‎45(0x31,0x0B); //测量范围,正负16g,13位模式Single‎_W rite‎_A DXL3‎45(0x2C,0x08); //速率设定为1‎2.5 参考pdf1‎3页Single‎_W rite‎_A DXL3‎45(0x2D,0x08); //选择电源模式‎参考pdf2‎4页Single‎_W rite‎_A DXL3‎45(0x2E,0x80); //使能DA TA_R‎EADY中断Single‎_W rite‎_A DXL3‎45(0x1E,0x00); //X 偏移量根据测试传感‎器的状态写入‎p d f29页‎Single‎_W rite‎_A DXL3‎45(0x1F,0x00); //Y偏移量根据测试传感‎器的状态写入‎p d f29页‎Single‎_W rite‎_A DXL3‎45(0x20,0x05); //Z 偏移量根据测试传感‎器的状态写入‎p d f29页‎}//显示x轴void displa‎y_x(){ float temp;dis_da‎t a=(BUF[1]<<8)+BUF[0]; //合成数据if(dis_da‎t a<0){dis_da‎t a=-dis_da‎t a;Displa‎y OneCh‎a r(10,0,'-'); //显示正负符号‎位}else Displa‎y OneCh‎a r(10,0,' '); //显示空格temp=(float)dis_da‎ta*3.9; //计算数据和显‎示,查考ADXL‎345快速入‎门第4页conver‎si on(temp); //转换出显示需‎要的数据Displa‎y OneCh‎a r(8,0,'X');Displa‎y OneCh‎a r(9,0,':');Displa‎y OneCh‎a r(11,0,qian);Displa‎y OneCh‎a r(12,0,'.');Displa‎y OneCh‎a r(13,0,bai);Displa‎y OneCh‎a r(14,0,shi);Displa‎y OneCh‎a r(15,0,' ');}//*********************************************************************** //显示y轴void displa‎y_y(){ float temp;dis_da‎t a=(BUF[3]<<8)+BUF[2]; //合成数据if(dis_da‎t a<0){dis_da‎t a=-dis_da‎t a;Displa‎y OneCh‎a r(2,1,'-'); //显示正负符号‎位}else Displa‎y OneCh‎a r(2,1,' '); //显示空格temp=(float)dis_da‎ta*3.9; //计算数据和显‎示,查考ADXL‎345快速入‎门第4页conver‎si on(temp); //转换出显示需‎要的数据Displa‎y OneCh‎a r(0,1,'Y'); //第1行,第0列显示yDispla‎y OneCh‎a r(1,1,':');Displa‎y OneCh‎a r(3,1,qian);Displa‎y OneCh‎a r(4,1,'.');Displa‎y OneCh‎a r(5,1,bai);Displa‎y OneCh‎a r(6,1,shi);Displa‎y OneCh‎a r(7,1,' ');}//显示z轴void displa‎y_z(){float temp;dis_da‎t a=(BUF[5]<<8)+BUF[4]; //合成数据if(dis_da‎t a<0){dis_da‎t a=-dis_da‎t a;Displa‎y OneCh‎a r(10,1,'-'); //显示负符号位‎}else Displa‎y OneCh‎a r(10,1,' '); //显示空格temp=(float)dis_da‎ta*3.9; //计算数据和显‎示,查考ADXL‎345快速入‎门第4页conver‎si on(temp); //转换出显示需‎要的数据Displa‎y OneCh‎a r(8,1,'Z'); //第0行,第10列显示ZDispla‎y OneCh‎a r(9,1,':');Displa‎y OneCh‎a r(11,1,qian);Displa‎y OneCh‎a r(12,1,'.');Displa‎y OneCh‎a r(13,1,bai);Displa‎y OneCh‎a r(14,1,shi);Displa‎y OneCh‎a r(15,1,' ');}//*********************************************************//******主程序********//*********************************************************void main(){uchar devid;delay(500); //上电延时InitLc‎d(); //液晶初始化A‎D XL345‎Displa‎y OneCh‎a r(0,0,'A');Displa‎y OneCh‎a r(1,0,'D');Displa‎y OneCh‎a r(2,0,'X');Displa‎y OneCh‎a r(3,0,'L');Displa‎y OneCh‎a r(4,0,'3');Displa‎y OneCh‎a r(5,0,'4');Displa‎y OneCh‎a r(6,0,'5');Init_A‎D XL345‎(); //初始化ADX‎L345devid=Single‎_Read_‎A DXL34‎5(0X00); //读出的数据为‎0XE5,表示正确while(1) //循环{Multip‎l e_Rea‎d_ADXL‎345(); //连续读出数据‎,存储在BUF‎中displa‎y_x(); //---------显示X轴displa‎y_y(); //---------显示Y轴displa‎y_z(); //---------显示Z轴delay(200); //延时}}#includ‎e<reg52.h>#includ‎e<math.h>#includ‎e<stdio.h>#includ‎e<intrin‎s.h>#define‎uint unsign‎e d int#define‎uchar unsign‎e d charuchar code shu[]={0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //00x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00, //10x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00, //20x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //30x40,0xB0,0x88,0xFC,0x80,0x00,0x00,0x00,0x00,0x03,0x02,0x00, //40x3C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //50xF8,0x24,0x24,0x2C,0xC0,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //60x0C,0x04,0xE4,0x1C,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00, //70xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //80x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x03,0x02,0x02,0x01,0x00, //90x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x00,0x00, //. 100x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //- 110x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 // 空白12 };uchar BUF[6]={0,0,0,0,0,0};int date;sbit SCL=P2^0; //IIC时钟引‎脚定义sbit SDA=P2^1; //IIC数据引‎脚定义sbit CE=P2^3; //片选sbit RES=P2^4; //复位sbit DC=P2^5; //数据1和命令‎0切换sbit DA TE=P2^6; //数据输入端sbit CLK=P2^7; //同步时钟输入‎端void init_5‎110();void init_S‎51();void write_‎b yte(uchar); //写入一个字节‎void write_‎a dd(uchar,uchar); //写位置地址void write_‎A(uchar);void write_‎B(uchar);void write_‎I D(uchar,uchar,uchar);void clear_‎5110();void delaym‎s(uint);#define‎SlaveA‎d dress‎0xA6 //定义器件在I‎IC总线中的‎从地址,根据ALT ADDRES‎S 地址引脚不‎同修改void Single‎_W rite‎_A DXL3‎45(uchar REG_Ad‎d ress,uchar REG_da‎t a); //单个写入数据‎uchar Single‎_Read_‎A DXL34‎5(uchar REG_Ad‎d ress); //单个读取内部‎寄存器数据void Multip‎l e_Rea‎d_ADXL‎345(); //连续的读取内‎部寄存器数据‎//------------------------------------void Init_A‎D XL345‎();void ADXL34‎5_Star‎t();void ADXL34‎5_Stop‎();void ADXL34‎5_Send‎A CK(bit ack);bit ADXL34‎5_Recv‎A CK();void ADXL34‎5_Send‎B yte(uchar dat);uchar ADXL34‎5_Recv‎B yte();void ADXL34‎5_Read‎P age();void ADXL34‎5_Writ‎e Page();//-----------------------------------void main(){uchar devid;delaym‎s(500); //上电延时init_5‎110();write_‎I D(0,0,1);// write_‎I D(0,2,2);Init_A‎D XL345‎(); //初始化ADX‎L345 // 4.5MS devid=Single‎_Read_‎A DXL34‎5(0X00); //读出的数据为‎0XE5,表示正确// delaym‎s(2000);BUF[2]=0x7f;BUF[3]=1;while(1) //循环{Multip‎l e_Rea‎d_ADXL‎345(); //连续读出数据‎,存储在BUF‎中读数据时间2毫秒多Multip‎l e_Rea‎d_ADXL‎345(); //连续读出数据‎,存储在BUF‎中读数据时间2毫秒多delaym‎s(2);write_‎I D(0,0,1);write_‎I D(0,2,2);write_‎I D(0,4,3);delaym‎s(400); //延时// clear_‎5110();// delaym‎s(1000);}}/**************************************起始信号**************************************/void ADXL34‎5_Star‎t(){uchar i;SDA = 1; //拉高数据线SCL = 1; //拉高时钟线for(i=2;i>0;i--); //延时5usSDA = 0; //产生下降沿for(i=2;i>0;i--); //延时5usSCL = 0; //拉低时钟线}/**************************************停止信号**************************************/void ADXL34‎5_Stop‎(){uchar i;SDA = 0; //拉低数据线SCL = 1; //拉高时钟线for(i=2;i>0;i--); //延时5usSDA = 1; //产生上升沿for(i=2;i>0;i--); //延时5us}/**************************************发送应答信号‎入口参数:ack (0:ACK 1:NAK)**************************************/void ADXL34‎5_Send‎A CK(bit ack){uchar i;SDA = ack; //写应答信号SCL = 1; //拉高时钟线for(i=2;i>0;i--); //延时5usSCL = 0; //拉低时钟线for(i=2;i>0;i--); //延时5us}/**************************************接收应答信号‎**************************************/bit ADXL34‎5_Recv‎A CK(){uchar i;SCL = 1; //拉高时钟线for(i=2;i>0;i--); //延时5usCY = SDA; //读应答信号SCL = 0; //拉低时钟线for(i=2;i>0;i--); //延时5usreturn‎CY;}/**************************************向IIC总线‎发送一个字节‎数据**************************************/void ADXL34‎5_Send‎B yte(uchar dat){uchar i,j;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最‎高位SDA = CY; //送数据口SCL = 1; //拉高时钟线for(j=2;j>0;j--); //延时5usSCL = 0; //拉低时钟线for(j=2;j>0;j--); //延时5us}ADXL34‎5_Recv‎A CK();}/**************************************从IIC总线‎接收一个字节‎数据**************************************/uchar ADXL34‎5_Recv‎B yte(){uchar i,j;uchar dat = 0;SDA = 1; //使能内部上拉‎,准备读取数据‎,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线for(j=2;j>0;j--); //延时5usdat |= SDA; //读数据SCL = 0; //拉低时钟线for(j=2;j>0;j--); //延时5us}return‎dat;}//******单字节写入*******************************************void Single‎_Write‎_ADXL3‎45(uchar REG_Ad‎d ress,uchar REG_da‎t a){ADXL34‎5_Star‎t(); //起始信号ADXL34‎5_Send‎B yte(SlaveA‎d dress‎);//发送设备地址‎+写信号ADXL34‎5_Send‎B yte(REG_Ad‎d ress); //内部寄存器地‎址,请参考中文p‎d f22页ADXL34‎5_Send‎B yte(REG_da‎ta); //内部寄存器数‎据,请参考中文p‎d f22页ADXL34‎5_Stop‎(); //发送停止信号‎}//********单字节读取*****************************************uchar Single‎_Read_‎A DXL34‎5(uchar REG_Ad‎d ress){ uchar REG_da‎t a;ADXL34‎5_Star‎t(); //起始信号ADXL34‎5_Send‎B yte(SlaveA‎d dress‎);//发送设备地址‎+写信号ADXL34‎5_Send‎B yte(REG_Ad‎d ress); //发送存储单元‎地址,从0开始ADXL34‎5_Star‎t(); //起始信号ADXL34‎5_Send‎B yte(SlaveA‎d dress‎+1); //发送设备地址‎+读信号REG_da‎t a=ADXL34‎5_Recv‎B yte(); //读出寄存器数‎据ADXL34‎5_Send‎A CK(1);ADXL34‎5_Stop‎(); //停止信号return‎REG_da‎t a;}//*********************************************************//连续读出AD‎X L345内‎部加速度数据‎,地址范围0x‎32~0x37//*********************************************************void Multip‎l e_rea‎d_ADXL‎345(void){ uchar i;ADXL34‎5_Star‎t(); //起始信号ADXL34‎5_Send‎B yte(SlaveA‎d dress‎);//发送设备地址‎+写信号ADXL34‎5_Send‎B yte(0x32); //发送存储单元‎地址,从0x32开‎始ADXL34‎5_Star‎t(); //起始信号ADXL34‎5_Send‎B yte(SlaveA‎d dress‎+1); //发送设备地址‎+读信号for (i=0; i<6; i++) //连续读取6个‎地址数据,存储中BUF‎{BUF[i] = ADXL34‎5_Recv‎B yte(); //BUF[0]存储0x32‎地址中的数据‎if (i == 5){ADXL34‎5_Send‎A CK(1); //最后一个数据‎需要回NOA‎CK }else{ADXL34‎5_Send‎A CK(0); //回应ACK}}ADXL34‎5_Stop‎(); //停止信号for(i=2;i>0;i--); //延时5us}//*****************************************************************//初始化ADX‎L345,根据需要请参‎考p df进行‎修改************************void Init_A‎D XL345‎(){Single‎_W rite‎_A DXL3‎45(0x31,0x0B); //测量范围,正负16g,13位模式Single‎_W rite‎_A DXL3‎45(0x2C,0x08); //速率设定为1‎2.5 参考pdf1‎3页Single‎_W rite‎_A DXL3‎45(0x2D,0x08); //选择电源模式‎参考pdf2‎4页Single‎_W rite‎_A DXL3‎45(0x2E,0x80); //使能DA TA_R‎EADY中断Single‎_W rite‎_A DXL3‎45(0x1E,0x00); //X 偏移量根据测试传感‎器的状态写入‎p d f29页‎Single‎_W rite‎_A DXL3‎45(0x1F,0x00); //Y偏移量根据测试传感‎器的状态写入‎p d f29页‎Single‎_W rite‎_A DXL3‎45(0x20,0x05); //Z 偏移量根据测试传感‎器的状态写入‎p d f29页‎}void init_5‎110(){RES=1; //可以没有RES=0;RES=1;DC=0;write_‎b yte(0x21);write_‎b yte(0xc8);write_‎b yte(0x20);write_‎b yte(0x0c);clear_‎5110();}void write_‎b yte(uchar add){uchar i;CE=0;for(i=0;i<8;i++){CLK=0;if(add&0x80)DA TE=1;elseDA TE=0;CLK=1;add<<=1;}CE=1;CLK=0;}void write_‎a dd(uchar x,uchar y) //横纵坐标X 0~83 Y 0~5{write_‎b yte(0x80|x); //横坐标write_‎b yte(0x40|y); //纵坐标}void clear_‎5110(){uint i;write_‎a dd(0,0);DC=1;for(i=0;i<504;i++){write_‎b yte(0x00); //wri te_‎b yte(0);}DC=0;}void write_‎I D(uchar x,uchar y,uchar z){uchar a;uint temp;if(z==1){date=(int)(BUF[1]<<8)+BUF[0];}if(z==2){date=(BUF[3]<<8)+BUF[2]; //}if(z==3){date=(BUF[5]<<8)+BUF[4];}if(date<0) // - 号{a=11;date=-date;}else{a=12;// date=date;}temp=(float)date*3.9; //计算数据和显‎示,查考ADXL‎345快速入‎门第4页// 空白// temp=(float)date*3.9; // 应该可以减少‎两个字节// temp=z;date=temp;/* temp=date;date=date/10;temp=temp*4+date; */// date=temp;write_‎a dd(x,y);DC=1;write_‎A(a);write_‎A(temp/10000);temp=temp%10000;write_‎A(temp/1000); temp=temp%1000;write_‎A(10); // 小数点write_‎A(temp/100);temp=temp%100;write_‎A(temp/10); temp=temp%10;write_‎A(temp);DC=0;temp=date; //确定temp‎值不发生变化‎write_‎a dd(x,y+1);DC=1;write_‎B(a);write_‎B(temp/10000);temp=temp%10000;write_‎B(temp/1000); temp=temp%1000;write_‎B(10); // 小数点write_‎B(temp/100);temp=temp%100;write_‎B(temp/10); temp=temp%10;write_‎B(temp);DC=0;}void write_‎A(uchar date){uchar i,m;m=date*12;for(i=0;i<6;i++){write_‎b yte(shu[m]);m++;}}void write_‎B(uchar date){uchar i,m;m=date*12+6;for(i=0;i<6;i++){write_‎b yte(shu[m]);m++;}}void delaym‎s(uint a){uchar x,y;uint z;for(z=a;z>0;z--)for(x=2;x>0;x--)for(y=226;y>0;y--); }。

ADXL345加速度传感器实现的计步器算法

ADXL345加速度传感器实现的计步器算法

ADXL345加速度传感器实现的计步器算法第一步是初始化传感器。

首先,需要设置传感器的工作模式和测量范围。

通常,计步器使用2g或4g范围来适应不同的运动强度。

然后,设置传感器的数据输出速率,通常选择比较低的速率,例如10Hz。

最后,在传感器上启动测量。

接下来是数据采集和预处理阶段。

传感器将连续采集三个轴上的加速度数据,并将其存储在一个缓冲区中。

采样频率将根据所选择的数据输出速率决定,例如10Hz的输出速率表示每秒采样10次。

预处理阶段可以分为两个步骤:低通滤波和重力加速度消除。

低通滤波可以用于去除高频噪声,并提取出比较平稳的运动分量。

重力加速度消除可以通过将低通滤波后的加速度数据减去1g的加速度(重力加速度)来实现。

这样可以得到只包含运动加速度的数据。

接下来是步数计算阶段。

步数计算通常基于峰值检测算法。

峰值检测算法用于检测加速度数据中的步伐峰值,从而实现步数的计算。

峰值检测算法通常分为两个阶段:步伐检测和步伐计数。

步伐检测阶段通过检测加速度数据的变化来确定是否发生了一步。

其基本原理是检测到连续的加速度上升和下降过程。

步伐计数阶段通过检测步伐检测阶段发出的峰值来计算步数。

当检测到一个峰值时,计数器加1最后,为了提高算法的准确性,还可以进行一些优化措施。

例如,动态阈值的使用可以根据运动强度自适应地调整步伐检测阶段的阈值。

此外,消除跑步和上楼等特殊情况的影响也可以进一步提高算法的准确性。

综上所述,使用ADXL345加速度传感器实现计步器算法可以通过初始化传感器,采集和预处理数据,以及步数计算等步骤来实现。

这种算法可以通过适当的优化来提高计步器的准确性和稳定性。

adxl345技术参数

adxl345技术参数

adxl345技术参数ADXL345技术参数ADXL345是一种小型、低功耗的加速度传感器,广泛应用于移动设备、工业自动化和运动控制等领域。

本文将介绍ADXL345的技术参数,包括传感器的工作范围、分辨率、灵敏度、数据输出等方面。

1. 工作范围ADXL345的工作范围指的是传感器能够测量的加速度范围。

该传感器的工作范围为±2g、±4g、±8g和±16g。

其中,g代表重力加速度,约为9.8m/s²。

用户可以根据具体应用需求选择合适的工作范围。

2. 分辨率ADXL345的分辨率指的是传感器可以测量的最小加速度变化值。

该传感器的分辨率为4mg/LSB,即每个最低有效位(LSB)代表4mg的加速度变化。

分辨率越高,传感器能够捕捉到更小的加速度变化。

3. 灵敏度ADXL345的灵敏度指的是传感器对加速度变化的敏感程度。

传感器的灵敏度与工作范围和分辨率相关。

在±2g工作范围下,灵敏度为1LSB=3.9mg;在±4g工作范围下,灵敏度为1LSB=7.8mg;在±8g工作范围下,灵敏度为1LSB=15.6mg;在±16g工作范围下,灵敏度为1LSB=31.2mg。

用户可以根据具体应用需求选择合适的工作范围和灵敏度。

4. 数据输出ADXL345通过数字接口(如I2C或SPI)输出加速度数据。

传感器可以以全分辨率模式输出数据,也可以以10位或8位分辨率模式输出数据。

在全分辨率模式下,传感器的输出数据为13位,可以表示±16g工作范围内的加速度变化。

用户可以根据处理器的要求选择合适的输出分辨率。

5. 数据格式ADXL345以16位二进制补码表示加速度数据。

对于3轴加速度数据,每个轴的数据占据16位,其中高8位和低8位分别表示数据的整数部分和小数部分。

用户可以通过简单的移位和组合操作将这些数据转换为实际的加速度值。

6. 内部采样率ADXL345具有可调节的内部采样率,可以根据应用需求选择合适的采样率。

ADXL345编程

ADXL345编程

//********ADXL345.C#include <REG51.H>#include <math.h> //Keil library#include <INTRINS.H>#include<dingyi.h>#include<1602.h>#include<Reluctance.h>#include<xianshi.h>void main(){unsigned int i;delay(500);init_com();Init_ADXL345();while(1) //循环{delay(100);Multiple_read_SHEBEI(0xA6,0x32);display_x(); //---------显示X轴display_y(); //---------显示Y轴display_z(); //---------显示Z轴delay(100);}}//***********************xianshi.H//显示x轴void display_x(){ float temp;dis_data=(BUF[1]<<8)+BUF[0]; //合成数据X1=(float)dis_data*3.9/10000;if(dis_data<0){dis_data=-dis_data;DisplayOneChar(10,0,'-'); //显示正负符号位}else DisplayOneChar(10,0,' '); //显示空格temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页conversion(temp); //转换出显示需要的数据DisplayOneChar(8,0,'X'); //第0行,第0列显示XDisplayOneChar(9,0,':');DisplayOneChar(11,0,qian);DisplayOneChar(12,0,'.');DisplayOneChar(13,0,bai);DisplayOneChar(14,0,shi);DisplayOneChar(15,0,'g');}//***********************************************************************//显示y轴void display_y(){ float temp;dis_data=(BUF[3]<<8)+BUF[2]; //合成数据Y1=(float)dis_data*3.9/10000;if(dis_data<0){dis_data=-dis_data;DisplayOneChar(2,1,'-'); //显示正负符号位}else DisplayOneChar(2,1,' '); //显示空格temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页conversion(temp); //转换出显示需要的数据DisplayOneChar(0,1,'Y'); //第1行,第0列显示yDisplayOneChar(1,1,':');DisplayOneChar(3,1,qian);DisplayOneChar(4,1,'.');DisplayOneChar(5,1,bai);DisplayOneChar(6,1,shi);DisplayOneChar(7,1,'g');}//***********************************************************************//显示z轴void display_z(){ float temp;dis_data=(BUF[5]<<8)+BUF[4]; //合成数据Z1=(float)dis_data*3.9/10000;if(dis_data<0){dis_data=-dis_data;DisplayOneChar(10,1,'-'); //显示负符号位}else DisplayOneChar(10,1,' '); //显示空格temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页conversion(temp); //转换出显示需要的数据DisplayOneChar(8,1,'Z'); //第0行,第10列显示Z DisplayOneChar(9,1,':');DisplayOneChar(11,1,qian);DisplayOneChar(12,1,'.');DisplayOneChar(13,1,bai);DisplayOneChar(14,1,shi);DisplayOneChar(15,1,'g');}/*void display(int k,uchar i,uchar m){if(k<0){k=-k;DisplayOneChar(i,m,'-'); //显示负符号位}else DisplayOneChar(i,m,' '); //显示空格conversion(k); //转换出显示需要的数据DisplayOneChar(i+1,m,qian);DisplayOneChar(i+2,m,'.');DisplayOneChar(i+3,m,bai);DisplayOneChar(i+4,m,shi);} *///*********************************************Reluctance.h***** void IIC_Start(){SDA = 1; //拉高数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 0; //产生下降沿Delay5us(); //延时SCL = 0; //拉低时钟线}/**************************************停止信号**************************************/void IIC_Stop(){SDA = 0; //拉低数据线SCL = 1; //拉高时钟线SDA = 1; //产生上升沿Delay5us(); //延时}/**************************************发送应答信号入口参数:ack (0:ACK 1:NAK)**************************************/void SHEBEI_SendACK(bit ack){SDA = ack; //写应答信号SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}/**************************************接收应答信号**************************************/bit SHEBEI_RecvACK(){SCL = 1; //拉高时钟线Delay5us(); //延时CY = SDA; //读应答信号SCL = 0; //拉低时钟线Delay5us(); //延时return CY;}/**************************************向IIC总线发送一个字节数据**************************************/void SHEBEI_SendByte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线SCL = 0; //拉低时钟线Delay5us(); //延时}SHEBEI_RecvACK();}/**************************************从IIC总线接收一个字节数据**************************************/BYTE SHEBEI_RecvByte(){BYTE i;BYTE dat = 0;SDA = 1; //使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线Delay5us(); //延时dat |= SDA; //读数据SCL = 0; //拉低时钟线Delay5us(); //延时}return dat;}//***************************************************void Single_Write_SHEBEI(uchar SlaveAddress,uchar REG_Address,uchar REG_data){IIC_Start(); //起始信号SHEBEI_SendByte(SlaveAddress); //发送设备地址+写信号SHEBEI_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf SHEBEI_SendByte(REG_data); //内部寄存器数据,请参考中文pdf IIC_Stop(); //发送停止信号}////******************************************************void Multiple_read_SHEBEI(uchar SlaveAddress,uchar address){ uchar i;IIC_Start(); //起始信号SHEBEI_SendByte(SlaveAddress); //发送设备地址+写信号SHEBEI_SendByte(address); //发送存储单元地址,从0x32开始IIC_Start(); //起始信号SHEBEI_SendByte(SlaveAddress+1); //发送设备地址+读信号for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF{BUF[i] = SHEBEI_RecvByte(); //BUF[0]存储0x32地址中的数据if (i == 5){SHEBEI_SendACK(1); //最后一个数据需要回NOACK}else{SHEBEI_SendACK(0); //回应ACK}}IIC_Stop(); //停止信号Delay5ms();}void Init_ADXL345(){Single_Write_SHEBEI(0xA6,0x31,0x0B); //测量范围,正负16g,13位模式Single_Write_SHEBEI(0xA6,0x2C,0x08); //速率设定为12.5 参考pdf13页Single_Write_SHEBEI(0xA6,0x2D,0x08); //选择电源模式参考pdf24页Single_Write_SHEBEI(0xA6,0x2E,0x80); //使能DATA_READY 中断Single_Write_SHEBEI(0xA6,0x1E,0x00); //X 偏移量根据测试传感器的状态写入pdf29页Single_Write_SHEBEI(0xA6,0x1F,0x00); //Y 偏移量根据测试传感器的状态写入pdf29页Single_Write_SHEBEI(0xA6,0x20,0x05); //Z 偏移量根据测试传感器的状态写入pdf29页}//*****************************dingyi.h#define uchar unsigned char#define uint unsigned int#define DataPort P0 //LCD1602数据端口sbit SCL=P1^0; //IIC时钟引脚定义sbit SDA=P1^1; //IIC数据引脚定义sbit RS=P2^0; //LCD1602命令端口sbit RW=P2^1; //LCD1602命令端口sbit E=P2^2; //LCD1602命令端口//#define SlaveAddress 0x3C //定义器件在IIC总线中的从地址//uchar SlaveAddress;typedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF[8]; //接收数据缓存区uchar ge,shi,bai,qian,wan; //显示变量int dis_data;float X1;float Y1;float Z1;int x;int y;int z;int Hx;int Hy;//*************************************************************************************** **************void delay(unsigned int k){unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<121;j++){;}}}void Delay5us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}void Delay5ms(){WORD n = 560;while (n--);}//************************************************************************************************ void conversion(uint temp_data){wan=temp_data/10000+0x30 ;temp_data=temp_data%10000; //取余运算qian=temp_data/1000+0x30 ;temp_data=temp_data%1000; //取余运算bai=temp_data/100+0x30 ;temp_data=temp_data%100; //取余运算shi=temp_data/10+0x30 ;temp_data=temp_data%10; //取余运算ge=temp_data+0x30;}//***********************1602.hvoid write_commend(uchar com){P0=com;RS=0;E=1;delay(2);E=0;}void write_data(uchar dat){P0=dat;RS=1;E=1;delay(2);E=0;}void write_string(uchar x,uchar y,uchar *s){if (y == 0){write_commend(0x80 + x); //表示第一行}else{write_commend(0xC0 + x); //表示第二行}while (*s){write_data( *s);s ++;}}void DisplayOneChar(uchar X,uchar Y,uchar DData) {Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;write_commend(X);write_data(DData);}void init_com(){RW =0;delay(10);write_commend(0x02);delay(10);write_commend(0x38);delay(10);write_commend(0x38);delay(10);write_commend(0x38);write_commend(0x0c);write_commend(0x06);write_commend(0x01);write_commend(0x01);}以前玩过,手头没模块没测试。

ADXL345角度传感器测二维角度Keil C程序

ADXL345角度传感器测二维角度Keil C程序

程序说明:该程序中有两个C文件,均为同一Keil或TKstudio 工程下的C源文件,分别为ADXL345_main和ADXL345_LCD,此程序在Keil uVision2或TKstudio version4.5编译环境下均可正常运行,"ADXL345" - 0 Error(s), 0 Warning(s).项目说明:采用全集成的三轴加速度传感器ADXL345进行二维倾角的测量,用1602液晶(LCD省去了测忙函数)显示角度值,其值精确到小数点后两位。

ADXL345_main.c文件:/**********************头文件*************************/#include <reg51.h>#include <math.h>#include <intrins.h>/***********************宏定义***********************/#define uchar unsigned char#define uint unsigned int/**********************位定义************************/sbit CS = P2^1; // 片选信号端sbit SCLK = P3^1; // 时钟sbit SDI = P3^0; // 数据读/写/***********************函数声明**********************///void write_comd(uchar);//void write_data_LCD(uchar);void LCD_init(); // LCD 初始化void display_LCD(); // LCD显示void calculate(); // ASCII码计算/***********************全局变量**********************/uint Data_X_2[2]; // 读出的数据储存X Y Zuint Data_Y_2[2];uint Data_Z_2[2];int Data_X,Data_Y,Data_Z; // 数值转换后的值float XX,YY,ZZ; // 3轴的重力加速度分量uchar ID; // 机器ID值用于看读的是否对(调试时用)float roll,pitch;/********************************************************************* ** 函数名:Delayms()** 功能描述:产生延迟** 形参:ms 延迟的时间,单位ms * * 返回值:无** 局部变量:i ** 全局变量:无** 函数调用:无** *********************************************************************/ void delay_ms(uchar ms){uchar i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_(); //空执行消耗CPU时间达到等待的效果_nop_();_nop_();}}}/********************************************************************* ** 函数名:Write_Data(uchar Data_write) ** 功能描述:写指令到寄存器** 形参:Data_write 要写的数据8位** 返回值:无** 局部变量:i ** 全局变量:无** 函数调用:_nop_(); ** *********************************************************************//*************************写数据函数*******************/void Write_Data(uchar Adress_Reg,uchar Data_write){uchar i=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(uchar Adress_Reg) ** 功能描述:往寄存器读数据* * 形参:Adress_Reg 寄存器地址** 返回值:Data_Read 读取的数据** 局部变量:i Data_Read 读取的数据* * 全局变量:无* * 函数调用:_nop_(); * * * ********************************************************************/ uchar Read_Data_Reg(uchar Adress_Reg){uchar i=0;uchar Data_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;return Data_Read;}/********************************************************************* ** 函数名:Read_Data() ** 功能描述:读出6字节X Y Z 轴各两字节的数据** 形参:无** 返回值:无** 局部变量:无** 全局变量:Data_X_2[2] Data_Y_2[2] Data_Z_2[2] 存放读出值** 函数调用:Read_Data_Reg(__);delay_ms(__); ** *********************************************************************/void Read_Data(){/*DATAX0是X轴加速度的低字节寄存器,DA TAX1是高字节寄存器*/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(__,__); ** *********************************************************************/void ADXL345_init(){Write_Data(0x31,0x4f); //测量范围为正负16g 13位模式3线SPI 中断低有效禁用自测力左对齐(MSB)模式delay_ms(10);Write_Data(0x2C,0x08); //速率设定为25HZ,带宽12.5HZdelay_ms(10);Write_Data(0x2D,0x08); //选择电源模式delay_ms(10);Write_Data(0x2E,0x80); //使能DA TA_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 整合后的X Y Z 轴值* * 函数调用:无* * * ********************************************************************//*从数据寄存器中获取加速度数据后,用户必须对数据进行重建*//***************************数值转换***********************/void transform(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(float V_x,float V_y,float V_z) ** 功能描述:计算横滚角和俯仰角* * 形参:G_x G_x G_z X Y Z轴的加速度值* * 返回值:无* * 局部变量:无* * 全局变量:roll pitch 横滚角和俯仰角** 函数调用:atan2(_,_); ** * ********************************************************************//*********计算角度函数***************/void calculate_angle(float G_x,float G_y,float G_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;}/*************************主函数***************************/void main(void){delay_ms(5); //上电延时ADXL345_init(); // ADXL345的初始化LCD_init(); // LCD的初始化ID=Read_Data_Reg(0x00); // 读出机器ID值,DEVID寄存器保存0xE5的固定器件ID 代码while(1){Read_Data(); //读出X Y Z 轴加速度值transform(); //数据重建过程calculate_angle(XX,YY,ZZ); //计算x和y轴相对于水平面的倾角calculate(); // ASCII码计算display_LCD(); // 显示}}ADXL345_LCD.c文件:#include <reg51.h> //51寄存器文件#include <intrins.h>/***********************宏定义***********************/#define uchar unsigned char#define uint unsigned int/**********************位定义及变量声明************************/sbit LCDEN=P3^4;sbit RS=P3^5;sbit DULA=P2^6;sbit WEILA=P2^7;extern uchar ID;extern float roll,pitch;uchar dis1[16] = {"X+00.00 Y+00.00"};uchar dis2[16] = {"ID:000"};/*******************计算函数********************/void calculate(){//uchar flag_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]='.';dis1[5]=(int)roll%10000%1000%100/10+48;dis1[6]=(int)roll%10000%1000%100%10+48;dis1[9]='Y';//dis1[10]=flag_Y;dis1[11]=(int)pitch%10000/1000+48;dis1[12]=(int)pitch%1000/100+48;dis1[13]='.';dis1[14]=(int)pitch%1000%100/10+48;dis1[15]=(int)pitch%1000%100%10+48;dis2[0]='I';dis2[1]='D';dis2[2]=':';dis2[3]=ID/100+48;dis2[4]=ID%100/10+48;dis2[5]=ID%100%10+48;}/*******************延时函数********************/ void delay(uint k){uint j,i;for(j=k;j>0;j--)for(i=100;i>0;i--);}/*******************液晶显示相关函数********************/void write_comd(uchar com){RS=0;//数据/命令选择端P0=com;delay(1);//数据建立时间LCDEN=1;delay(5);LCDEN=0;}void write_data_LCD(uchar datas){RS=1;//数据/命令选择端P0=datas;delay(1);//数据建立时间LCDEN=1;delay(5);LCDEN=0;}void LCD_init(){DULA=0;WEILA=0;LCDEN=0;write_comd(0x38);//显示模式设置write_comd(0x0c);//开显示,不显示光标write_comd(0x06);//写一个字符后,地址指针加1且光标加1;整屏显示不移动write_comd(0x01);//显示清屏}void display_LCD(){uint i,j;write_comd(0x80);//初始化数据指针,写在第一行for(i=0;i<16;i++){write_data_LCD(dis1[i]);delay(1);}write_comd(0x80+0x40);//将数据指针移动到第二行第4字符处开始显示for(j=0;j<6;j++){write_data_LCD(dis2[j]);delay(1);}}。

三轴数字加速度传感器ADXL345技术资料(最新整理)

三轴数字加速度传感器ADXL345技术资料(最新整理)

} 因为 ADXL335 输出的是模拟电压值,所以我们编写程序的时候只要采集输出电压就可以
了,当然要做一些工程项目,准确地测出具体数字的话还需要看一看相关的数据手册进行一 些编写。
下载完程序以后,我们打开串口调试窗口,可以看到窗口上显示我们测试到的数据。当 加速度改变的时候,相应的数字也会发生变化
writeRegister(POWER_CTL, 0x08); } void loop(){ readRegister(DATAX0, 6, values); x = ((int)values[1]<<8)|(int)values[0]; y = ((int)values[3]<<8)|(int)values[2]; z = ((int)values[5]<<8)|(int)values[4]; Serial.print(x, DEC); Serial.print(','); Serial.print(y, DEC); Serial.print(','); Serial.println(z, DEC); delay(10); } void writeRegister(char registerAddress, char value){ digitalWrite(CS, LOW); SPI.transfer(registerAddress); SPI.transfer(value); digitalWrite(CS, HIGH);
pinMode(a1,INPUT); pinMode(a2,INPUT); pinMode(a3,INPUT); Serial.begin(9600); } void loop() { x = analogRead(a1); y = analogRead(a2); z = analogRead(a3); Serial.print("x: "); Serial.print(x, DEC); Serial.print(" "); Serial.print("y: "); Serial.print(y, DEC); Serial.print(" "); Serial.print("z: "); Serial.println(z, DEC); delay(100);

adxl345传感器计步器单片机程序

adxl345传感器计步器单片机程序

adxl345传感器计步器单片机程序#include<reg52.h>#include<math.h>#define uchar unsigned char#define uint unsigned int#include <INTRINS.H>#define SlaveAddress 0xA6 //1010 0110 定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改sbit rs=P2^0;sbit rw=P2^1;sbit en=P2^2; //ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A 0011 1010sbit sclk=P1^2;sbit sda=P1^3;sbit stop=P3^2;uchar BUF[8]; //ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A 0011 1010float dis_datax,dis_datay,dis_dataz,acc,acc1=1000;uchar wan,qian,bai,shi ,ge,flag,miao,miao1,n,g,s,b;uint count,count_hou,cishu,v,a;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) {rs=0;P0=com;delay(5);en=1;delay(5);en=0;}void write_dat(uchar dat) {rs=1;P0=dat;delay(1);en=1;delay(5);en=0;}void init(){rw=0;en=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);// write_com(0x80+0x10);}void conversion(uint temp_data){wan=temp_data/10000+0x30 ;temp_data=temp_data%10000; //取余运算qian=temp_data/1000+0x30 ;temp_data=temp_data%1000; //取余运算bai=temp_data/100+0x30 ;temp_data=temp_data%100; //取余运算 -e----------------eee-eshi=temp_data/10+0x30 ;temp_data=temp_data%10; //取余运算ge=temp_data+0x30;}void delay6us() //6us延时函数{_nop_(); _nop_();}void delay_ms(uint n) //N ms延时函数{uint x,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}/////void ADXL345_Start(){sda = 1; //拉高数据线sclk = 1; //拉高时钟线delay6us(); //延时sda = 0; //产生下降沿delay6us(); //延时sclk = 0; //拉低时钟线}void ADXL345_Stop(){sda = 0; //拉低数据线sclk = 1; //拉高时钟线delay6us(); //延时sda = 1; //产生上升沿delay6us(); //延时}void ADXL345_SendACK(bit ack) {sda = ack; //写应答信号sclk = 1; //拉高时钟线delay6us(); //延时sclk = 0; //拉低时钟线delay6us(); //延时}bit ADXL345_RecvACK(){sclk = 1; //拉高时钟线delay6us(); //延时CY = sda; //读应答信号sclk = 0; //拉低时钟线delay6us(); //延时return CY;}void ADXL345_SendByte(uchar dat) {uchar i;// sclk = 0; //拉低时钟线for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位sda = CY; //送数据口sclk = 1; //拉高时钟线delay6us(); //延时sclk = 0; //拉低时钟线delay6us(); //延时}ADXL345_RecvACK();}uchar ADXL345_RecvByte(){uchar i;uchar dat = 0;sda = 1;// write_com(0x80);//使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1;sclk = 1; //拉高时钟线delay6us(); //延时dat |= sda; //读数据sclk = 0; //拉低时钟线delay6us(); //延时}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;}void Multiple_read_ADXL345(){uchar i;ADXL345_Start(); //起始信号ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号 1010 0110ADXL345_SendByte(0x32); //发送存储单元地址,从0x32开始 0011 0010ADXL345_Start(); //起始信号ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号 1010 0111for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF{BUF[i] = ADXL345_RecvByte(); //BUF[0]存储0x32地址中的数据if(i == 5) ADXL345_SendACK(1); //最后一个数据需要回NOACKelse ADXL345_SendACK(0); //回应ACK}ADXL345_Stop(); //停止信号delay_ms(10);}void Init_ADXL345() //初始化ADXL345,根据需要请参考pdf进行修改***********************{// delay(500); //上电延时Single_Write_ADXL345(0x31,0x2B); //测量范围,正负16g,13位模式Single_Write_ADXL345(0x2C,0x06); //0000 0110速率设定为6.25 参考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页}float operation(uchar starti){float dis_data ;int temp;temp=(BUF[starti+1]<<8)+BUF[starti]; //合成数据// write_com(0x80);if(temp<0){temp=-temp;flag=1;}else flag=0; //显示空格dis_data=(float)temp*3.9; //计算数据和显示,查考ADXL345快速入门第4页return dis_data;}void display_x() //显示x轴{conversion(dis_datax); //转换出显示需要的数据write_com(0x80);if(flag==0) write_dat(' ');else write_dat('-');write_dat('X');write_dat(':');write_dat(qian);write_dat('.');write_dat(bai);write_dat(shi);write_dat('g');write_dat(' ');write_dat('v');write_dat(':');write_dat(v/100+0x30);write_dat((v%100)/10+0x30);write_dat(v%10+0x30);}void display_y() //显示y轴{// dis_datay=operation(2);conversion(dis_datay); //转换出显示需要的数据write_com(0x80+8);if(flag==0) write_dat(' ');else write_dat('-');write_dat('Y');write_dat(':');write_dat(qian);write_dat('.');write_dat(bai);write_dat(shi);write_dat('g');write_dat(' ');write_dat('v');write_dat(':');write_dat(v/100+0x30);write_dat((v%100)/10+0x30);write_dat(v%10+0x30);}void display_z() //显示z轴{// dis_dataz=operation(4);conversion(dis_dataz); //转换出显示需要的数据write_com(0x80+0x40);if(flag==0) write_dat(' ');else write_dat('-');write_dat('Z');write_dat(':');write_dat(qian);write_dat('.');write_dat(bai);write_dat(shi);write_dat('g');///gai guowrite_dat(' ');write_dat('v');write_dat(':');write_dat(v/100+0x30);write_dat((v%100)/10+0x30);write_dat(v%10+0x30);}void countstep(){dis_datax=operation(0);dis_datay=operation(2);dis_dataz=operation(4);acc1=acc;acc=sqrt(dis_dataz*dis_dataz+dis_datax*dis_datax+dis_data y*dis_datay) ;if(acc1<990&&acc>1010)// if(fabs(acc-acc1)>140&&miao1!=miao){//if(stop=0)// miao1=miao;count++;}write_com(0x80);conversion(acc);write_dat('A');write_dat(':');write_dat(qian);write_dat('.');write_dat(bai);write_dat(shi);write_dat('g');write_dat(' ');write_dat('v');write_dat(':');write_dat(v/100+0x30);write_dat((v%100)/10+0x30);write_dat(v%10+0x30);write_com(0x80+0x40);write_dat('C');write_dat('o');write_dat('u');write_dat('n');write_dat('t');write_dat(':');write_dat(count_hou/100+0x30);write_dat((count_hou%100)/10+0x30);write_dat(count_hou%10+0x30);}void ADXL345_Measure() //测量角度值并显示{Multiple_read_ADXL345(); //连续读出数据,存储在BUF中countstep();}void main(){unsigned int j,k=1;stop=1;init();TMOD=0X01; //设置定时器0为模式一,即16位计算模式TH0 =(65536-50000)/256;TL0 =(65536-50000)%256;EA=1; //开启总中断ET0=1; //开启定时器0中断TR0=1; //启动定时器0write_com(0x80);write_dat('O');write_dat('N');delay(1500);Init_ADXL345();while(1){if(stop==0) //检测按键K1是否按下{delay(10);//消除抖动if(stop==0){while(k==1){count_hou=j;write_com(0x80);conversion(acc);write_dat('s');write_dat('t');write_dat('o');write_dat('p');write_dat('!');write_dat(' ');write_dat(' ');write_dat(' ');write_dat('v');write_dat(':');write_dat(v/100+0x30);write_dat((v%100)/10+0x30);write_dat(v%10+0x30);EA=0;delay(1000);delay(100);if(stop==0){Init_ADXL345();count=0;k=0;EA=1;}}}count_hou=count;ADXL345_Measure();}}void timeinit(){TMOD=0X01; //设置定时器0为模式一,即16位计算模式TH0 =(65536-50000)/256;TL0 =(65536-50000)%256;EA=1; //开启总中断ET0=1; //开启定时器0中断TR0=1; //启动定时器0}void time0(void) interrupt 1{TH0 =(65536-50000)/256;TL0 =(65536-50000)%256;cishu++;if(cishu>=100){cishu=0;v=(count-a)*12;a=count;}}。

ADXL345角度传感器C代码

ADXL345角度传感器C代码

ADXL345角度传感器C代码#include "ADXL345.h"/************************************************************** ******函数功能:往I2C从器件写数据(1Byte)入口参数:Addr 地址,dat 数据返回:无。

备注:无。

*************************************************************** *****/void ADXL345_Write(uint8 Addr,uint8 dat){uint8 Addr_data,Wr_data;Addr_data=Addr;Wr_data=dat;I2C_Start();//启动I2C总线I2C_SendByte(ADXL345_SLAVE_ADDRESS|ADXL345_WRITE_ BIT);//发送从机地址+写位if(ack)ack=0;//else 器件无应答,可能是器件没连接好I2C_SendByte(Addr_data);//发送寄存器地址if(ack)ack=0;I2C_SendByte(Wr_data);//发送数据if(ack)ack=0;I2C_Stop();//结束I2C总线}////////////////////////End of function///////////////////////////////************************************************************** ******函数功能:I2C从器件读取数据入口参数:Addr 从机寄存器地址返回:读取的数据备注:无。

*************************************************************** *****//*uint8 ADXL345_Read(uint8 Addr){uint8 Addr_data,IIC_data;Addr_data=Addr;I2C_Start();//启动I2C总线I2C_SendByte(ADXL345_SLAVE_ADDRESS|ADXL345_WRITE_ BIT);//发送从机地址+写位if(ack)ack=0;I2C_SendByte(Addr_data);//发送寄存器地址if(ack)ack=0;I2C_Start();//重新启动I2C总线I2C_SendByte(ADXL345_SLAVE_ADDRESS|ADXL345_READ_B IT);if(ack)ack=0;IIC_data=I2C_RcvByte();//读取数据I2C_Ack(1);//不应答I2C_Stop();//结束I2C总线return IIC_data;}*/////////////////////////End of function///////////////////////////////************************************************************** ******函数功能:连续读取多个字节入口参数:寄存器首地址,字节长度返回:无。

角度传感器ADXL345程序代码(AVR)

角度传感器ADXL345程序代码(AVR)

/************************************************************ 角度传感器ADXL345程序代码************** **************************************************/#include <iom8v.h>#include <macros.h>#include <math.h>#include <stdio.h>typedef unsigned char uchar;typedef unsigned int uint;/*LCD引脚定义*/#define CS_set PORTD |=BIT(6)#define CS_clr PORTD &=~BIT(6)#define SID_set PORTD |=BIT(7)#define SID_clr PORTD &=~BIT(7)#define SCLK_set PORTB |=BIT(0)#define SCLK_clr PORTB &=~BIT(0)/*ADXL345角度传感器端口定义*/#define SDA_set PORTC |=(1<<4)#define SDA_clr PORTC &=~(1<<4)#define SDA_in DDRC &=~(1<<4)#define SDA_out DDRC |=(1<<4)#define SDA_R PINC & (1<<4)#define SCL_set PORTC |=(1<<5)#define SCL_clr PORTC &=~(1<<5)#define SCL_out DDRC |=(1<<5)#define SlaveAddress 0xA6 //器件地址uchar Re_data[6];int Dis_data;float Temp_x,Temp_y,Temp_z;float Angle;/*延时*/void Delay(uint t){while(t--){}}/*LCD12232端口初始化*/ void PORT_Init(void){DDRD |=BIT(6);PORTD |=BIT(6);DDRD |=BIT(7);PORTD |=BIT(7);DDRB |=BIT(0);PORTB |=BIT(0);}/*LCD12232写指令*/void Send_COM(uchar COM) {uchar i,Order;CS_clr;Order=0xf8;SCLK_clr;CS_set;for(i=0;i<8;i++){if(Order&0x80)SID_set;elseSID_clr;SCLK_clr;SCLK_set;Order<<=1;}Order=COM;Order &=0xf0;for(i=0;i<8;i++){if(Order&0x80)SID_set;elseSID_clr;SCLK_clr;SCLK_set;Order<<=1;}Order=COM;Order<<=4;for(i=0;i<8;i++){if(Order&0x80)SID_set;elseSID_clr;SCLK_clr;SCLK_clr;SCLK_set;Order<<=1;}CS_clr;Delay(20);}/*LCD12232写数据*/void Send_DATA(uchar Data) {uchar i,Order;CS_clr;Order=0xfa;SCLK_clr;CS_set;for(i=0;i<8;i++){if(Order&0x80)SID_set;elseSID_clr;SCLK_clr;SCLK_set;Order<<=1;}Order=Data;Order &=0xf0;for(i=0;i<8;i++){if(Order&0x80)SID_set;elseSID_clr;SCLK_clr;SCLK_set;Order<<=1;}Order=Data;Order<<=4;for(i=0;i<8;i++){if(Order&0x80)SID_set;elseSID_clr;SCLK_clr;SCLK_set;Order<<=1;}CS_clr;Delay(20);}/*显示一字符串*/void Dis_str(uchar Addr,uchar *str) {Send_COM(Addr);Delay(100);while(*str!='\0'){Send_DATA(*str);str++;Delay(20);}}/*LCD12232初始化*/void Init_LCD(void){Delay(2000);Send_COM(0x06);Delay(200);Send_COM(0x02);Delay(200);Send_COM(0x0c);Delay(200);Send_COM(0x80);Delay(200);Send_COM(0x30);Delay(200);Send_COM(0x01);Delay(2000);}/*写引脚设置*/void PORT_Write_Init(void){DDRC |=BIT(4);PORTC |=BIT(4);DDRC |=BIT(5);PORTC |=BIT(5);}/*读引脚设置*/void PORT_Read_Init(void){DDRC &=~BIT(4);PORTC |=BIT(4);DDRC &=~BIT(5);PORTC |=BIT(5);}/*************************************************** **************************************************** ********** ADXL345角度传感器函数部分*************** **************************************************** ****************************************************/ /*起始信号*/void IIC_Start(void){SDA_out;SDA_set;SCL_set;Delay(30);SDA_clr;Delay(30);SCL_clr;}/*停止信号*/void IIC_Stop(void){SDA_out;SDA_clr;SCL_set;Delay(30);SDA_set;Delay(30);}/*发送应答信号*/void IIC_Send_Ack(void){SDA_out;SDA_clr;SCL_set;Delay(30);SCL_clr;Delay(30);}/*发送非应答信号*/void IIC_Send_NoAck(void) {SDA_out;SDA_set;SCL_set;Delay(30);SCL_clr;Delay(30);}/*接收应答信号*/uchar IIC_Recv_Ack(void) {uchar i;SDA_in;SCL_set;Delay(30);i=SDA_R;SCL_clr;Delay(30);return i ? 1:0;}/*IIC总线发送一个字节数据*/ void IIC_Send_Byte(uchar data) {uchar i;SDA_out;for(i=0;i<8;i++){if(data&0x80)SDA_set;elseSDA_clr;SCL_set;Delay(30);SCL_clr;Delay(30);data<<=1;}IIC_Recv_Ack();}/*IIC总线接收一个字节数据*/uchar IIC_Recv_Byte(void){uchar i;uchar value=0;SDA_in;SDA_set;for(i=0;i<8;i++){value<<=1;SCL_set;Delay(30);if(SDA_R)value |=0x01;SCL_clr;Delay(30);}return value;}/*向ADXL345写入一个字节*/void ADX345_Write_Byte(uchar Addr,uchar Data) {IIC_Start();IIC_Send_Byte(SlaveAddress);IIC_Send_Byte(Addr);IIC_Send_Byte(Data);IIC_Stop();}/*向ADXL345读出一个字节*/uchar ADX345_Read_Byte(uchar Add){uchar Result;IIC_Start();IIC_Send_Byte(SlaveAddress);IIC_Send_Byte(Add);IIC_Start();IIC_Send_Byte(SlaveAddress+1);Result=IIC_Recv_Byte();IIC_Send_NoAck();IIC_Stop();return Result;}/*连续读出ADXL345内部加速度数据,地址范围0x32~0x37*/ void Multiple_Read_ADX345(void){uchar i;IIC_Start();IIC_Send_Byte(SlaveAddress);IIC_Send_Byte(0x32);IIC_Start();IIC_Send_Byte(SlaveAddress+1);for(i=0;i<6;i++){Re_data[i]=IIC_Recv_Byte();if(i==5)IIC_Send_NoAck();elseIIC_Send_Ack();}IIC_Stop();Delay(100);}/*ADXL345初始化*/void Init_ADX345(void){ADX345_Write_Byte(0x31,0x0b);ADX345_Write_Byte(0x2c,0x08);ADX345_Write_Byte(0x2d,0x08);ADX345_Write_Byte(0x2e,0x80);ADX345_Write_Byte(0x1e,0x00);ADX345_Write_Byte(0x1f,0x00);ADX345_Write_Byte(0x20,0x05);}/*X轴*/void Display_X(void){float Temp;Dis_data=(Re_data[1]<<8)+Re_data[0];Send_COM(0x81);if(Dis_data<0){Dis_data=-Dis_data;Send_DATA('-');}else{Send_DATA('+');}Temp=(float)Dis_data*3.9;Temp_x=Temp;}/*Y轴*/void Display_Y(void){float Temp;Dis_data=(Re_data[3]<<8)+Re_data[2];Send_COM(0x84);if(Dis_data<0){Dis_data=-Dis_data;Send_DATA('-');}else{Send_DATA('+');}Temp=(float)Dis_data*3.9;Temp_y=Temp;}/*Z轴*/void Display_Z(void){float Temp;Dis_data=(Re_data[5]<<8)+Re_data[4];Send_COM(0x91);if(Dis_data<0){Dis_data=-Dis_data;Send_DATA('-');}else{Send_DATA('+');}Temp=(float)Dis_data*3.9;Temp_z=Temp;}/*显示X、Y、Z轴*/void Display(uchar C){float a,b,Tem;uchar Abai,Ashi,Age,AG;switch(C){case 0 : a=Temp_y*Temp_y+Temp_z*Temp_z; //X轴Tem=Temp_x;break;case 1 : a=Temp_x*Temp_x+Temp_z*Temp_z; //Y轴Tem=Temp_y;break;case 2 : a=Temp_x*Temp_x+Temp_y*Temp_y; //Z轴Tem=Temp_z;break;default : break;}b=sqrt(a);Angle=atan(b/Tem)*57.29;// 180/3.1416=57.29AG=(uchar)Angle;Abai=(unsigned char)AG/100+0x30;Ashi=(unsigned char)AG%100/10+0x30;Age=(unsigned char)AG%10+0x30;switch(C){case 0 : Send_COM(0x82); break;case 1 : Send_COM(0x85); break;case 2 : Send_COM(0x92); break;default : break;}Send_DATA(Abai);Send_DATA(Ashi);Send_DATA(Age);}/*主程序*/void main(void){uchar Devid;Delay(50000);SDA_out;SCL_out;PORT_Init();//LCD引脚初始化Init_LCD(); //液晶初始化//Dis_str(0x80,"ADXL345:");Init_ADX345();//初始化ADXL345Devid=ADX345_Read_Byte(0x00);//读出的数据为0xe5,表示正确do{Multiple_Read_ADX345();//连续读出数据,存储在BUF中Display_X();Display_Y();Display_Z();Delay(60000);Display(0); //---------显示X轴Delay(60000);Display(1); //---------显示Y轴Delay(60000);Display(2); //---------显示Z轴Delay(60000);}while(1);}精美文档11。

基于加速度传感器ADXL345的计步器设计

基于加速度传感器ADXL345的计步器设计

基于加速度传感器ADXL345的计步器设计加速度传感器ADXL345是一种常见的三轴加速度传感器,具有高精度、低功耗和小尺寸等优点,广泛应用于计步器等移动设备中。

本文将详细介绍基于ADXL345的计步器设计。

首先,计步器的原理是通过检测人体行走时脚部的振动来判断步数。

加速度传感器可以检测出人体行走时脚部的振动,并将其转换为电信号。

因此,加速度传感器是计步器设计中必不可少的部件。

在ADXL345的设计中,首先需要进行传感器的连接和初始化设置。

一般情况下,ADXL345通过I2C接口与微控制器连接。

通过初始化配置,设置传感器的工作模式、测量范围和输出数据速率等参数。

接下来是计步算法的设计。

计步算法是计步器的核心部分,它通过分析加速度信号来判断人体的行走状态。

常见的计步算法有峰值检测法、阈值检测法和积分法等。

峰值检测法是最简单和常用的计步算法。

该算法基于人体行走时每一步的特征,当加速度信号超过一定阈值时,即判断为一步。

该方法的优点是简单易懂,但对传感器的灵敏度要求较高,容易受到噪声等干扰。

阈值检测法是一种改进的计步算法,它引入了动态阈值的概念。

通过分析加速度信号的波形特征,可以得出行走时的阈值。

通过动态调整阈值,可以提高计步的准确性。

积分法是一种更精确的计步算法。

该方法通过对加速度信号进行积分,得到速度和位移信号。

然后通过分析速度和位移信号的特征,判断人体的行走状态。

该方法的优点是准确性高,但需要进行复杂的信号处理和运算。

除了计步算法的设计,还需要设计界面和用户交互功能。

计步器的界面通常包括步数显示、消耗卡路里显示、运动距离显示等。

用户可以通过按键进行功能选择和设置。

在硬件设计方面,需要根据实际需求选择适当的微控制器和其他外围电路。

同时,还需要考虑电源管理和电路保护等问题,确保计步器的稳定性和可靠性。

最后,完成计步器的软件设计和调试。

根据计步算法的选择,编写相应的程序进行数据采集和处理。

通过数据的实时显示和对比,可以判断计步算法的准确性和稳定性。

adxl345角度测量文档

adxl345角度测量文档

附:ADXL345角度测量和LCD12864液晶显示程序AT89S52单片机+11.0592M晶振STC12C5A60S2单片机+12M晶振两种型号单片机本人均亲自测试,绝对能用声明:驱动程序主要是借用别人的,因为网上很多类似的都不能用,本人只是把多个版本稍加整合ADXL345部分#include<reg52.h> #include"LCD12864.h" #include "math.h" #include "stdio.h" #define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改//ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A sbit SCL=P1^0; //IIC时钟引脚定义sbit SDA=P1^1; //IIC数据引脚定义unsigned char BUF[8]; //接收数据缓存区/******************************延时函数1***************************/ void delay(unsigned int k) { unsigned int i,j; for(i=0;i<k;i++) { for(j=0;j<121;j++) {;} } } /******************************延时函数2****************************/ void Delay5us() { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } /*******************************延时5毫秒**************************/ void Delay5ms() { unsigned short n = 560; while (n--); } /******************************起始信号***************************/ 文档冲亿季,好礼乐相随mini ipad移动硬盘拍立得百度书包void ADXL345_Start() { SDA = 1; //拉高数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 0; //产生下降沿Delay5us(); //延时SCL = 0; //拉低时钟线} /******************************停止信号***************************/ void ADXL345_Stop() { SDA = 0; //拉低数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 1; //产生上升沿Delay5us(); //延时} /******************************发送应答信号***********************/ 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(unsigned char dat) { unsigned char i; for (i=0; i<8; i++) //8位计数器{ dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时} ADXL345_RecvACK(); } /************************从IIC总线接收一个字节数据*****************/ unsigned char ADXL345_RecvByte() { unsigned char i; unsigned char dat = 0; SDA = 1; //使能内部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器{ dat <<= 1; SCL = 1; //拉高时钟线Delay5us(); //延时dat |= SDA; //读数据SCL = 0; //拉低时钟线Delay5us(); //延时}return dat; } /************************************单字节写入**********************/ void Single_Write_ADXL345(unsigned char REG_Address,unsigned char REG_data) { ADXL345_Start(); //起始信号ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号ADXL345_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页ADXL345_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页ADXL345_Stop(); //发送停止信号} /*************************************单字节读取************************/ unsigned char Single_Read_ADXL345(unsigned char REG_Address) { unsigned char 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内部加速度数据,地址范围0x32~0x37***********/ void Multiple_read_ADXL345() { unsigned char i; ADXL345_Start(); //起始信号ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号ADXL345_SendByte(0x32); //发送存储单元地址,从0x32开始ADXL345_Start(); //起始信号ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF { BUF[i] = ADXL345_RecvByte(); //BUF[0]存储0x32地址中的数据if (i == 5) { ADXL345_SendACK(1); //最后一个数据需要回NOACK } else { ADXL345_SendACK(0); //回应ACK } } ADXL345_Stop(); //停止信号Delay5ms(); } /********************************初始化ADXL345*************************/ 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页} /***********************************显示模版****************************/ void display() { unsigned char code str0[]={"X 轴:"}; unsigned char code str1[]={"Y 轴:"}; unsigned char code str2[]={"Z 轴:"}; LcmInit(); LCDwr_string(str0,1,0); LCDwr_string(str1,2,0); LCDwr_string(str2,3,0); } /************************************主函数*****************************/ void main() { int data_xyz[3]; unsigned char devid; float Roll,Pitch,zz,Q,T,K; unsigned char str3[4]; unsigned char str4[4]; unsigned char str5[4]; delay(500); //上电延时LcmInit(); Init_ADXL345(); display();devid=Single_Read_ADXL345(0X00); //读出的数据为0XE5,表示正确while(1) { Init_ADXL345(); //初始化ADXL345 Multiple_read_ADXL345(); //连续读出数据,存储在BUF中data_xyz[0]=(BUF[1]<<8)+BUF[0]; //合成数据data_xyz[1]=(BUF[3]<<8)+BUF[2]; data_xyz[2]=(BUF[5]<<8)+BUF[4]; Q=(float)data_xyz[0]*3.9; //分别是加速度X,Y,Z的原始数据,10位的T=(float)data_xyz[1]*3.9; K=(float)data_xyz[2]*3.9; Roll=(float)(((atan2(K,Q)*180)/3.1416)-90); //X轴角度值Pitch=(float)(((atan2(K,T)*180)/3.1416)-90); //Y轴角度值zz=(float)((atan2(Q,K)*180)/3.1416); //Z轴角度值。

ADXL345-倾角计-Arduino

ADXL345-倾角计-Arduino
result[1] = (((int)buff[3])<<8) | buff[2] + a_offy;
result[2] = (((int)buff[5])<<8) | buff[4] + a_offz;
}
//初始化陀螺仪
void initGyro()
{ Leabharlann * * ITG 3200
*/
#include <Wire.h> //调用I2C库
//加速度传感器 ADXL345
#define ACC (0x53) //定义ADXL345地址
#define A_TO_READ (6) //读取每次占用的字节数(每个坐标轴占两个字节)
//陀螺仪 ITG3200
#define GYRO 0x68 //定义传感器地址,将AD0连接到GND口,传感器地址为二进制数11101000(参阅接口板的原理图)
/*
本次我们使用Arduino加ITG3205加ADXL345做实验姿态检测,使用Processing作为输出,实时显示姿态。
本次实验使用的ITG3205 与 ADXL345都是成品模块,都可以使用I2C接口进行连接。
先看硬件连接,模拟5号连接I2C模块的SCL,模拟4号连接I2C模块的SDA口。VCC与GND正常连接,主要是不要接错电压,要使用3.3V。I2C模块之间并联。
int g_offy = 5;
int g_offz = 41;
//加速度传感器误差修正的偏移量
int a_offx = -30;
int a_offy = -8;
int a_offz = 0;
char str[512];

(完整版)三轴数字加速度传感器ADXL345技术资料

(完整版)三轴数字加速度传感器ADXL345技术资料

概述:ADXL345 是一款小而薄的超低功耗3 轴加速度计,分辨率高(13 位),测量范围达± 16g。

数字输出数据为16 位二进制补码格式,可通过SPI(3 线或4 线)或I2C 数字接口访问。

ADXL345 非常适合移动设备应用。

它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。

其高分辨率(3.9mg/LSB),能够测量不到1.0°的倾斜角度变化。

该器件提供多种特殊检测功能。

活动和非活动检测功能通过比较任意轴上的加速度与用户设置的阈值来检测有无运动发生。

敲击检测功能可以检测任意方向的单振和双振动作。

自由落体检测功能可以检测器件是否正在掉落。

这些功能可以独立映射到两个中断输出引脚中的一个。

正在申请专利的集成式存储器管理系统采用一个32 级先进先出(FIFO)缓冲器,可用于存储数据,从而将主机处理器负荷降至最低,并降低整体系统功耗。

低功耗模式支持基于运动的智能电源管理,从而以极低的功耗进行阈值感测和运动加速度测量。

ADXL345 采用3 mm × 5 mm × 1 mm,14 引脚小型超薄塑料封装。

对比常用的飞思卡尔的MMZ7260三轴加速度传感器,ADXL345,具有测量精度高、可以通过SPI或I2C 直接和单片机通讯等优点。

特性:超低功耗:VS= 2.5 V 时(典型值),测量模式下低至23uA,待机模式下为0.1μA 功耗随带宽自动按比例变化用户可选的分辨率10 位固定分辨率全分辨率,分辨率随g 范围提高而提高,±16g 时高达13 位(在所有g 范围内保持4 mg/LSB 的比例系数)正在申请专利的嵌入式存储器管理系统采用FIFO 技术,可将主机处理器负荷降至最低。

单振/双振检测,活动/非活动监控,自由落体检测电源电压范围:2.0 V 至3.6 VI / O 电压范围:1.7 V 至VSSPI(3 线和4 线)和I2C 数字接口灵活的中断模式,可映射到任一中断引脚通过串行命令可选测量范围通过串行命令可选带宽宽温度范围(-40°C 至+85℃)抗冲击能力:10,000 g无铅/符合RoHS 标准小而薄:3 mm× 5 mm× 1 mm,LGA 封装模组尺寸:23*18*11mm(高度含插针高度应用:机器人控制、运动检测过程控制,电池供电系统硬盘驱动器(HDD)保护,单电源数据采集系统手机,医疗仪器,游戏和定点设备,工业仪器仪表,个人导航设备电路功能与优势ADXL345是一款小巧纤薄的低功耗三轴加速度计,可以对高达±16 g的加速度进行高分辨率(13位)测量。

ATMEGA128单片机读写倾角传感器ADXL345及所有I2C器件读写通用程序程序

ATMEGA128单片机读写倾角传感器ADXL345及所有I2C器件读写通用程序程序

}
uchar shin() {
uchar i,read_data; DDRD&=0XFD;//输入 for(i=0;i<8;i++)
{ PORTD|=0X01;//SCL=1 read_data<<=1; read_data|=(uchar)((PIND&0X02)>>1);//SDA PORTD&=0XFE; Delayuslcd(5);
temp1=((float)y_data*3.9); display(0,1,temp1);//显示 Y 方向加速度值 temp2=((float)z_data*3.9); display(0,9, temp2);//显示 Z 方向加速度值 delaylcd(1000); angle=(((atan2f(temp,temp1)*180)/3.14159265)+180);//算出倾角值 writeonechar(12,angle);//显示角度 }
void AX353_INIT()//倾角传感器初始化 {
write_byte(0x31,0x0B); //测量范围,正负 16g,13 位模式 write_byte(0x2C,0x08); //速率设定为 12.5 参考 pdf13 页 write_byte(0x2D,0x08); //选择电源模式 参考 pdf24 页 write_byte(0x2E,0x80); //使能 DATA_READY 中断 write_byte(0x1E,0x00); //X 偏移量 根据测试传感器的状态写入 pdf29 页 write_byte(0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入 pdf29 页 write_byte(0x20,0x05); //Z 偏移量 根据测试传感器的状态写入 pdf29 页 }

adxl345三轴加速度传感器原理

adxl345三轴加速度传感器原理

adxl345三轴加速度传感器原理
adxl345是一种三轴加速度传感器,它可以测量物体在三个方向上的加速度。

其工作原理基于微机电系统技术,通过利用微机电系统中的加速度敏感结构,感知不同方向上的加速度并将其转化为电信号输出。

传感器由加速度传感器核心芯片、数据转换芯片、接口芯片和滤波电路等组成,用于将测量到的加速度数据转换为数字信号,然后通过接口芯片将数据传输到控制系统中。

adxl345传感器广泛应用于航天、汽车、医疗、运动等领域。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
**************************************************
**********角度传感器程序代码**************
**************************************************资料个人收集整理,勿做商业用途
<>
****************************************************资料个人收集整理,勿做商业用途
*起始信号*
()
{
;
;
;
();
;
();
;
}
*停止信号*
()
{
;
;
;
();
;
();
}
*发送应答信号*
()
{
;
;
;
();
;
();
}
*发送非应答信号*
()
{
;
;
;
();
;
();
}
*接收应答信号*
()
{
;
;
;
();
;
;
();
? ;
}
*总线发送一个字节数据*
( )
{
;
;
(<)
{
()
;
;
;
();
;
();
<<;
}
();
}
*总线接收一个字节数据*
()
{
;
;
;
;
(<)
{
<<;
;
();
()
;
;
();
}
;
}
*向写入一个字节*
( )
{
();
();
();
();
();
}
*向读出一个字节*
( )
{
('');
}
()*;
;
}
*轴*
()
{
;
([]<<)[];
();
(<)
{
;
('');
}
{
('');
}
()*;
;
}
*轴*
()
{
;
([]<<)[];
();
(<)
{
;
('');
}
{
('');
}
()*;
;
}
*显示、、轴*
( )
{
;
;
()
{
: **;轴
;
;
: **;轴
;
;
: **;轴
;
;
: ;
}
();
()*
();
{
;
();
();
();
();
();
();
();
();
;
}
*连续读出内部加速度数据,地址范围*
()
{
;
();
();
();
();
();
(<)
{
[]();
()
();
();
}
();
();
}
*初始化*
()
{
();
();
();
();
();
();
();
}
*轴*(){; Nhomakorabea([]<<)[];
();
(<)
{
;
('');
}
;
(<)
{
()
;
;
;
;
<<;
}
;
<<;
(<)
{
()
;
;
;
;
;
<<;
}
;
();
}
*写数据*
( )
{
;
;
;
;
;
(<)
{
()
;
;
;
;
<<;
}
;
;
(<)
{
()
;
;
;
;
<<;
}
;
<<;
(<)
{
()
;
;
;
;
<<;
}
;
();
}
*显示一字符串*
( *)
{
();
();
(*'\')
{
(*);
;
();
}
}
*初始化*
()
{
();
}
();
}
<>
<>
<>
;
;
*引脚定义*
()
()
()
()
()
()
*角度传感器端口定义*
(<<)
(<<)
(<<)
(<<)
(<<)
(<<)
(<<)
(<<)
器件地址
[];
;
;
;
*延时*
( )
{
()
{}
}
*端口初始化*
()
{
();
();
();
();
();
();
}
*写指令*
( )
{
;
;
;
;
;
(<)
{
()
;
;
;
;
<<;
}
;
****************************************************资料个人收集整理,勿做商业用途
**********角度传感器函数部分***************
****************************************************资料个人收集整理,勿做商业用途
();
();
();
();
();
();
();
();
();
();
();
();
();
}
*写引脚设置*
()
{
();
();
();
();
}
*读引脚设置*
()
{
();
();
();
();
}
***************************************************资料个人收集整理,勿做商业用途
( );
( );
( );
()
{
: (); ;
: (); ;
: (); ;
: ;
}
();
();
();
}
*主程序*
()
{
;
();
;
;
()引脚初始化
();液晶初始化
(,":");
()初始化
()读出地数据为,表示正确
{
()连续读出数据,存储在中
();
();
();
();
();显示轴
();
();显示轴
();
();显示轴
相关文档
最新文档