已回答假定已回答

ADXL357 三轴加速度 输出异常 

lklk 在 2018-7-19 詢問的問題
最後回覆由孙治国於2018-7-25提供

下面我来描述一下ADXL357调试的基本情况:

   1. ADXL357   ODR配置500hz

   2.量程为-10到10g

   3.可以正常读出设备ID@@@@@@@

    4.SPI速度为5.25MHZ

 

   下面是我遇到的问题:

1.   将电路板平放 (程序从X轴开始读取寄存器数据,连续读取三个轴的数据)  

         X轴加速度计输出数据为0.08g,沿着X轴方向转动数据会产生规律性变化,但是当旋转X轴到垂直地面的时候(正常来说应该是1g),但是读出的数据是0.076

         Y轴输出的数据更加异常,在-10到10g之间来回跳动

         z轴数据跟Y轴数据情况差不多

  2.从哪个轴开始读取数据,哪个轴的数据就比较小,其余两轴数据异常(在-10到10g之间波动)

         从X轴开始读,X轴的数据在0.08g附近

         从Y轴开始读,Y轴数据在0.08g附近

         从Z轴开始读,Z轴数据在0.003g附近

        (沿着轴方向转动数据都会产生规律性变化,但是当旋转某个轴到垂直地面的时候(正常来说应该是1g),但是读出的数据却特别小)

 

 

    下面是我程序的代码:

 

   //连续读取寄存器多个字节的函数

       void SPI_ADXL357_M_READ(uint8_t adress,uint8_t *r_data,int RXCONT)

{

unsigned char RXBYTE;

unsigned char readadress;

GPIO_ResetBits(GPIOB,GPIO_Pin_12);      //片选拉低

delay_ms(1);

readadress = adress<<1;

readadress |= 0x01;

SPI2_ReadWriteByte(readadress);            //spi发送和接收函数

for(RXBYTE=0; RXBYTE<RXCONT; RXBYTE++)

{

r_data[RXBYTE]=SPI2_ReadWriteByte(0X00);

}

delay_ms(1);

GPIO_SetBits(GPIOB,GPIO_Pin_12);          //片选拉高

delay_ms(1);

}

 

 

     //spi发送和接收函数

 

 

u8 SPI2_ReadWriteByte(u8 TxData)

 

{   

 

  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空

SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个byte  数据

 

  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte

 

return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据

    

}

 

 

        

 

      //读取ADXL357三轴加速度的函数

 

void ADXL357_read_xyz(int32_t *xvalue,int32_t *yvalue,int32_t *zvalue)

 

{

         uint8_t data1;

         uint8_t data2;

         uint8_t data3;

         int32_t value=0;

         uint8_t tx[2] = {0,0};

         uint8_t rx[9] = {0};

 

         SPI_ADXL357_M_READ(0x08,rx,9);

 

/* X value */

          data3 = rx[0];

          data2 = rx[1];

          data1 = rx[2] & 0xF0;

  value = (data3 << 16) | (data2 << 8) | data1;

 

  if((data3&0x80)==0)

{

*xvalue=((value << 8) >> 12)&0x0007FFFF;   /* sign extend and drop 4-LSB */

}

else

{

                         *xvalue=( (~(((value << 8) >> 12)&0x0007FFFF)) &0x0007FFFF )*(-1); 

}

 

 

 

 

/* Y value */

data3 = rx[3];

                data2 = rx[4];

                data1 = rx[5] & 0xF0;

value = (data3 << 16) | (data2 << 8) | data1;

 

               if((data3&0x80)==0)

{

*yvalue=((value << 8) >> 12)&0x0007FFFF;   /* sign extend and drop 4-LSB */

                  }

else

{

                          *yvalue=( (~(((value << 8) >> 12)&0x0007FFFF)) &0x0007FFFF )*(-1); 

}

 

/* Z value */

data3 = rx[6];

                data2 = rx[7];

                data1 = rx[8] & 0xF0;

value = (data3 << 16) | (data2 << 8) | data1;

 

  if((data3&0x80)==0)

{

*zvalue=((value << 8) >> 12)&0x0007FFFF;   /* sign extend and drop 4-LSB */

}

else

{

        *zvalue=( (~(((value << 8) >> 12)&0x0007FFFF)) &0x0007FFFF )*(-1); 

}

}

      

 

 

     //ADXL357初始化函数

 

void ADXL357_INIT()

 

{

delay_ms(500);                    //等待上电就绪

SPI_ADXL357_WRITE(0x2F,0x52);   //复位设备

  SPI_ADXL357_WRITE(0x28,0x02);    //ODR500

        SPI_ADXL357_WRITE(0x2C,0x01);   //选择量程为10g

SPI_ADXL357_WRITE(0x2D,0x00);   //选择为测量模式

}

結果