水平放置时,所测的出x轴的数据感觉明显有问题,为0x0147,但是y轴和z轴的数据感觉没啥大问题,请问这是程序有问题还是传感器坏了,具体数据和程序如下
端口及I2C配置,采用的是硬件I2C
#include "bsp_adxl.h"
#include <math.h>
static __IO uint32_t I2CTimeout = I2CT_LONG_TIMEOUT;
uint8_t ADXLDATE[8]={0};
float temp_X,temp_Y,temp_Z;
void SysTick_Delay_ms(uint32_t ms);
void ADXL_IIC_GPIO_Confing(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能与 I2C 有关的时钟 */
ADXL_IIC_CLK_FUN ( ADXL_IIC_CLK, ENABLE );
ADXL_I2C_APBxClock_FUN ( ADXL_I2C_CLK, ENABLE );
/* I2C_SCL、I2C_SDA*/
GPIO_InitStructure.GPIO_Pin = ADXL_IIC_SCL_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 开漏输出
GPIO_Init(ADXL_IIC_SCL_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ADXL_IIC_SDA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 开漏输出
GPIO_Init(ADXL_IIC_SDA_PORT, &GPIO_InitStructure);
}
void IIC_MODE_Confing(void)
{
I2C_InitTypeDef I2C_InitStructure;
/* I2C 配置 */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
/* 高电平数据稳定,低电平数据变化 SCL 时钟线的占空比 */
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 =I2Cx_OWN_ADDRESS7;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
/* I2C的寻址模式 */
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
/* 通信速率 */
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed1;
/* I2C 初始化 */
I2C_Init(ADXL_I2Cx, &I2C_InitStructure);
/* 使能 I2C */
I2C_Cmd(ADXL_I2Cx, ENABLE);
}
void I2C_ADXL345_Init(void)
{
ADXL_IIC_GPIO_Confing();
IIC_MODE_Confing();
}
uint32_t IIC_ADXL_ByteWrite(u8* pBuffer, u8 WriteAddr)
{
/* Send STRAT condition */
I2C_GenerateSTART(ADXL_I2Cx, ENABLE);
I2CTimeout = I2CT_FLAG_TIMEOUT;
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(ADXL_I2Cx, I2C_EVENT_MASTER_MODE_SELECT))
{
if((I2CTimeout--) == 0) return TIMEOUT_UserCallback(0);
}
I2CTimeout = I2CT_FLAG_TIMEOUT;
/* Send EEPROM address for write */
I2C_Send7bitAddress(ADXL_I2Cx, ADXL345_ADDRESS, I2C_Direction_Transmitter);
/* Test on EV6 and clear it */
while(!I2C_CheckEvent(ADXL_I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
{
if((I2CTimeout--) == 0) return TIMEOUT_UserCallback(1);
}
/* Send the EEPROM's internal address to write to */
I2C_SendData(ADXL_I2Cx, WriteAddr);
I2CTimeout = I2CT_FLAG_TIMEOUT;
/* Test on EV8 and clear it */
while(!I2C_CheckEvent(ADXL_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if((I2CTimeout--) == 0) return TIMEOUT_UserCallback(2);
}
/* Send the byte to be written */
I2C_SendData(ADXL_I2Cx, *pBuffer);
I2CTimeout = I2CT_FLAG_TIMEOUT;
/* Test on EV8 and clear it */
while(!I2C_CheckEvent(ADXL_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if((I2CTimeout--) == 0) return TIMEOUT_UserCallback(3);
}
/* Send STOP condition */
I2C_GenerateSTOP(ADXL_I2Cx, ENABLE);
return 1;
}
uint32_t I2C_ADCL_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)
{
I2CTimeout = I2CT_LONG_TIMEOUT;
while(I2C_GetFlagStatus(ADXL_I2Cx, I2C_FLAG_BUSY))
{
if((I2CTimeout--) == 0) return TIMEOUT_UserCallback(9);
}
/* Send START condition */
I2C_GenerateSTART(ADXL_I2Cx, ENABLE);
I2CTimeout = I2CT_FLAG_TIMEOUT;
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(ADXL_I2Cx, I2C_EVENT_MASTER_MODE_SELECT))
{
if((I2CTimeout--) == 0) return TIMEOUT_UserCallback(10);
}
/* Send EEPROM address for write */
I2C_Send7bitAddress(ADXL_I2Cx, ADXL345_ADDRESS, I2C_Direction_Transmitter);
I2CTimeout = I2CT_FLAG_TIMEOUT;
/* Test on EV6 and clear it */
while(!I2C_CheckEvent(ADXL_I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
{
if((I2CTimeout--) == 0) return TIMEOUT_UserCallback(11);
}
/* Clear EV6 by setting again the PE bit */
I2C_Cmd(ADXL_I2Cx, ENABLE);
/* Send the EEPROM's internal address to write to */
I2C_SendData(ADXL_I2Cx, ReadAddr);
I2CTimeout = I2CT_FLAG_TIMEOUT;
/* Test on EV8 and clear it */
while(!I2C_CheckEvent(ADXL_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if((I2CTimeout--) == 0) return TIMEOUT_UserCallback(12);
}
/* Send STRAT condition a second time */
I2C_GenerateSTART(ADXL_I2Cx, ENABLE);
I2CTimeout = I2CT_FLAG_TIMEOUT;
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(ADXL_I2Cx, I2C_EVENT_MASTER_MODE_SELECT))
{
if((I2CTimeout--) == 0) return TIMEOUT_UserCallback(13);
}
/* Send EEPROM address for read */
I2C_Send7bitAddress(ADXL_I2Cx, ADXL345R_ADDRESS, I2C_Direction_Receiver);
I2CTimeout = I2CT_FLAG_TIMEOUT;
/* Test on EV6 and clear it */
while(!I2C_CheckEvent(ADXL_I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
{
if((I2CTimeout--) == 0) return TIMEOUT_UserCallback(14);
}
/* While there is data to be read */
while(NumByteToRead)
{
if(NumByteToRead == 1)
{
/* Disable Acknowledgement */
I2C_AcknowledgeConfig(ADXL_I2Cx, DISABLE);
/* Send STOP Condition */
I2C_GenerateSTOP(ADXL_I2Cx, ENABLE);
}
/* Test on EV7 and clear it */
I2CTimeout = I2CT_LONG_TIMEOUT;
while(I2C_CheckEvent(ADXL_I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)==0)
{
if((I2CTimeout--) == 0) return TIMEOUT_UserCallback(3);
}
{
/* Read a byte from the EEPROM */
*pBuffer = I2C_ReceiveData(ADXL_I2Cx);
/* Point to the next location where the byte read will be saved */
pBuffer++;
/* Decrement the read bytes counter */
NumByteToRead--;
}
}
/* Enable Acknowledgement to be ready for another reception */
I2C_AcknowledgeConfig(ADXL_I2Cx, ENABLE);
return 1;
}
void Init_ADXL345(void)
{
uint8_t MODE[]={0x0B};
uint8_t spreed[]={0x08};
uint8_t add[]={0x08};
uint8_t CHA[]={0x05};
uint8_t CHA1[]={0x00};
IIC_ADXL_ByteWrite(MODE,0x31); //测量范围,正负16g,13位模式
IIC_ADXL_ByteWrite(spreed,0x2C); //速率设定为25 参考pdf13页
IIC_ADXL_ByteWrite(add,0x2D); //选择电源模式 参考pdf24页 //参考14页表7进行修改
IIC_ADXL_ByteWrite(0x00,0x2E); //使能 DATA_READY 中断
IIC_ADXL_ByteWrite(0x00,0x1E); //X 偏移量 根据测试传感器的状态写入pdf29页
IIC_ADXL_ByteWrite(CHA1,0x1F); //Y 偏移量 根据测试传感器的状态写入pdf29页
IIC_ADXL_ByteWrite(CHA,0x20); //Z 偏移量 根据测试传感器的状态写入pdf29页
}
主程序
#include "stm32f10x.h"
#include "./led/bsp_led.h"
#include "./usart/bsp_usart.h"
#include "./i2c/bsp_i2c_ee.h"
#include <string.h>
#include "bsp_adxl.h"
#define EEP_Firstpage 0x00
uint8_t I2c_Buf_Write[256];
uint8_t I2c_Buf_Read[256];
uint8_t I2C_Test(void);
extern float temp_X,temp_Y,temp_Z;
extern uint8_t ADXLDATE[8];
uint8_t i;
int X_number=0X00;
int Y_number=0X00;
int Z_number=0X00;
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
short x,y,z;
short rx, ry, rz;
LED_GPIO_Config();
LED_BLUE;
/* 串口初始化 */
USART_Config();
printf("\r\n 这是一个I2C外设ADXL345测试例程 \r\n");
/* I2C 外设初(AT24C02)始化 */
I2C_ADXL345_Init();
Init_ADXL345();
//ADXL345读写测试
if(I2C_Test() ==1)
{
LED_GREEN;
printf("测试成功,设备序列号为:0x%x\n",I2c_Buf_Read[0]);
}
else
{
LED_RED;
printf("测试失败:所测地址为:0x%x\n",I2c_Buf_Read[0]);
}
I2C_ADCL_BufferRead(ADXLDATE, 0X32, 6);
for(i=0;i<8;i++)
{
printf("buff[i]为 %x\n",ADXLDATE[i]);
}
X_number = (ADXLDATE[1]<<8) + ADXLDATE[0];
Y_number = (ADXLDATE[3]<<8) + ADXLDATE[2];
Z_number = (ADXLDATE[5]<<8) + ADXLDATE[4];
printf("x轴加速度为:%f\n",(float)(X_number*3.9));
printf("y轴加速度为:%f\n",(float)(Y_number*3.9));
printf("z轴加速度为:%f\n",(float)(Z_number*3.9));
}