qmc5883l的初始化OK,设为200hz输出,void qmc5883l_init(void)
{
qmc5883l_write_byte(QMC5883L_ADDRESS,0X09, 0x0d);//0x05);//0X0D);
qmc5883l_write_byte(QMC5883L_ADDRESS, 0X0B, 0X01);
qmc5883l_write_byte(QMC5883L_ADDRESS, 0X20, 0X40);
qmc5883l_write_byte(QMC5883L_ADDRESS, 0X21, 0X01);
}
void qmc5883l_get_mag(u8 *pbuf)
{
u8 ucStatus;
qmc5883l_read_byte(QMC5883L_ADDRESS,0x06,&ucStatus);
if(ucStatus & 0x01)
{
qmc5883l_read_reg_multi(0x00, pbuf, 6);
wmagx = ((u16)pbuf[1] << 8) + pbuf[0];
wmagy = ((u16)pbuf[3] << 8) + pbuf[2];
wmagz = ((u16)pbuf[5] << 8) + pbuf[4];
}
}
读取出来的原始数据范围是在 wmagx 在 -7300 ~ 3000 之间,和资料上-32768 ~ 32768之间不符,请教下是什么原因造成的呀
而且变化的数值和转动的角度不是线性的,在某个方向时变化时,变化角度很小,但是数值变化大,在另一个方向时变化,数值变化又很小。真是搞不明白了,就几个寄存器,还有什么地方存在问题。
特来论坛请教,请搞过的大神帮忙指导一下,非常感谢。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
QMC5883_Read(BUF);
x=BUF[1] << 8 | BUF[0];
y=BUF[3] << 8 | BUF[2];
z=BUF[5] << 8 | BUF[4];
if(x>0x7fff)x-=0xffff;
if(y>0x7fff)y-=0xffff;
if(z>0x7fff)z-=0xffff;
angle= (atan2((double)y,(double)x) * (180 / 3.14159265) + 180); // angle in degrees
printf("anglexy = %d ",angle);
angle= (atan2((double)z,(double)x) * (180 / 3.14159265) + 180); // angle in degrees
printf("anglexz = %d ",angle);
angle= (atan2((double)z,(double)y) * (180 / 3.14159265) + 180); // angle in degrees
printf("angleyz = %d ",angle);
试试参考这个
一周热门 更多>