|
遇到的问题:首先先将hmc5883的pdf那句话引进来 “数据输出 X 寄存器是两个 8 位寄存器,数据输出寄存器 A 和 B。这些寄存器储存从通道 X 所测量结果。数据
输出 X 寄存器 A 储存一个来自测量结果中的 MSB(高位数据),数据输出 X 寄存器 B 储存一个来自测量结果中
的 LSB(低位数据)。存储在这两个寄存器的值是一个 16 位值以二进制的补码形式存在,其范围是 0xF800
到 0x07FF。” 这是HMC5883数据输出X寄存器的介绍,- #if 1
- void COMPASS_Read(uint8_t *BUF)
- {
- u8 i;
- IIC_Start();
- IIC_Write8Bit(0x3C); //¡¤¡é?¨ª¨¦¨¨¡À?¦Ì??¡¤+D¡äD?o?
- IIC_TestAck();
- IIC_Write8Bit(0x03); //¡¤¡é?¨ª¡ä?¡ä¡é¦Ì£¤?a¦Ì??¡¤¡ê?¡ä¨®0x3?a¨º?
- IIC_TestAck();
- IIC_Start(); //?e¨º?D?o?
- IIC_Write8Bit(0x3D); //¡¤¡é?¨ª¨¦¨¨¡À?¦Ì??¡¤+?¨¢D?o?
- IIC_TestAck();
-
- for (i=0; i<6; i++) //¨¢?D??¨¢¨¨?6??¦Ì??¡¤¨ºy?Y¡ê?¡ä?¡ä¡é?DBUF
- {
- *BUF = IIC_Read8Bit(); //BUF[0]¡ä?¡ä¡é¨ºy?Y
- BUF++;
- if (i == 5)
- {
- IIC_NoAck(); //¡Á?o¨®¨°???¨ºy?YD¨¨¨°a??NOACK
- }
- else
- {
- IIC_Ack(); //??¨®|ACK
- }
- }
- IIC_Stop(); //¨ª¡ê?1D?o?
- // IIC_DelayMs(5);
-
-
- }
- #endif
- void MPU6050_CONVENT()
- {
- uint8_t buf[6];
-
- COMPASS_Read(&buf);
-
- ACC.X=MPU6050_Read(ACCEL_XOUT_H)-ACC_OFFSET.X;
- ACC.Y=MPU6050_Read(ACCEL_YOUT_H)-ACC_OFFSET.Y;
- ACC.Z=MPU6050_Read(ACCEL_ZOUT_H)-ACC_OFFSET.Z;
-
- GYR_RATE.X=MPU6050_Read(GYRO_XOUT_H);
- GYR_RATE.Y= MPU6050_Read(GYRO_YOUT_H);
- GYR_RATE.Z=MPU6050_Read(GYRO_ZOUT_H);
-
- GYR.X= GYR_RATE.X-GYR_OFFSET.X;
- GYR.Y= GYR_RATE.Y-GYR_OFFSET.Y;
- GYR.Z= GYR_RATE.Z-GYR_OFFSET.Z;
-
- // COMPASS.X=(buf[0] << 8)| buf[1];
- // COMPASS.Y=(buf[2] << 8)| buf[3];
- // COMPASS.Z=(buf[4] << 8)| buf[5];
-
- COMPASS.X=buf[0];
- COMPASS.Y=buf[2];
- COMPASS.Z=buf[4];
-
复制代码 我的程序是这样,根据那个pdf上所说,我的数据的高位buf[0]应该是0XF8----0X7F,但是我正常输出(磁力计旁边不放什么磁场类东西)的确实0xff或者0xfe,我原以为是补码的问题,0xff/0xfe是补码,源码是0x01/0x02,这到可以解释,但是我将我的风扇放旁边时就是0xf0,这个值又是正常的,所以有点纳闷,。低位输出没什么问题,自检输出的值也都是对的。所以,我有点没弄不懂了。 |
|