- Top Results

See all results

- Bosch Sensortec Community
- Discuss
- MEMS sensors forum
- BMA456 offset compensation

Turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

Options

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Mute
- Printer Friendly Page

Options

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

12-22-2021 05:35 AM

Hi,

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,

Solved! Go to Solution.

14 REPLIES 14

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

12-23-2021 03:57 AM

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

Z axis negative placement

sign

/* '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.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

12-23-2021 06:03 AM

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?

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

12-23-2021 06:28 AM

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().

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

12-23-2021 06:54 AM

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

Andy

- Top Results

See all results