cancel
Showing results for 
Search instead for 
Did you mean: 

How to calculate tilted information in LIS331DLH

gckk1992
Associate
Posted on May 13, 2015 at 07:34

Hi,

I wish to calculate the tilted information using LIS331DLH accelerometer. I get the code to calculate tilted information when HP filter is not enabled.(I have added in this post) . when filter not enabled , they multiply z axis with 100000 and divide the result by 1024 and calculate the angle. How can I calculate the tilted information when HP filter enabled?

/* 
**If condition is true, then acceleration is along negative x-axis.
**Else it is along positive x-axis.
*/
if(x_axis & 0x0800)
{
x_axis = ~x_axis;
x_axis = x_axis + 1;
x_axis = x_axis & 0x0fff;
x_direction = -1;
}
/* 
**If condition is true, then acceleration is along negative y-axis.
**Else it is along positive y-axis.
*/
if(y_axis & 0x0800)
{
y_axis = ~y_axis;
y_axis = y_axis + 1;
y_axis = y_axis & 0x0fff;
y_direction = -1;
}
/* 
**If condition is true, then acceleration is along negative z-axis.
**Else it is along positive z-axis.
*/
if(z_axis & 0x0800)
{
z_axis = ~z_axis;
z_axis = z_axis + 1;
z_axis = z_axis & 0x0fff;
z_direction = -1;
} 
/* 
**cosine-inverse(z_axis/g) gives the degree by which
**the device is tilted. 1g is eqvivalent to 1024 digital
**value.
*/
z_axis = (z_axis * 100000) / 1024; 
/*
**(z_axis/g) results in a fraction. The function 'BinarySearch()'
**searches for the fraction in the cosine lookup table. The return
**value is the index where fraction is found.This is nothing
**but the degree by which device is tilted i.e (cosine-inverse(z_axis/g).
*/
Index = BinarySearch(z_axis, 90);
if( Index != 0)
{
if( y_axis > x_axis)
{
if(y_direction == -1)
{
y_direction = 1;
SB_HalUART_USCIA1_WriteString('' Tilted Left @ '');
}
else
{
SB_HalUART_USCIA1_WriteString(''Tilted Right @ '');
}
}
else
{
if(x_direction == -1)
{
SB_HalUART_USCIA1_WriteString(''Tilted Backward @ '');
}
else
{
SB_HalUART_USCIA1_WriteString(''Tilted forward @ '');
}
}
}
if(((y_direction == 1) && (z_direction == -1)) || 
((y_direction == -1) && (z_direction == -1)))
{
Index = 180 - Index;
}
x_direction = 1;
y_direction = 1;
z_direction = 1; 
SB_HalUART_USCIA1_SendInteger(Index);
SB_HalUART_USCIA1_WriteString(''degree'');
Binary Search function::::
/*
**The function 'BinarySearch()' searches for the fraction in the cosine lookup table.
**The return value is the index where fraction is found.This is nothing
** but the degree by which device is tilted i.e (cosine-inverse(z_axis/g).
*/
static int32 BinarySearch(uint32 z, uint32 n)
{
int32 low, high, mid = 0;
low = 0;
high = n - 1;
while(low <= high)
{
mid = (low + high) / 2;
if(z < 
cosine
[mid])
{
low
= 
mid
+ 1;
}
else if(z > cosine[mid])
{
high = mid - 1;
}
else
{
return mid;
}
}
return mid;
}
Cosine lookup table:
/* This array is used as cosine lookup table.
** Each index of this array represnts the degree(0 to 90). The value at 
** the corresponding index represents the cosine value of the degree.
*/
uint32 cosine [] = {10000, 99985, 99939, 99863, 99756, 99619, 99452, 99255,
99027, 98769, 98481, 98163, 97815, 97437, 97437,
96593, 96126, 95630, 95106, 94552, 93969, 93358,
92718, 92050, 91355, 90631, 89879, 89101, 88295,
87462, 85717, 84805, 83867, 82904, 81915, 80902,
79864, 78801, 77715, 76604, 75471, 74314, 73135,
71934, 69466, 68200, 66913, 65606, 64279, 62932,
61566, 60182, 58779, 57358, 55919, 54464, 52992,
51504, 48481, 46947, 45399, 43837, 42262, 40674,
39073, 37461, 35837, 34202, 32557, 30902, 29237,
27564, 25882, 24192, 22495, 20791, 19081, 17365,
15643, 13917, 12187, 10453, 8716, 6976, 5234,
3490, 1745, 0};

Thanks in advance. Regards, Keerthi G #accelerometer #lis331dlh
0 REPLIES 0