加速度传感器ADXL345驱动程序
完整工程链接:
ADXL345工程代码
1.ADXL345简介
ADXL345是ADI公司推出的基于iMEMS技术的3轴、数字输出加速度传感器。
特点:
1.分辨率高:最高13位分辨率。
2.量程可变:具有+/-2g、+/-4g、+/-8g、+/-16g可变的测量范围。
3.灵敏度高:最高达3.9mg/LSB,能测量不到1.0的倾斜角度变化。
4.功耗低:40~145uA的超低功耗,待机模式只有0.1uA。
5.支持标准的I2C或SPI数字接口,自带32级FIFO存储,并且内部有多种运动状态检测和灵活的中断方式等特性。
芯片手册核心内容:
芯片名称 | ADXL345 |
---|---|
工作原理 | ADXL345是一款完整的3轴加速度测量系统 |
引脚说明 | SDA CLK GND VCC |
工作环境电压 | 2.0 V 至3.6 V 宽温度范围(-40℃至+85℃) |
通讯方式 | SPI(3线和4线)或 I2C数字接口 |
量程 | -0.3V至+3.9V , 10000g |
精度(最小单位的偏移量) | 3.9mg/LSB |
数据格式 | 16位二进制补码 |
注意:
当 ADXL345 沿检测轴正向加速时,它对正加速度进行检测。在检测重力时,当检测轴的方向与重力的方向相反时检测到的是正加速度。
2.ADXL345控制程序
功能: 使用STM32F103ZET6驱动ADXL345,读取传感器三个方向的加速度值和转换后的角度值,通过串口打印显示,同时通过按键进行校准。
程序框架:
(1) 初始化ADXL345
(2) 读取ADXL345三个方向的加速度值
(3) 通过加速度的值计算角度值
(4) 主函数显示测试结果
初始化ADXL345函数
/*******************************************************************************
* 函 数 名 : ADXL345_Init
* 函数功能 : 初始化ADXL345.
* 输 入 : 无
* 输 出 : 无
* 返 回 值 :0 初始化成功,1 初始化失败
*******************************************************************************/
u8 ADXL345_Init(void)
{
IIC_Init(); //初始化IIC总线
if(ADXL345_RD_Reg(DEVICE_ID)==0XE5) //读取器件ID
{
ADXL345_WR_Reg(DATA_FORMAT,0X2B); //低电平中断输出,13位全分辨率,输出数据右对齐,16g量程 模式
ADXL345_WR_Reg(BW_RATE,0x0A); //数据输出速度为100Hz
ADXL345_WR_Reg(POWER_CTL,0x28); //链接使能,测量模式 (POWER_CTL寄存器选择工作模式)
ADXL345_WR_Reg(INT_ENABLE,0x00); //不使用中断
ADXL345_WR_Reg(OFSX,0x00);
ADXL345_WR_Reg(OFSY,0x00);
ADXL345_WR_Reg(OFSZ,0x00);
return 0;
}
return 1;
}
读取ADXL345三轴加速度值
/*******************************************************************************
* 函 数 名 : ADXL345_RD_XYZ
* 函数功能 : 读取3个轴的数据
* 输 入 : x,y,z:读取到的数据
* 输 出 : 无
* 返 回 值 :无
*******************************************************************************/
void ADXL345_RD_XYZ(short *x,short *y,short *z)
{
u8 buf[6];
u8 i;
IIC_Start();
IIC_Send_Byte(ADXL_WRITE); //发送写器件指令
IIC_Wait_Ack();
IIC_Send_Byte(0x32); //发送寄存器地址(数据缓存的起始地址为0X32)
IIC_Wait_Ack();
IIC_Start(); //重新启动
IIC_Send_Byte(ADXL_READ); //发送读器件指令
IIC_Wait_Ack();
for(i=0;i<6;i++) //读6个字节,两个字节存储一个轴的数据
{
if(i==5)buf[i]=IIC_Read_Byte(0); //读取一个字节,不继续再读,发送NACK
else buf[i]=IIC_Read_Byte(1); //读取一个字节,继续读,发送ACK
}
IIC_Stop(); //产生一个停止条件
*x=(short)(((u16)buf[1]<<8)+buf[0]);
*y=(short)(((u16)buf[3]<<8)+buf[2]);
*z=(short)(((u16)buf[5]<<8)+buf[4]);
}
通过加速度的值计算角度值
注意:返回值角度值单位是0.1°
偏转角度计算公式:
/*******************************************************************************
* 函 数 名 : ADXL345_Get_Angle
* 函数功能 : 得到角度
* 输 入 : x,y,z:x,y,z方向的重力加速度分量(不需要单位,直接数值即可)
dir:要获得的角度.0,与Z轴的角度;1,与X轴的角度;2,与Y轴的角度.
* 输 出 : 无
* 返 回 值 :返回值:角度值.单位0.1°.
*******************************************************************************/
short ADXL345_Get_Angle(float x,float y,float z,u8 dir)
{
float temp;
float res=0; //res得到的是弧度值,需要将其转换为角度值也就是*180/3.14
switch(dir)
{
case 0: //与自然Z轴的角度
temp=sqrt((x*x+y*y))/z;
res=atan(temp);
break;
case 1: //与自然X轴的角度
temp=x/sqrt((y*y+z*z));
res=atan(temp);
break;
case 2: //与自然Y轴的角度
temp=y/sqrt((x*x+z*z));
res=atan(temp);
break;
}
return res*180/3.14*10; //乘以10是为了取一位小数,角度精确到0.1°所以要乘以10
}
3.结果演示
演示X轴的倾斜角度和三轴的加速度值数据正确