问题标签 [mpu6050]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
stm32 - 我无法通过 STM32F103 上的 mpu6050 使用 I2C 获取数据
我是新的 I2C 通信。我检查了一些正在运行的代码。我使用了他们使用的功能。但我无法获得任何数据。我想知道 I2C 是否必须进行初始配置?问题出在哪里。这是我写的函数:
我用 CubeMX 创建了这个项目。这是初始 I2C 配置,并且 GPIO_A 时钟线在另一个我没有写的函数中被激活:
cpu-registers - 如何对 mpu6050 的传感器寄存器进行“突发读取”?
在“MPU-6050 Register Map and Descriptions Revision 3.2”中,它讨论了从寄存器 mpu6050 突发读取数据。
如何对 mpu6050 的传感器寄存器进行“突发读取”?
c++ - 如何使用 C++ 通过 I2C 从 MPU6050 读取数据块
我使用 MPU6050 设备并获取加速度计和陀螺仪数据。
现在我需要使用 cpp 语言从 MPU6050 读取数据块。
在 Python 中很容易做到这一点:
该函数从地址 ACCEL_XOUT_H 开始读取一个数据块(14 个字节)。
以及如何在 cpp 中做同样的事情?我应该使用这个功能:
如果是,请解释我应该如何使用它。
如果否,请给我写一个例子。
i2c - MPU-6050:从 FIFO 寄存器正确读取数据
介绍
MPU-6050 是一种流行的模块,包含温度传感器、加速度计和陀螺仪。用户可以通过 I2C 或 SPI 读取传感器信息。有两个文档可公开获得,用于从 IC 寄存器中读取数据。这些是:
语境
由于总线通信延迟,通过 I2C 读取 IMU 的各个寄存器会使样本随时间偏移。因此,传感器的 X、Y 和 Z 轴寄存器的顺序读取是不同步的。为了解决这个问题,该器件提供了一个 1024 字节的内部 FIFO 队列。配置为推送到队列的数据以采样率推送到一起。因此读取 FIFO 会产生同步数据。
参见 (2),第 7.17 节:
MPU-60X0 包含一个 1024 字节的 FIFO 寄存器,可通过串行接口访问。FIFO 配置寄存器决定将哪些数据写入 FIFO。可能的选择包括陀螺仪数据、加速度计数据、温度读数、辅助传感器读数和 FSYNC 输入。FIFO 计数器跟踪 FIFO 中包含的有效数据字节数。FIFO 寄存器支持突发读取。中断函数可用于确定何时有新数据可用
问题
数据表规定,为了从 FIFO 中读取,您必须执行以下操作:
- 启用 FIFO(位 6,寄存器
0x6A
,文档 (1),第 4.29 节) - 使用要推送的传感器信息配置 FIFO(寄存器
0x23
,文档 (1),第 4.7 节)。我通过分别设置位 6、5、4 和 3 来启用XG_FIFO_EN
、YG_FIFO_EN
、ZG_FIFO_EN
和。ACCEL_FIFO_EN
如果您已执行这些步骤,则它声称(文档 (1),第 4.33 节):
数据按寄存器编号的顺序(从最低到最高)写入 FIFO。如果所有 FIFO 启用标志(见下文)均已启用并且所有外部传感器数据寄存器(寄存器 73 至 96)都与从设备相关联,则寄存器 59 至 96 的内容将以采样率顺序写入。当 FIFO_EN(寄存器 35)中相应的 FIFO 使能标志设置为 1 时,传感器数据寄存器(寄存器 59 至 96)的内容被写入 FIFO 缓冲区。
然而,我发现这并不成立。鉴于我在配置寄存器中启用的标志,我希望以下序列来自 FIFO:
然而,在读取单个寄存器时,从 FIFO 读取 12 个字节并不对应于相同的数据。当我加速 IMU 或旋转它时,它似乎也没有多大意义。因此,我不确定如何准确读取 FIFO。这是我面临的问题
问答
- 您确定您正确写入寄存器吗?:是的,我可以设置各种配置,例如采样率、中断等。我相信我能够正确地从 FIFO 中读取数据
- 您确定 FIFO 中有什么要读取的吗?: 是的,我启用了 FIFO 溢出中断。我目前在等待中断,然后从 FIFO 寄存器中读取。
- 您是否在读取之前检查了 FIFO 长度寄存器?是的,当 FIFO 溢出中断发生时,它包含 1024 字节(最大容量)。
- 其他人以前没有这样做过吗?:没有人对如何读取 FIFO 有具体的解释(例如:另一个论坛上的类似问题得到了 RTFM)。大多数与读取 FIFO 相关的可搜索问题是(a)未回答,(b)被告知使用通用 XYZ Arduino 库(我不能使用它),(c)被告知阅读数据表(我有)。
raspberry-pi - 树莓派检测不到 mpu6050
我有一个 mpu6050,我正试图让它与我的树莓派一起工作。我将以下引脚连接到树莓派,如下所示:
vcc --------- 5V(引脚 4)
gnd --------- 接地(引脚 6)
scl --------- scl(引脚 5)
sda --------- sda(引脚 3)
xda --------- 未连接
xcl --------- 未连接
添加---------未连接
int --------- 未连接
当我运行时sudo i2cdetect -y 1
,我得到:
mpu6050 上的绿灯亮。此外,mpu6050 工作正常的前一天。
c - 通过寄存器 avr c Atmega328p 正确配置 I2C
为了扩展我对 Atmega 系列编程的理解和当前知识,我开始了自己的小项目。我决定通过直接寻址它的寄存器来对 MPU6050 I2C 传感器进行编程。为了测试传感器的工作和连接,我首先使用了这个预先编写的程序(使用 Arduino 平台提供的 Wire 库):
串行监视器显示传感器的正确读数,说明传感器连接正确并正常工作。同时我连接了我的总线盗版,它嗅探 I2C 总线并显示在传感器和 atmega 芯片(Atmega328p-pu)之间发送的十六进制值。虽然我无法将它们翻译成它们的确切含义,但交流看起来很正常。
在我上传了自己的代码后,使用传感器和 Atmega328p 的数据表创建,I2C 总线几乎没有显示任何内容。这是我的代码:
总线盗版在通用总线上显示以下通信数据:
[][[][][[[]]
与我传输到缓冲区的数据完全不同。如果我等待足够长的时间,我会发现一些偶然的 0x0 或 0x00。
我尝试更改从设备的地址和写入传感器的第一个数据字节。步骤 3、7 和 11 的异常永远不会被触发。
此代码中未触及引脚 A4 和 A5(SCL 和 SDA)。我尝试将它们配置为启用上拉电阻的输入,但这也没有给出预期的结果。
传感器连接到 arduino,如下图所示:
总线盗版与 SDA 和 SCL 连接并行连接以拦截其数据。
Atmega328p 的数据表简要总结了完成 I2C 传输所需的所有步骤。我尝试正确复制这些步骤(第 21.6 节“使用 TWI”,表 21-2)。
我希望你们能发现我的错误或丢失的代码。提前非常感谢!
filter - mpu6050 配置寄存器
要在 mpu6050 中启用低通滤波器,必须根据所需的截止频率在 CONFIG 寄存器 (0x1A) 中修改前三位 [0:2]。如何设置/重置该特定位?例如,我可以使用(11111111 和 11110101)在该寄存器(1111 1111)中存储 255。但是第 6 位和第 7 位是保留的。这个可以吗?还有其他方法可以启用低通滤波器吗?
python - 结合两个 python 脚本,一个读取 IMU 另一个移动伺服电机
我是 python 的新手,但我已经能够编写一些有用的 python 代码(至少对我的工作有用)。我想结合两个 python 脚本,但我很难让它工作,我想我完全迷失了事情应该是什么样子。最终目标是让我的树莓在伺服器移动的同时读取传感器。
这是 IMU 脚本
伺服电机脚本
interrupt - “ESP32:(xQueueGenericReceive)-断言失败!” 尝试从 MPU6050 读取数据时出错
我知道,这是一个很长的问题,但你真的会帮我解决这个问题。经过3天的反复试验和研究,我没有主意了。也许你会发现我错过的一些明显的东西,或者你比我更清楚。
该项目
我目前正在建造一辆使用以下材料的小型汽车:
- DShot600 ESC(通过RMT外围设备进行传输)
- DShot Telemetry(Serial2 上的基本 UART),最重要的是:我需要轮子 RPM
- 通过应用程序进行控制的WebSockets
- 定时器中断触发每1ms发送一次数据的功能
- 每 1ms 记录一次采集的数据
- MPU6050用于加速度测量(每 1ms)。
是的,没有转向,它只需要直行 - 但它必须快速完成。“汽车”有点夸大其词
什么有效
除了 MPU 部分,我已经让所有这些都可靠地工作。我使用 Jeff Rowberg 的I2CDevLib进行获取(我只需要 x 轴加速度和原始值,没有花哨的 DMP 东西,也没有陀螺仪功能)。
什么不
问题是,每当我尝试从 MPU 获取任何数据时,都会出现[...]esp-idf/components/freertos/queue.c:1446 (xQueueGenericReceive)- assert failed!
错误。我不知道这是什么以及如何解决它。
CPU 核心分配
我在核心 1 循环上有所有对时间敏感的东西(遥测处理、MPU 处理和油门计算),而对时间不太敏感的东西(WebSockets、与 PC 的串行通信)在核心 0 上完成。
- 核心 0
- 环形
- 网络套接字
- 与 PC 的串行通信
- 中断
- 每 1ms:通过 RMT 发送 ESC 值
- 环形
- 核心 1
- 环形
- MPU数据获取(根据
millis()
功能每1ms) - 获取遥测数据
- 油门计算
- MPU数据获取(根据
- 环形
澄清一下:定时器中断和节流发送是在核心 0 上完成的。我这样做是为了让定时器中断不会干扰 MPU 数据获取(大约需要 300µs)。
我试过的
在核心 1 上处理它并不能解决它。
我读过有一个portENTER_CRITICAL
和portEXIT_CRITICAL
函数对可以暂时禁用中断。用这个包装 MPU 数据获取解决了这个问题,但在退出函数中引入了 50 毫秒的延迟。这 50ms 使 ESC 进入故障保护状态(即关闭)。
在中断函数中手动获取 MPU 数据没有帮助。这给了我Guru Meditation error
。在中断服务程序中设置一个标志并在主循环中获取它也会产生错误。
当我禁用 ESC 中断时,不会发生此错误,即使此中断是在另一个内核上处理的。
其他信息
对于 ESC 传输功能,我需要使用计时器,因为 ESC 油门值必须每 1ms 精确传输一次,最多相差 50µs。问题是遥测(ESC在我发送完整的油门数据包后立即发回)需要> 800μs(由UART外围设备异步接收)。然后另一个函数必须处理遥测轮速并将新的油门值调整为发送该值之前的值。这一切都有效。我只是想提一下,所以没有人建议我将该函数放在主循环中。
我很乐意提供更多调试信息,我只是不知道什么有用。我已经尝试了比我在这里解释的更多的东西(这会导致更长的问题)。通常,在单独的项目(仅 MPU)中获取数据可以完美地工作。所以没有损坏的电缆,没有死机或类似的东西。
提前致谢。
软件:带 Arduino 内核的 PlatformIO、Windows 10 和 Manjaro Linux(相同的错误)
硬件:Ryzen 1700、16GB RAM、Radeon Vega 56、ESP32 WROOM