Bosch Sensortec Community

    Showing results for 
    Search instead for 
    Did you mean: 

    BMA456 offset compensation

    BMA456 offset compensation

    New Poster


    I use the BMA456 sensor.

    I would like to use the API bma4_perform_accel_foc, for calculating the foc for all 3 axis - x,y,z.

    (I got a code from git hub)

    The API recieves the struct : bma4_accel_foc_g_value.

    I thought to declare - const struct bma4_accel_foc_g_value accel_g_value = {1, 1, 1, 0},  so all three axis will be calculated, but in the API code I see the following condition :

    if (((ABS(accel_g_value->x) + ABS(accel_g_value->y) + ABS(accel_g_value->z)) == 1) &&
    ((accel_g_value->sign == 1) || (accel_g_value->sign == 0)))

    which makes me think I should call one axis at a time (also in related APIs  it seems like that).

    but if so - will it be saved corrctly at the NVM? won't each call run over the previous values? 

    I don't understand what is the proper input to the accel_g_value

    Thanks in advance,

    14 REPLIES 14

    Community Moderator
    Community Moderator

    Hello Andy_253,

    In BMA456 driver code, it can be seen from the logic in the following code that the FOC of X, y and Z axes can only be done separately,  and sign is equal to '0', indicating that you are placing Z axis of the sensor positive. sign is equal to '1', indicating that you are placing Z axis of the sensor negative .

    Z axis positive placement

    FOC Z axis.png
    Z axis negative placement

    FOC Z axis negative placement.png


    /* '0' for positive input and '1' for negative input */
    uint8_t sign;

    if (((ABS(accel_g_value->x) + ABS(accel_g_value->y) + ABS(accel_g_value->z)) == 1) &&
    ((accel_g_value->sign == 1) || (accel_g_value->sign == 0)))

    So to do FOC for Z axis  accel_g_value should be  = {0, 0, 1, 0}

    FOC of other axes is similar to that of Z axis.

    With FOC, the compensation value is not saved to NVM.


    Hi, Bosch

    Thanks for your reply.

    According to your reply, I did the FOC for each axis seperately.

    But I faced the 1 issue. I read the x,y,z 128 times and calculated the average value.

    The average value of x axis is -4116(y axis : -201, z : 32). It is too big for FOC. If I did  the FOC for y,z axis, the value can reach the '0'.

    However the axis of x couldn't possible. I tested it using 2 sensors. It was same. I don't know How can I do the FOC for x axis.

    I'm attahcing the SPI packet by captured on my device. Could you please check it?

    Community Moderator
    Community Moderator

    Hello Andy_253,

    In function call of bma4_perform_accel_foc(), perform_accel_foc() had calculated the average value, don't need you do any thing out of function bma4_perform_accel_foc(). You could see the detailed code implement in bma4_perform_accel_foc().

    Hi BSTRobin,

    Yes. I know the perform_accel_foc do all of things for FOC. I didn't do anythings out of this function.

    But I means that the average of x axis is too big(-4147). Is it right value on BMA456 sensor?

    I think that If the value is bigger than 4096, I can't do the FOC.

    I want to know what factor makes the this big value and then If I inserted the BMA253 sensor on same poistion as BMA456, The value of x axis is not big.


    Thanks & Regards