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

1.ADXL345工作原理

1.1 基本参数

工作电压范围 :2.0 ~ 3.6 V ;

温度范围 :-40℃至+105℃ ;

分辨率 高(13位),测量范围达± 16g ;

数字输出数据为16位二进制 补码格式 ;

1.2  引脚介绍

我购买的ADXL345的引脚有 SCL、SDA、SDO、INT1、INT2、CS、VCC、GND,本计步器没有用到INT1和INT2中断引脚。

1.3 通信方式

ADXL345加速度传感器的通信方式有SPI和IIC两种通信方式。由于我用的是IIC的通信方式,因此在这里就不多介绍SPI了,感兴趣的可以去找数据手册看介绍。

引脚连接图

CS'是片选信号,低电平时是选择SPI作为通信方式,高电平时选择IIC作为通信方式;ALT ADDRESS引脚处于高电平,器件的7位I2C地址是0x1D,随后为R/W位。这转化为 0x3A写入,0x3B读取;通过ALT ADDRESS引脚(SDO)接地, 可以选择备用I2C地址0x53(随后为R/W位)。这转化为0xA6写 入,0xA7读取。ADXL345没有内部上拉或下拉电阻,因此在接线时建议SDA和SCL上拉4.7KΩ-10KΩ的电阻。

IIC支持的通信速率是标准 (100 kHz)和快速(400 kHz)数据传输模式。

1.4 IIC写一个字节、写多个字节、读取一个字节、读多个字节的器件寻址过程。

1.5 官方给的ADXL345最小初始化序列

但是拿到的每一个ADXL345输出的数据与典型值都会有一定的偏差,如果有需求可以在初始化使用偏移寄存器校准;没有校准时,如果将ADXL345平放在桌面,X、Y、Z轴的输出数据可能是X=+2LSB,Y=-20LSB,Z=292LSB(这个数值是我在测试过程中测到的,不代表每一个都这样,仅供参考)。水平放置时,x读数+2,y读数-20, Z读数292;这时,正常值应该是0,0,255,因此需要把偏移量设置为-2, +20, -37。但是,ADXL345默认13位分辨率,16g量程时,1 LSB为1/256 = 3.9mg/LSB。偏移寄存器为15.6mg/LSB,所以偏移寄存器写1个LSB,相当于偏移了4个LSB,故需将差值除4的结果写入对应偏移器即可。

2.ADXL345初始化,写/读字节/从ADXL345读取加速度传感器数据

2.1 初始化

      使用的是软件IIC,配置过程借鉴的江协科技;

      由于本计步器处理数据时一般是相对值,所以对于使用寄存器偏移校准没有强制的要求。因此随机找了网上用的比较多的初始化。

void ADXL345_Init(void)
{
	MyI2C_adxl345_Init();
	
	ADXL345_WriteReg(0x31,0x0B);   //测量范围,正负16g,13位模式
	ADXL345_WriteReg(0x2C,0x08);   //速率设定为12.5 参考pdf13页
	ADXL345_WriteReg(0x2D,0x08);   //选择电源模式   参考pdf24页
	ADXL345_WriteReg(0x2E,0x80);   //使能 DATA_READY 中断
//下列的偏移量可根据具体需求更改
	ADXL345_WriteReg(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入
	ADXL345_WriteReg(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入
	ADXL345_WriteReg(0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入
}

2.2 STM32C8T6向ADXL345写入一个字节

void ADXL345_WriteReg(uint8_t RegAddress,uint8_t Data)
{
	MyI2C_adxl345_Init();
	
	MyI2C_adxl345_Start();						//I2C起始
	MyI2C_adxl345_SendByte(ADXL345_ADDRESS);	//发送从机地址,读写位为0,表示即将写入
	MyI2C_adxl345_ReceiveAck();					//接收应答
	MyI2C_adxl345_SendByte(RegAddress);			//发送寄存器地址
	MyI2C_adxl345_ReceiveAck();					//接收应答
	MyI2C_adxl345_SendByte(Data);				//发送要写入寄存器的数据
	MyI2C_adxl345_ReceiveAck();					//接收应答
	MyI2C_adxl345_Stop();						//I2C终止
}

2.3 STM32C8T6从ADXL345 读取一个字节

uint8_t ADXL345_ReadReg(uint8_t RegAddress)
{
	uint8_t Data;
	
	MyI2C_adxl345_Start();						//I2C起始
	MyI2C_adxl345_SendByte(ADXL345_ADDRESS);	//发送从机地址,读写位为0,表示即将写入
	MyI2C_adxl345_ReceiveAck();					//接收应答
	MyI2C_adxl345_SendByte(RegAddress);			//发送寄存器地址
	MyI2C_adxl345_ReceiveAck();					//接收应答
	
	MyI2C_adxl345_Start();							//I2C重复起始
	MyI2C_adxl345_SendByte(ADXL345_ADDRESS | 0x01);	//发送从机地址,读写位为1,表示即将读取
	MyI2C_adxl345_ReceiveAck();					//接收应答
	Data = MyI2C_adxl345_ReceiveByte();			//接收指定寄存器的数据
	MyI2C_adxl345_SendAck(1);					//发送应答,给从机非应答,终止从机的数据输出
	MyI2C_adxl345_Stop();						//I2C终止
	
	return Data;
}

2.4 STM32C8T6从ADXL345的FIFO中读取数据(多个字节读取)

X、Y、Z轴的数据存储在地址为0x32~0x37中,输出数据为二进制补码,DATAx0为最低有 效字节,DATAx1为最高有效字节。

void ADXL345_ReadReg_Get_Data(short *x,short *y,short *z)
{
	int8_t i;
	u8 BUF[6];
	MyI2C_adxl345_Start();						//I2C起始
	MyI2C_adxl345_SendByte(ADXL345_ADDRESS);	//发送从机地址,读写位为0,表示即将写入
	MyI2C_adxl345_ReceiveAck();					//接收应答
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值