Question asked by memphile on Nov 27, 2014
Latest reply on Dec 1, 2014 by Achim

Hi Folks,

I am newbie in MEMS domain. In order to learn MEMS motion sensors (for few undecided projects) I borrowed an RL78/ADXL345 board from friend and started playing with it. I am attempting to derive simple velocity/distance in X direction via integration.

1. I have put the board on horizontal table. At this time I expect ax to be zero, after being compensated for 0g. I see that ADXL345, does give zero values for ax, when I push the board in x direction gently, I see non-zero accel in x dir. However, after 25 sec or so, the velocity seems to drift. Could someone help me understand this, please ? I do expect velocity to become inaccurate, due to integration, but not as early as 25 sec. My code is given below.

2. Init - ADXL345 like this -

/* accelerometer data format                     */

/* range +/- 16g                                        */

/* right justified with sign extension           */

/* Full resolution mode                              */

/* put FIFO into FIFO mode                     */

/* set x offset register                         */

/* this value is determined by just turning on adxl345, and observing x-axis accel from DATAX0 */

/* set Sample rate              400 Hz       */

/* take accelerometer out of standby mode        */

3. Here is how I determine velocity/distance. I am averaging acceleration in X dir with previous sample.

while (1U)

{

if ((fifo_lvl = ADXL345_GetFifoLevel()) > 0)

{

sprintf(buff, "Fifo Lvl: %d      ", fifo_lvl);

DisplayLCD(LCD_LINE3, (uint8_t *) buff);

/* scale factor for +/- 16g range */

ax = ((float)((fifo_data[1] << 8) | fifo_data[0])*31.0/1000.0);

sprintf(buff, "X axis: %f      ", ax);

DisplayLCD(LCD_LINE4, (uint8_t *) buff);

/* velocity by inregration */

/* value of delay = 1/ sample freq = 2.5 ms /*

new_velocityx = old_velocityx + (((ax+old_ax)*(float)delay)/2.0)/1000.0;

sprintf(buff, "velx: %f      ", new_velocityx);

DisplayLCD(LCD_LINE5, (uint8_t *) buff);

old_velocityx = new_velocityx;

old_ax = ax;

}