伊迪鱼 2021-04-20 23:04
浏览 74

ADXL345传感器测得x轴数据问题

水平放置时,所测的出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));
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 php 同步电商平台多个店铺增量订单和订单状态
    • ¥15 关于logstash转发日志时发生的部分内容丢失问题
    • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
    • ¥15 微信会员卡接入微信支付商户号收款
    • ¥15 如何获取烟草零售终端数据
    • ¥15 数学建模招标中位数问题
    • ¥15 phython路径名过长报错 不知道什么问题
    • ¥15 深度学习中模型转换该怎么实现
    • ¥15 Stata外部命令安装问题求帮助!
    • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。