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(); //接收应答