已回答假定已回答

请教ADXL350的偏置问题

jiayou 在 2016-1-6 詢問的問題
最後回覆由neilzhao於2016-1-17提供

刚刚开始学习的菜鸟新手提问,希望得到ADI工程师和前辈的回答。

入手一块ADXL350的开发板,使用STM32F4,SPI四线通信。  现在通信没有问题,但是收到的数据有一些问题,如下图:

 

其中[0]、[1]、[2]分别为X、Y、Z轴的数据。

 

 

这是模块平放(+Z)时的数据:

平放.JPG

 

 

 

模块反放(-Z)时的数据:

反放.JPG

 

 

 

 

+X方向放置的数据:

+X.JPG

 

 

-X方向放置时的数据:

-X.JPG

 

 

 

 

+Y方向放置时的数据:

+Y.JPG

 

 

 

 

 

-Y方向放置时的数据:

-Y.JPG

 

 

 

 

从数据中可以看出,数据变化的方向是正确的,XY轴的数据相对较为准确,在+-X和+-Y时,数据应该是+-512LSB左右。Z轴的数据方向也是对的,但明显有非常大的偏置量,XY轴的数据也有一定的偏置量。

 

 

请问,这是我初始化设置的问题,还是模块的问题?  这个可以通过修正静态时候的偏置(计算OFFSET)来解决吗?  谢谢!

 

 

下面是我写的ADXL350初始化和数据读取的代码,请指教我哪里写的有问题,谢谢!

 

 

void Initial_ADXL350()

{

 

      //DATA_FORMAT设置

       SPI1_WriteRegister(DATA_FORMAT,0x0B, CS_GPIO, CS_GPIO_PIN);

       Delay_ms(5);

 

 

      //POWER_CTL

       SPI1_WriteRegister(POWER_CTL,0x08, CS_GPIO, CS_GPIO_PIN);

       Delay_ms(5);

 

       //INT_ENABLE

       SPI1_WriteRegister(INT_ENABLE,0x00, CS_GPIO, CS_GPIO_PIN);

       Delay_ms(5);

 

       //BW_RATE

       SPI1_WriteRegister(BW_RATE,0x0F, CS_GPIO, CS_GPIO_PIN);

       Delay_ms(5);

 

       //FIFO_CTL

       SPI1_WriteRegister(FIFO_CTL,0x80, CS_GPIO, CS_GPIO_PIN);

       Delay_ms(5);

}

 

 

 

 

 

 

void ADXL350_Read()

{

       u8 i = 0;

       GPIO_ResetBits(CS_GPIO,CS_GPIO_PIN);  //片选置位

 

       SPI1_ReadWriteByte(DATAX0|_SPI_READ_MB);//设置连续读取模式

 

       for(i=0;i<6;i++)

       {

            SPI1_Buffer[i] = SPI1_ReadWriteByte(_SPI_READ);

       }

 

       GPIO_SetBits(CS_GPIO,CS_GPIO_PIN); //关闭通信

 

       Acc_Raw[0] = (((int16_t)SPI1_Buffer[1]) << 8) | (int16_t)SPI1_Buffer[0];

       Acc_Raw[1] = (((int16_t)SPI1_Buffer[3]) << 8) | (int16_t)SPI1_Buffer[2];

       Acc_Raw[2] = (((int16_t)SPI1_Buffer[5]) << 8) | (int16_t)SPI1_Buffer[4];

 

     //判断数值正负

       if (Acc_Raw[0]&0xF000)

            OUT[0] = -(0xFFFF - Acc_Raw[0] + 1);

       else

            OUT[0] = Acc_Raw[0];

 

       if (Acc_Raw[1]&0xF000)

            OUT[1] = -(0xFFFF - Acc_Raw[1] + 1);

       else

            OUT[1] = Acc_Raw[1];

 

       if (Acc_Raw[2]&0xF000)

            OUT[2] = -(0xFFFF - Acc_Raw[2] + 1);

       else

            OUT[2] = Acc_Raw[2];

 

}

結果