RT_Thread sensor框架下的MPU6050,IIC读取

2023年7 月 10日 RT-Thread Studio 版本: 2.2.6 可用

这是一个小白测试用记录,大佬互喷,欢迎指出问题
整体来说,只有一个find找名字是个坑

建立工程

略,后续补充

屏蔽cubemax生成的代码

略,后续补充

打开需要的片上外设

略,后续补充

使用rt_thread settings添加mpu6050软件包

略,后续补充

如何启动程序

添加6050后会在packges包出现mpu6xxx-v1.1.1
添加6050后会在packges包出现mpu6xxx-v1.1.1
打开README_ZH.md
在文章中会有这么一段程序

初始化示例


#include "sensor_inven_mpu6xxx.h"
int rt_hw_mpu6xxx_port(void)
{
    struct rt_sensor_config cfg;
    cfg.intf.dev_name = "i2c1";
    cfg.intf.user_data = (void *)MPU6XXX_ADDR_DEFAULT;
    cfg.irq_pin.pin = RT_PIN_NONE;
    rt_hw_mpu6xxx_init("mpu", &cfg);
    return 0;
}
INIT_APP_EXPORT(rt_hw_mpu6xxx_port);

将这一段代码添加到main函数之前
main函数中不需要启动,因为INIT_APP_EXPORT这个函数是自启动,需要了解可用bing一下,有文章讲解很详细,这里只做应用
下一步应当要读取MPU6050的值,但在此之前,先下载程序,在终端中查看是否有6050这个设备

终端中查看find要的name

这里取用了一个投机取巧的办法,自己不太会这个rt_thread sensor ,在初始化中,并不清楚自己初始化的函数为哪一个,导致使用官方的
rt_device_t rt_device_find(const char name);*
查找代码时,一直找不到 const char name我一直以为我的设备名称为
rt_hw_mpu6xxx_init(“mpu”, &cfg); 中的 “mpu”,但实际上并不是,这个 const char
name 名字需要在终端中查看
在这里插入图片描述
终端这里输入list_device 在终端中会弹出已经注册好的三个mpu函数 分别为 mag_mpu,
gyro_mpu和acce_mpu三个函数,可以看到type中显示为sensor Device 复制下来这三个函数。

在main函数中 代码中添加一个做测试

#define SENSOR_DEVICE_NAME    "gyro_mpu"    /* 传感器设备名称 */

rt_device_t dev;         /* 传感器设备句柄 */
/* 根据设备名称查找传感器设备,获取设备句柄 */
dev= rt_device_find(SENSOR_DEVICE_NAME);
if (dev==RT_NULL) {
            printf("MPU6050_find file.....\n");
            return -RT_ERROR;
        }

此时find函数已经完成

OPEN 6050

此时照着RT的文档中心看就可以,这里直接抄过来,添加到main函数中

rt_device_open(dev, RT_DEVICE_FLAG_RDONLY);//这里是以轮询的方式进行读取

读取6050

rt_device_read(dev, 0, &data, 1)

打印出数据

rt_kprintf("acce: x:%5d, y:%5d, z:%5d, timestamp:%5d\n", data.data.acce.x, data.data.acce.y, data.data.acce.z, data.timestamp);

最终main中是怎么样的

这里直接把文档中心的代码抄过来,现在就可以直接读取到数据了

