产品:https://www.adafruit.com/product/2020
数据表:https://cdn-shop.adafruit.com/datasheets/LSM9DS0.pdf
我是学生,这是我第一次使用I2c总线。我试着读取陀螺仪的基本值。我浪费了我生命的一部分来理解I2c是如何工作的。但是在阅读了数据表之后,我做了自己的脚本。 我的价值观就在那里。什么都不动,我也不知道为什么。在
Rotation in X-Axis : -1087
Rotation in Y-Axis : -28797
Rotation in Z-Axis : -15032
这是我的剧本。有人能帮我解决吗?我在和一只小猎犬一起工作。在
^{pr2}$
根据datasheet,LSM9DS0包含两个子模块:一个包含加速度计和罗盘,另一个包含陀螺仪。每个子模块位于不同的地址,由
SA0_XM
和SA0_G
管脚的状态决定。在在Adafruit module上,这些引脚被拉高,因此根据数据表中的表15和表16:
0x1d
(00011101
)0x6b
(01101011
)基于此,看来你访问的地址是正确的。这也意味着在脚本开始的时候,应该定义一些常量,比如
使用这些而不是在你的代码周围复制魔法数字。在
现在寄存器地址。由于有两个不同的设备,所以很有可能每个设备都公开一组不同的寄存器。实际上,表17显示了这种情况,尽管有点间接。重要的部分是标题为“从地址”的列,它指的是表15(加速计和罗盘)或表16(陀螺)。(在某些情况下,寄存器的符号名可能有助于区分不同之处,因为它们通常有后缀}(后一个),但并不总是这样)。在
M
(前一个)或{你的问题就在这里。对于陀螺仪,测量值在地址0x28..0x2d的寄存器中
然而,您正在从
0x08..0x0d
中读取,这些内容保留在陀螺仪模块中(由于读取结果而得到一些固定的废话,这不会是意外的)。在您似乎正确地获得了控制寄存器}。在
CTRL_REG1_G
和{当然,与地址一样,您应该为要使用的所有寄存器定义常量:
^{pr2}$等等。。。在
另外,在实际读取测量值之前,我首先要尝试的是读取设备标识寄存器,在本例中是
WHO_AM_I_G
(0x0F)。在由于这个寄存器返回一个常量,所以这是一个很好的方法来验证您正在使用正确的设备进行通信,以及通信是否正常工作。在
还有一点:不要复制粘贴代码,而是使用函数。在
例如,重构的第一步可能会产生如下结果:
有许多i2c出版物可以让您了解它是如何工作的。大多数陀螺仪和mems设备也基本上在他们的数据表中解释了这一点。但基本上是两条线,有逻辑高电平和逻辑低电平。消息通常以8位段发送。为了发送一个段,时钟线变低,然后数据转换到要发送的级别。数据线必须稳定,然后时钟就会变高。时钟变高时的数据电平是位0(数据低)或1(数据高)。首先发送设备的8位地址(实际上是7位地址,最后一位是信号读或写)。通常要写,你先发送读,然后中断,然后写。读取时,设备地址发送后,接下来的8位或16位是寄存器地址。然后设备将发送信息。写作也是如此。一些mems设备有fifo寄存器和中断,这可能有点不同。有关详细信息,请参阅各自的数据表。在
相关问题 更多 >
编程相关推荐