请教ADXL345加速度
DATA_FORMAT寄存器我设置的是0x2B,即满分辨率,三轴的偏置都都是0,范围正负16g,右对齐,X轴和Y轴静止时几乎是-50左右,可是Z轴怎么读到的都是正的,1090左右,翻转180后读到的是512,按理应该是250左右才对吧?请问这是什么情况? 右对齐的话如果是负数,由补码求原码是-(8192-x)吗?改来改去已经该晕了,大家还是直接看代码吧,有什么地方不对的请指教,非常感谢!我用的是IIC读的数据,定时器2ms读取一次
void Accelerate_Init() //加速度初始化
{
u8 Device_Check_ID;
IIC_WriteReg(ACCELERATE_ADDR,DATA_FORMAT,0x2B); //满分辨率,范围正负16g,右对齐
IIC_WriteReg(ACCELERATE_ADDR,BW_RATE,0x0C); //输出速率400HZ,带宽200HZ
IIC_WriteReg(ACCELERATE_ADDR,OFSX,0x00); //偏置为0
IIC_WriteReg(ACCELERATE_ADDR,OFSY,0x00); //偏置为0
IIC_WriteReg(ACCELERATE_ADDR,OFSZ,0x00); //偏置为0
IIC_WriteReg(ACCELERATE_ADDR,ACCE_FIFO_CTL,0x9F);
IIC_WriteReg(ACCELERATE_ADDR,POWER_CTL,0x08);
IIC_WriteReg(ACCELERATE_ADDR,INT_ENABLE,0x80);
Device_Check_ID = CheckAcce();//检查加速度传感器,是否正确
if(Device_Check_ID==0xE5)
{
printf("ACC_OK ");
}
else printf("ACC_ERROR ");
Acc_Correct(); //得到初始值
}
u8 Read_Accelerate() //读取加速度传感器
{
int AcceData;
u8 status = 0;
GetAcceFIFOStatus(&status);
if(status&0x3f)
{
IIC_ReadAccData(ACCELERATE_ADDR,0x32,AcceData,6);
AccRawData.x = (int) ( AcceData<<8|AcceData);
AccRawData.y = (int) ( AcceData<<8|AcceData);
AccRawData.z = (int) ( AcceData<<8|AcceData);
// printf("B %d, %d ",AcceData,AcceData);
if(AccRawData.x&0x1000) //补码变原码
{
AccRawData.x = -(8192-AccRawData.x);
}
if(AccRawData.y&0x1000) //补码变原码
{
AccRawData.y = -(8192-AccRawData.y);
}
if(AccRawData.z&0x1000) //补码变原码
{
AccRawData.z = -(8192-AccRawData.z);
}
return 1;
}
return 0;
}
void CalAccAngle(void) //由加速度计算角度
{
if(Read_Accelerate())
{
// AccRawData.x-=AccBase.x;
// AccRawData.y-=AccBase.y;
// AccRawData.z-=AccBase.z;
/*
AngleAcc.x=-asin(AccRawData.x/310.0)*90/1.14;
AngleAcc.y=asin(AccRawData.y/310.0)*90/1.14;
AngleAcc.z=-AccRawData.z*90.0/320;
*/
AngleAcc_tmpx=-asin(AccRawData.x/310.0)*90/1.14;
AngleAcc_tmpy=asin(AccRawData.y/310.0)*90/1.14;
m++;
if(m==NumAcc)
{
m=0;
Acc_Filter(AngleAcc_tmpx,AngleAcc_tmpy);
AngleAccLast.x=AngleAcc.x;
AngleAccLast.y=AngleAcc.y;
}
else
{
AngleAcc.x=AngleAccLast.x;
AngleAcc.y=AngleAccLast.y;
}
printf("B %d, %d, %d ",AccRawData.x,AccRawData.y,AccRawData.z);
// printf("B %.3f, %.3f, ",AngleAcc.x,AngleAcc.y);
}
}
而且我直接输出DATAZ1寄存器的值总是在2 3 4之间变化 都没出现负的 没有必要补码转源码,可以直接运算 caopeng32 发表于 2012-4-10 20:53 static/image/common/back.gif
没有必要补码转源码,可以直接运算
直接怎么用呢? 省略补码转原码(不确定你这个转换对不对,但是可以肯定的是没有必要)的过程,直接进行运算(直接加减乘除), 我用的FIFO中断,一开始中断怎么都进不去,快疯了,后来进去了,这东西必须读一次数据寄存器,然后中断才能触发,就是狗日的,手册上说的模模糊糊,我读出来四个FIFO的数据,然后取平均值,数据就不怎么对了,跳的厉害,加速度有时候跳到几个G,有没有什么办法啊
页:
[1]