#define SAMPLE_SENSOR_NAME       "gyro_mpu"  /* 传感器设备名称 */
#include "sensor_inven_mpu6xxx.h"
int rt_hw_mpu6xxx_port(void)
{
    struct rt_sensor_config cfg;
    cfg.intf.dev_name = "i2c1";
    cfg.intf.user_data = (void *)MPU6XXX_ADDR_DEFAULT;
    cfg.irq_pin.pin = RT_PIN_NONE;
    rt_hw_mpu6xxx_init("mpu", &cfg);
    return 0;
}
INIT_APP_EXPORT(rt_hw_mpu6xxx_port)
int main(void)
{
    rt_device_t dev;
    struct rt_sensor_data data;

    /* 查找传感器设备 */
    dev = rt_device_find(SAMPLE_SENSOR_NAME);
    /* 以只读及轮询模式打开传感器设备 */
    rt_device_open(dev, RT_DEVICE_FLAG_RDONLY);

    if (rt_device_read(dev, 0, &data, 1) == 1)
    {
        rt_kprintf("acce: x:%5d, y:%5d, z:%5d, timestamp:%5d\n", data.data.acce.x, data.data.acce.y, data.data.acce.z, data.timestamp);
    }
    rt_device_close(dev);//如果是要一直读取,将if加入while中 屏蔽掉close这个代码

    return RT_EOK;
}

!这里插入

在这里只添加了一个函数,想要读取其他值应该要添加其他两个?

不通过sensor框架直接读取mpu6050数据

https://github.com/RT-Thread-packages/mpu-6xxx
在这个文档里面,但感觉不添加到sensor框架,那不是移植的时候变得更麻烦了?复制使用过了,没有问题可以直接使用。

这段程序是用于初始化 MPU6050 传感器的函数。下面是对程序的逐行解释: 1. `u8 MPU6050_Init(void)`:定义了一个返回类型为 `u8` 的函数 `MPU6050_Init`,没有传入参数。 2. `u8 res;`:定义了一个变量 `res`,类型为 `u8`,用于存储返回值。 3. `IIC_Init();`:调用函数 `IIC_Init()`,用于初始化 IIC 总线。 4. `MPU6050_Write_Byte(MPU6050_PWR_MGMT1_REG,0X80);`:向 MPU6050 的控制寄存器 `MPU6050_PWR_MGMT1_REG` 写入数据 `0X80`,将传感器从休眠状态唤醒。 5. `delay_ms(100);`:延时 100 毫秒。 6. `MPU6050_Write_Byte(MPU6050_PWR_MGMT1_REG,0X00);`:向控制寄存器写入数据 `0X00`,将传感器设置为正常工作模式。 7. `MPU6050_Set_Gyro_Fsr(3);`:设置陀螺仪的量程为 2000°/s。 8. `MPU6050_Set_Accel_Fsr(0);`:设置加速度计的量程为 2g。 9. `MPU6050_Set_Rate(50);`:设置采样率为 50Hz。 10. `MPU6050_Write_Byte(MPU6050_INT_EN_REG,0X00);`:禁用 MPU6050 的中断功能。 11. `MPU6050_Write_Byte(MPU6050_USER_CTRL_REG,0X00);`:配置 MPU6050 的用户控制寄存器。 12. `MPU6050_Write_Byte(MPU6050_FIFO_EN_REG,0X00);`:禁用 MPU6050 的 FIFO 缓冲区。 13. `MPU6050_Write_Byte(MPU6050_INTBP_CFG_REG,0X80);`:配置 MPU6050 的中断/旁路寄存器。 14. `res=MPU6050_Read_Byte(MPU6050_DEVICE_ID_REG);`:从 MPU6050 设备 ID 寄存器中读取数据,并将其赋值给变量 `res`。 15. `if(res==MPU6050_ADDR)`:如果变量 `res` 的值等于 `MPU6050_ADDR`,执行下面的代码块。 16. `MPU6050_Write_Byte(MPU6050_PWR_MGMT1_REG,0X01);`:向控制寄存器写入数据 `0X01`,设置传感器为唤醒状态。 17. `MPU6050_Write_Byte(MPU6050_PWR_MGMT2_REG,0X00);`:配置传感器的电源管理 2 寄存器。 18. `MPU6050_Set_Rate(50);`:再次设置采样率为 50Hz。 19. `else return 1;`:如果变量 `res` 的值不等于 `MPU6050_ADDR`,返回值为 1,并结束函数。 20. `return 0;`:返回值为 0,表示初始化成功。 这个函数的作用是初始化 MPU6050 传感器,并返回一个状态值,0 表示初始化成功,1 表示初始化失败。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值