I have interfaced ADXL375 & I have some below. I have attached the code.
1. The offset I am getting is huge.
It is 1g approx on both x & y axis & 1.5g on z-axis.
I don't know what could be problem. I read offset registers , they are all zero in ADXL375.
I had read thread on Analog forum, someone gad same problem with offset +4G on z axis.
He had removed the IC & resoldered new one & problem gone.
But I wan't to know what could be exact reason?
2. For ODR <= 800Hz, we multiply register value with 49 to get g value i.e:
g = (register_value * 49)
But when OCR = 1600 or 3200Hz, what is the factor.
I had red in datasheet that in this case LSB is always zero. So what will be coversion factor or it will remain same = 49.
3. I had calibrated the adxl375 by placing it in z = +1g & other axis = 0.
But I have seen example in which calibrate in all six axis is done:
But how to calculate final offset from these six offset values?
Or should I take there average.
4. Edit: I have been able to read DEV id properly & SPi speed is 3.75Mhz.
#define ADXL_REG_DEV_ID (0x00)
#define ADXL_VAL_DEV_ID (0xe5)
#define ADXL_REG_PW_CTRL (0x2d)
#define ADXL_REG_INT_EN (0x2e)
#define ADXL_REG_INT_MAP (0x2f)
#define ADXL_REG_DATA_FM (0x31)
#define ADXL_REG_DATA_RATE (0x2c)
#define ADXL_REG_DATAX0 (0x32)
//take 100 samples & average
adxl_read_offset_values(&x_val , &y_val ,&z_val);
x_val *= 49;
y_val *= 49;
z_val *= 49;
//offset for x:1274 , y: 1225 , z:1597
void adxl_read_g_values(int16_t *x_val , int16_t *y_val , int16_t *z_val)
adxl_read_reister(ADXL_REG_DATAX0 , 6U , &values);
*x_val = (s16_t)( ((u16_t)values << 8U) | ((u16_t)values) ) ;
*y_val = (s16_t)( ((u16_t)values << 8U) | ((u16_t)values) ) ;
*z_val = (s16_t)( ((u16_t)values << 8U) | ((u16_t)values) ) ;
data = adxl_read(ADXL_REG_DEV_ID);
if(0xe5 != data)
/* power ctrl */
adxl_write(ADXL_REG_PW_CTRL , 0x00);
adxl_write_register(ADXL_REG_DATA_FM , 0x0bU);
adxl_write_register(ADXL_REG_DATA_RATE , 0x0dU);
adxl_write_register(ADXL_REG_PW_CTRL , 0x08U);
void adxl_write_register(uint8_t address , uint8_t value)
void adxl_read_reister(uint8_t address , uint32_t no_bytes , uint8_t *values)
uint8_t reg_add = 0x80U | address; /* msb is high fro reading */
if(no_bytes > 1U) /* for multi read bit 6 is also set */
reg_add = reg_add | 0x40U;
/* send address */
/* sent bytes */
for(cnt = 0U ; (cnt< no_bytes) ; cnt++ )
values[cnt] = adxl_spi_byte(0xffU);