Post Go back to editing

ADXL350 for Digital Angle Meter?

I'm sure everyone has seen those small digital angle meters with reported accuracy typically 0.1 or 0.2 degrees. I'm looking to design something that can have an accuracy of 0.05 degrees and I think perhaps the ADXL350 might be a good candidate.

My objective is to keep the BOM below $50 so that eliminates some of the really high accuracy devices available. I tried to search for designs like this but didn't come across any (surprisingly).

Is this the right part or is there something I missed? Perhaps using multiple of these mounted in different orientations could improve the accuracy?

Thanks in advance for any replies.

  • Just pinging this thread to see if anyone has any information

  • Sorry for the delay in response, our latest ADXL35x family has the lowest noise performance in current accelerometer portfolio, which provides very precise tilt measurement and should be within your budget range. 

    Here's a paper describes the noise calculation using ADXL345(similar to ADXL350) vs ADXL355 for example. As you can see the noise comes from a variety of error sources which could result in erroneous measurements. So basically your environment(e.g temperature change) determines the accuracy of your measurement.   

    Choosing the Most Suitable MEMS Accelerometer for Your Application—Part 1 | Analog Devices 

    I hope this helps.

  • Thank you for your reply and link, I found that very helpful. From this paper it seems that the ADXL355 would be a very good choice but at a 10x cost over the ADXL350. If you were to rate these parts based on my intended application what would be your top 2 choices?

    I would assume that with an accurate temperature sensor you could recalibrate based on the current temperature which would improve the overall accuracy, correct?

  • I would recommend ADXL354/355 for your precise tilt measurement application. Compare to the ADXL350, actually you pay for the performance. And you are right, you can calibrate the sensor based on an accurate temperature sensor to improve overall accuracy.

  • The EVAL-ADXL355-PMDZ was only $30 so I ordered one of those to start and to have for reference. Once I get my application working with the ADXL355 I can try using the ADXL350 for cost reduction.

  • So I had some time to find some code and run some quick tests on the ADXL355 module. With the board sitting flat on the desk and reading the raw registers I'm getting rather a wide range. Here's some data with reading taken about 1 second apart.

    -10.547, 7.258, 0.828
    -2.516, -3.785, 0.828
    -8.539, 3.242, -2.184
    2.504, -3.785, 5.848
    1.500, -4.789, -7.203
    -0.508, 6.254, -8.207
    -5.527, -1.777, 0.828
    7.461, -0.773, 2.836
    -6.531, -3.785, 4.844
    0.496, -3.785, -6.199
    -0.508, -3.785, -3.188
    2.504, 2.238, 0.828
    -9.543, 8.262, -2.184
    -8.539, -0.773, -8.207
    -9.543, 1.234, 3.840
    -5.527, -4.789, 3.840
    -6.531, 7.258, -5.195
    -5.527, -0.773, -6.199
    3.508, 0.230, 1.832
    3.508, 6.254, -2.184
    0.496, -4.789, -4.191
    1.500, -4.789, -2.184
    -4.523, 8.262, -6.199
    -2.516, 5.250, -8.207
    -10.547, 7.258, -3.188
    8.465, 0.230, -0.176
    -4.523, 9.266, -7.203
    2.504, 0.230, -8.207
    -9.543, 5.250, -5.195
    -7.535, 0.230, 1.832
    -10.547, -0.773, -4.191
    14.488, 5.250, 1.832
    -4.523, -3.785, 3.840

     

    I know that I need to calibrate before I can start to really evaluate but I wasn't expecting the number to spread so much. Is this normal?

    I'm using :

    /* Temperature parameters */
    #define ADXL355_TEMP_BIAS (float)1852.0 /* Accelerometer temperature bias(in ADC codes) at 25 Deg C */
    #define ADXL355_TEMP_SLOPE (float)-9.05 /* Accelerometer temperature change from datasheet (LSB/degC) */

    /* Accelerometer parameters */
    #define ADXL_RANGE 2 /* ADXL362 sensitivity: 2, 4, 8 [g] */

    #define ACT_VALUE 50 /* Activity threshold value */

    #define INACT_VALUE 50 /* Inactivity threshold value */

    #define ACT_TIMER 100 /* Activity timer value in ms */

    #define INACT_TIMER 10 /* Inactivity timer value in seconds */

    adxl355Scale = 256.0f

    float Xdata = ((float)(i32SensorX-i32SensorX_init) / adxl355Scale);
    float Ydata = ((float)(i32SensorY-i32SensorY_init) / adxl355Scale);
    float Zdata = ((float)(i32SensorZ-i32SensorZ_init) / adxl355Scale);

    and using this to initialize:

    void ADXL355_Data_Init()
    {
    for(char i=0 ; i<=INIT_COUNT ; i++)
    {
    delay(10);
    ADXL355_Data_Scan();

    i32SensorX_init = (i32SensorX_init*i/INIT_COUNT) + (i32SensorX*(INIT_COUNT-i)/INIT_COUNT);
    i32SensorY_init = (i32SensorY_init*i/INIT_COUNT) + (i32SensorY*(INIT_COUNT-i)/INIT_COUNT);
    i32SensorZ_init = (i32SensorZ_init*i/INIT_COUNT) + (i32SensorZ*(INIT_COUNT-i)/INIT_COUNT);
    }
    }

  • There're couple things to consider. What is the unit of these data, in g or mg? What is your bandwidth and ODR you set to? How did you perform your SPI read, is it single byte read or multibyte read? Is there any noise source around? Is your power supply stable?