首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从MPU9150访问磁力仪数据的问题

从MPU9150访问磁力仪数据的问题
EN

Stack Overflow用户
提问于 2014-07-10 21:00:29
回答 1查看 4.1K关注 0票数 0

输出:读取每个寄存器(对应于磁力计)时,我得到的-What是0xFF。另一方面,我能够完美地访问加速计和陀螺仪的寄存器。我已经在禁用i2c主模式和启用i2c旁路模式的情况下初始化了系统。以下是我用来初始化系统的代码:

代码语言:javascript
运行
复制
single_byte_write(0x6B,0x01);
single_byte_write(0x19,0x01);
single_byte_write(0x1A,0x02);
single_byte_write(0x1B,0x11);
single_byte_write(0x1C,0x10);
single_byte_write(0x6A,0x00);
single_byte_write(0x37,0x02);

(‘single_byte_write( address,data)将数据字节写入寄存器,同时将’address‘写入从属地址为0x69’)

我访问了accel的寄存器。还有陀螺仪。如下所示:- single_byte_read(0x75,wia_mpu);返回正确的0x68作为who_i_am寄存器。但是当我尝试访问磁力计寄存器时:- single_byte_read_compass(0x00,wia_compass);它返回0xFF,而它应该返回0x48。

为了确保single_byte_read_compass()/single_byte_write_compass()正常工作,我使用了这些函数并更改了从属地址(从‘0x0C’更改为‘0x69’)来访问accel的寄存器。还有陀螺仪。而且它工作正常。

(‘single_byte_read()’和‘single_byte_read_compass()’的区别只是前者使用从属地址作为‘0x69’,而后者使用‘0x0C’作为从属地址。我还尝试了‘0x0D’、‘0x0E’和‘0x0F’作为从机地址,但输出仍然相同。)

我还确保了MPU9150是否处于直通模式。我在示波器的帮助下检查了引脚‘ES_DA’(即pin6 )和SDA (即pin24 )的输出,结果完全相同,并启用了旁路模式。在禁用主模式和旁路模式的情况下,‘ES_DA’的输出始终为零。

我也尝试了与上面相同的过程,不只是一个而是多个MPU9150s,但输出仍然是相同的,因此很可能代码有一些问题。

EN

回答 1

Stack Overflow用户

发布于 2014-09-21 16:30:20

这是我用来初始化MPU9150的代码,它适用于我(这是我在互联网上找到的一个经过修改的arduino版本):

代码语言:javascript
运行
复制
void MPU9150::initialize(){
   write(MPU9150_PWR_MGMT_1, 0); //Wake up

   initializeCompass();
}

void MPU9150::initializeCompass(){
  this->i2cDevice.address = this->i2cDevice.compass; // 0x0C or 0x0D

  write(0x0A, 0x00); //PowerDownMode
  write(0x0A, 0x0F); //SelfTest
  write(0x0A, 0x00); //PowerDownMode

  this->i2cDevice.address = this->i2cDevice.mpu; //0x68 or 0x69

  write(0x24, 0x40); //Wait for Data at Slave0
  write(0x25, 0x8C); //Set i2c address at slave0 at 0x0C
  write(0x26, 0x02); //Set where reading at slave 0 starts
  write(0x27, 0x88); //set offset at start reading and enable
  write(0x28, 0x0C); //set i2c address at slv1 at 0x0C
  write(0x29, 0x0A); //Set where reading at slave 1 starts
  write(0x2A, 0x81); //Enable at set length to 1
  write(0x64, 0x01); //overvride register
  write(0x67, 0x03); //set delay rate
  write(0x01, 0x80);

  write(0x34, 0x04); //set i2c slv4 delay
  write(0x64, 0x00); //override register
  write(0x6A, 0x00); //clear usr setting
  write(0x64, 0x01); //override register
  write(0x6A, 0x20); //enable master i2c mode
  write(0x34, 0x13); //disable slv4
}

然后读出磁力计:

代码语言:javascript
运行
复制
void MPU9150::readCompass()
{
    data.compass.x = read(MPU9150_CMPS_XOUT_L,MPU9150_CMPS_XOUT_H);
    data.compass.y = read(MPU9150_CMPS_YOUT_L,MPU9150_CMPS_YOUT_H);
    data.compass.z = read(MPU9150_CMPS_ZOUT_L,MPU9150_CMPS_ZOUT_H);
}

其中:

代码语言:javascript
运行
复制
//MPU9150 Compass
#define MPU9150_CMPS_XOUT_L        0x4A   // R
#define MPU9150_CMPS_XOUT_H        0x4B   // R
#define MPU9150_CMPS_YOUT_L        0x4C   // R
#define MPU9150_CMPS_YOUT_H        0x4D   // R
#define MPU9150_CMPS_ZOUT_L        0x4E   // R
#define MPU9150_CMPS_ZOUT_H        0x4F   // R
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24677234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档