晟字五行属什么| 组胺过敏是什么意思| 药流后吃什么药| 七夕节什么时候| 非食健字是什么意思| 光屏是什么| 肠胃蠕动慢吃什么药| 胃痛吃什么药好| 七月八日是什么星座| 月经期间吃什么补气血| 乌龟为什么喜欢叠罗汉| 什么时候有流星| 冬季吃什么| 在什么情况下最容易怀孕| 大红袍适合什么季节喝| 福星贵人是什么意思| 孟母三迁的故事告诉我们什么道理| 血管性头痛吃什么药| 9月9日什么星座| 至加秦是什么字| 芹菜煮水喝有什么功效| 一岁宝宝流鼻涕吃什么药| 什么什么龙什么| 间接胆红素偏高什么意思| pra是什么意思| 蔻驰香水属于什么档次| 耳朵痛吃什么药| q波异常是什么意思| 螺内酯片治什么病| 月经每次都推迟是什么原因| 什么是扦插| us什么意思| 三月二十六是什么星座| 早年晚岁总无长是什么意思| 好高什么远| 肺部肿瘤切除后吃什么| 什么原因导致卵巢早衰| 中国女人裹脚是从什么时候开始| 犯法是什么意思| 书五行属性是什么| 脚环肿是什么原因引起的| 人为什么要有性生活| 酸奶能做什么美食| 金骏眉是什么茶类| 为什么打哈欠会传染| 白芷泡水喝有什么功效| 48是什么意思| 腿抽筋吃什么钙片好| 系少一撇叫什么| 爱我永不变是什么歌| 减脂期吃什么| 应激反应是什么意思| 病人说胡话是什么征兆| 6月22什么星座| 为什么现在不建议输液| 58年属什么生肖| 扁桃体肥大是什么原因造成的| 你的书包里有什么英文| 马步鱼为什么是甜的| 前列腺钙化灶是什么| 大暑是什么时间| 花是植物的什么器官| 女性出汗多是什么原因| 小巫见大巫是什么意思| giuseppe是什么牌子| 请什么自什么| 胃炎不能吃什么食物| 什么是熊猫血| 晚上八点半是什么时辰| 紫苏有什么功效与作用| 为什么要打肝素| 人彘是什么意思| 翩翩起舞是什么意思| 狡兔三窟什么意思| 同位分是什么意思| 7月17什么星座| guou是什么牌子的手表| 氨咖黄敏胶囊治什么| 生脉饮适合什么人群| 肛塞是什么东西| 胃出血有什么症状表现| 操是什么意思| 菠萝蜜是什么季节的水果| kai是什么意思| 贫血吃什么好| 静脉曲张用什么药| 诺五行属什么| 姓姜的男孩起什么名字好| 纵什么意思| 钠低会出现什么症状| 女人绝经后靠什么排毒| 一个黑一个出读什么| 胸部发炎是什么症状| 蝉联是什么意思| 健胃消食片什么时候吃| 三手烟是什么意思| 减肥可以吃什么主食| 为什么一进去就射了| 贝前列素钠片主治什么病| 梦见摘辣椒是什么意思| 建议MRI检查是什么意思| 女人梦见仇人代表什么| 软著是什么| 什么是激素| 闹乌龙是什么意思| mgd是什么意思| 什么鱼最好养| 肺部条索影是什么意思| 蝗虫吃什么| 12月15号是什么星座| 血压高可以吃什么水果| 巴甫洛夫的狗比喻什么| 头颅mri是什么检查| 葛根和什么搭配泡水好| 膝盖咔咔响是什么原因| 什么人不用电| 上午9点是什么时辰| 抗性糊精是什么| 天天喝可乐有什么危害| 什么是好人| 正常尿液是什么颜色| 理疗师是做什么的| 孩子铅高有什么症状| 肠道炎有什么症状| 殚精竭虑什么意思| 勇气是什么| 泌尿科主要检查什么| 10月17是什么星座| 右肺下叶纤维灶是什么意思| 当今社会做什么赚钱| ivory是什么意思| 亚历山大王什么档次| 吃桑葚有什么好处| 刮痧是什么原理| 营卫不和是什么意思| tvb是什么| 尿道炎吃什么药比较好的快| 面色无华什么意思| 7月9日是什么星座| 抱大腿什么意思| 胃疼恶心吃什么药效果好| 为什么晚上不能晾衣服| 双肺上叶肺大泡是什么意思| 56年属什么生肖| bridge什么意思| 脓血症是什么病严重吗| 什么的雾| 位移是什么| 千千阙歌是什么意思| crispi是什么牌子| vod是什么意思| 黄豆什么时候播种| 知了吃什么| 讨好的笑是什么笑| 备孕不应该吃什么| 梦见已故老人是什么预兆| 家里停电打什么电话| 青光眼是什么症状| ag是什么意思| 乳果糖什么时候吃效果更佳| 傲气是什么意思| 1988年是什么生肖| 吃什么头发长的快| 梦见过河是什么意思| 每天半夜两三点醒是什么原因| 眉毛白是什么原因引起的| 苦海无涯回头是岸是什么意思| lyocell是什么面料| 雷人是什么意思啊| 法式刘海适合什么脸型| 荔枝可以做什么| 柠檬可以做什么| 射手座跟什么星座最配| 巴戟天为什么要抽芯| 手机什么时候发明的| 粽子叶子是什么叶子| 喉咙干咳吃什么药| 眼屎多吃什么药效果好| 看淋巴挂什么科室| 插入阴道什么感觉| 法脉是什么意思| 今天什么日子| 苍蝇馆子什么意思| 漫反射是什么意思| 女人肾阴虚吃什么药| 什么是辣木籽| 火锅油碟是什么油| 发改委主任什么级别| 庙会是什么意思| hcy是什么意思| 发热出汗是什么原因| 拉肚子吃什么最好| 8点是什么时辰| 心脏不好挂什么科室| 什么是朱砂| 祸祸是什么意思| 身上老出汗是什么原因引起的| beginning什么意思| 1月27日是什么星座| 萎缩性胃炎吃什么药效果好| 煲汤放什么药材补气血| 黄花胶是什么鱼的胶| 布施什么意思| mr平扫是什么检查| 猪肝可以钓什么鱼| 怀孕前三个月要注意什么| 大三阳转小三阳意味着什么| maybach是什么车| 女宝胶囊的作用和功效是什么| 天津有什么特产| 神志不清是什么意思| 北京的区长是什么级别| 澳门是什么时候回归的| 八八年属什么生肖| 处cp是什么意思| 三焦是什么| 胆汁反流用什么药| 纸醉金迷是什么意思| 胃胀气吃什么药好| 眼睛飞蚊症吃什么药| 肌肉萎缩看什么科| 什么的愿望| 每天早上起床口苦是什么原因| 鹿角粉有什么功效和作用| 殳是什么意思| 外油内干是什么肤质| 什么东西燃烧脂肪最快| 腰椎间盘突出适合什么运动| 拖鞋什么材质的好| shark是什么牌子| 牛角尖是什么意思| opt是什么| 五行中什么生木| 1985年属什么| 经期适合吃什么食物| 七四年属什么生肖| 为什么来姨妈左侧输卵管会痛| 天麻治什么病| 高温天气喝什么茶解暑| 低血压吃什么好的最快| 迪奥是什么意思| 三什么五什么| 甲状腺低是什么意思| 梦见狗打架是什么意思| imf是什么意思| 月经期间肚子疼是什么原因| 淋巴细胞百分比低是什么意思| 飞蚊症滴什么眼药水| 事物指的是什么| kt什么意思| 4月18日什么星座| 糖化血红蛋白是什么| 腿痛挂什么科| 尿道口发炎用什么药| 椎间盘膨隆是什么意思| 女朋友生日送什么礼物好| pco2是什么意思| 干白是什么酒| 夏天喝什么汤最好| 双侧半卵圆中心缺血灶是什么意思| 喉咙有白点是什么原因| 气化是什么意思| 口干口苦吃什么中成药| 皮肤黄是什么原因引起的| 百度
打印
[RISC-V MCU 应用开发]

三铵复合肥是什么

[复制链接]
633|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
点赞|  楼主 | 2025-7-27 20:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式



MPU6050是一个6轴姿态传感器(3轴加速度计和3轴陀螺仪传感器),可以测量芯片自身X、Y、Z轴的加速度、角度参数,通过数据融合,可以得到姿态角。
mpu6050在运动控制、车辆和飞行器控制等方面应用非常的多。


MPU6050作为一个6轴姿态传感器,其中3轴加速度计为x、y、z三个方向的加速度,3轴陀螺仪传感器为围绕x、y、z旋转的加速度。


在MPU6050中,X、Y、Z轴都具有一个加速度计,假设芯片里有6个测力的秤组成一个正方体,正方体内部放一个大小正好的单位质量小球,小球压在一个面上,就会产生对应轴的数据输出。如果压在上面为正值,压在下面为负值,6个面测的力就是3个轴的加速度值。



MPU6050芯片内部的陀螺仪测量的实时角速度,分别表示了此时芯片绕X、Y、Z轴旋转的角速度。对角速度进行积分,就可以得到角度。




相关帖子

沙发
点赞|  楼主 | 2025-7-27 20:30 | 只看该作者
本帖最后由 点赞 于 2025-7-27 20:34 编辑

MPU6050参数:

?一、加速度计?


量程:±2g、±4g、±8g、±16g(默认±2g)。????
分辨率:16位ADC。??


二、陀螺仪?
量程:±250°/s、±500°/s、±1000°/s、±2000°/s(默认±250°/s)。????
灵敏度误差:±1%。??


三、其他特性
?
内置温度传感器(用于漂移补偿)。??
数字运动处理器(DMP):支持四元数/欧拉角输出,减轻主控负担。??
采样率:加速度计1kHz,陀螺仪8kHz(DMP融合输出200Hz)。??


?四、电气特性?


工作电压:2.375V~3.46V(模块支持3.3V/5V输入)。??

功耗:6轴模式≤3mA,睡眠模式5μA。??

接口:I2C(400kHz,默认地址0x68/0x69),SPI(仅MPU6000支持)









板凳
点赞|  楼主 | 2025-7-27 20:43 | 只看该作者
电路原理图


MPU6050 模块内部自带稳压电路,可兼容 3.3V/5V 的供电电压,采用先进的数字滤波技术,提高精度同时抑制了测量噪声。通讯方面,MPU6050 保留了 IIC 接口,高级用户能够采样底层测量数据。值得一提的是,芯片集成了 DMP (Digital Motion Processor)数字动态处理器(以后会用到,实现平衡小车姿体平衡)从陀螺仪、加速度计以及外接的传感器接收并处理数据,处理结果可以从 DMP 寄存器读出,或通过 FIFO(First In First Out) 缓冲。下图为模块的原理图:


地板
点赞|  楼主 | 2025-7-27 20:49 | 只看该作者
本帖最后由 点赞 于 2025-7-27 20:52 编辑

HPM5361与MPU6050的连接:

使用的HPM5361开发板P1接口有两组I2C接口,这里使用I2C0接口,及PB03和PB02引脚。



这两个引脚,在开发板上已经有了10K的上拉电阻,使用的mpu6050上也有4.7k的上拉电阻,这里可以共存,不需要特殊处理。

5
点赞|  楼主 | 2025-7-27 20:52 | 只看该作者
本帖最后由 点赞 于 2025-7-27 21:16 编辑

工程创建及资源配置:
一、新建工程

打开RT-Thread Studio,在菜单选:文件-->新建-->RT-Thread 项目,在打开的“新建项目”选项卡,填写项目名称,选择“基于开发板”,其他选项默认,点“完成”按钮。



二、配置工程资源

双击工程下的“RT-Thread Setting”,打开RT-Thread Setting选项卡。
在软件包项目下,点“添加软件包”,在打开的搜索页面搜索“mpu”,在出现的项目中点“mpu6xxx“软件包的”添加“按钮。


我这里已经添加完毕。
在”软件包“标签页,配置mpu6xxx软件包:


在”组件“标签页打开”使用I2C设备驱动程序“

在”硬件“标签页,打开”Enable I2C“选项,并打开I2C0。

671356886268f0cbe5.png (101.02 KB )

671356886268f0cbe5.png
6
点赞|  楼主 | 2025-7-27 20:56 | 只看该作者
本帖最后由 点赞 于 2025-7-27 21:34 编辑

主要代码:
mpu6xxx.c文件:
写寄存器:

static rt_err_t mpu6xxx_write_reg(struct mpu6xxx_device *dev, rt_uint8_t reg, rt_uint8_t data)
{
    rt_int8_t res = 0;
#ifdef RT_USING_I2C
    struct rt_i2c_msg msgs;
    rt_uint8_t buf[2] = {reg, data};
#endif
    if (dev->bus->type == RT_Device_Class_I2CBUS)
    {
#ifdef RT_USING_I2C
        msgs.addr  = dev->i2c_addr;    /* slave address */
        msgs.flags = RT_I2C_WR;        /* write flag */
        msgs.buf   = buf;              /* Send data pointer */
        msgs.len   = 2;

        if (rt_i2c_transfer((struct rt_i2c_bus_device *)dev->bus, &msgs, 1) == 1)
        {
            res = RT_EOK;
        }
        else
        {
            res = -RT_ERROR;
        }
#endif
    }
    else
    {
#ifdef RT_USING_SPI
        res = rt_spi_send_then_send((struct rt_spi_device *)dev->bus, ?, 1, &data, 1);
#endif
    }
    return res;
}
读寄存器:

static rt_err_t mpu6xxx_read_regs(struct mpu6xxx_device *dev, rt_uint8_t reg, rt_uint8_t len, rt_uint8_t *buf)
{
    rt_int8_t res = 0;
#ifdef RT_USING_I2C
    struct rt_i2c_msg msgs[2];
#endif
#ifdef RT_USING_SPI
    rt_uint8_t tmp;
#endif
    if (dev->bus->type == RT_Device_Class_I2CBUS)
    {
#ifdef RT_USING_I2C
        msgs[0].addr  = dev->i2c_addr;    /* Slave address */
        msgs[0].flags = RT_I2C_WR;        /* Write flag */
        msgs[0].buf   = ?             /* Slave register address */
        msgs[0].len   = 1;                /* Number of bytes sent */

        msgs[1].addr  = dev->i2c_addr;    /* Slave address */
        msgs[1].flags = RT_I2C_RD;        /* Read flag */
        msgs[1].buf   = buf;              /* Read data pointer */
        msgs[1].len   = len;              /* Number of bytes read */

        if (rt_i2c_transfer((struct rt_i2c_bus_device *)dev->bus, msgs, 2) == 2)
        {
            res = RT_EOK;
        }
        else
        {
            res = -RT_ERROR;
        }
#endif
    }
    else
    {
#ifdef RT_USING_SPI
        //The first bit of the first byte contains the Read/Write bit and indicates the Read (1) or Write (0) operation.
        tmp = reg | 0x80;

        res = rt_spi_send_then_recv((struct rt_spi_device *)dev->bus, &tmp, 1, buf, len);
#endif
    }
    return res;
}
写寄存器的bit位:

static rt_err_t mpu6xxx_write_bit(struct mpu6xxx_device *dev, rt_uint8_t reg, rt_uint8_t bit, rt_uint8_t data)
{
    rt_uint8_t byte;
    rt_err_t res;

    res = mpu6xxx_read_regs(dev, reg, 1, &byte);
    if (res != RT_EOK)
    {
        return res;
    }

    byte = (data != 0) ? (byte | (1 << bit)) : (byte & ~(1 << bit));

    return mpu6xxx_write_reg(dev, reg, byte);
}
读寄存器的bit位:

static rt_err_t mpu6xxx_read_bit(struct mpu6xxx_device *dev, rt_uint8_t reg, rt_uint8_t bit, rt_uint8_t *data)
{
    rt_uint8_t byte;
    rt_err_t res;

    res = mpu6xxx_read_regs(dev, reg, 1, &byte);
    if (res != RT_EOK)
    {
        return res;
    }

    *data = byte & (1 << bit);

    return RT_EOK;
}
写寄存器的多个bit位:

static rt_err_t mpu6xxx_write_bits(struct mpu6xxx_device *dev, rt_uint8_t reg, rt_uint8_t start_bit, rt_uint8_t len, rt_uint8_t data)
{
    rt_uint8_t byte, mask;
    rt_err_t res;

    res = mpu6xxx_read_regs(dev, reg, 1, &byte);
    if (res != RT_EOK)
    {
        return res;
    }

    mask = ((1 << len) - 1) << (start_bit - len + 1);
    data <<= (start_bit - len + 1); // shift data into correct position
    data &= mask; // zero all non-important bits in data
    byte &= ~(mask); // zero all important bits in existing byte
    byte |= data; // combine data with existing byte

    return mpu6xxx_write_reg(dev, reg, byte);
}
读寄存器的多个bit位:

static rt_err_t mpu6xxx_read_bits(struct mpu6xxx_device *dev, rt_uint8_t reg, rt_uint8_t start_bit, rt_uint8_t len, rt_uint8_t *data)
{
    rt_uint8_t byte, mask;
    rt_err_t res;

    res = mpu6xxx_read_regs(dev, reg, 1, &byte);
    if (res != RT_EOK)
    {
        return res;
    }

    mask = ((1 << len) - 1) << (start_bit - len + 1);
    byte &= mask;
    byte >>= (start_bit - len + 1);
    *data = byte;

    return RT_EOK;
}
获取加速度原始数据:

static rt_err_t mpu6xxx_get_accel_raw(struct mpu6xxx_device *dev, struct mpu6xxx_3axes *accel)
{
    rt_uint8_t buffer[6];
    rt_err_t res;

    res = mpu6xxx_read_regs(dev, MPU6XXX_RA_ACCEL_XOUT_H, 6, buffer);
    if (res != RT_EOK)
    {
        return res;
    }

    accel->x = ((rt_uint16_t)buffer[0] << 8) + buffer[1];
    accel->y = ((rt_uint16_t)buffer[2] << 8) + buffer[3];
    accel->z = ((rt_uint16_t)buffer[4] << 8) + buffer[5];

    return RT_EOK;
}
获取陀螺仪原始数据:

static rt_err_t mpu6xxx_get_gyro_raw(struct mpu6xxx_device *dev, struct mpu6xxx_3axes *gyro)
{
    rt_uint8_t buffer[6];
    rt_err_t res;

    res = mpu6xxx_read_regs(dev, MPU6XXX_RA_GYRO_XOUT_H, 6, buffer);
    if (res != RT_EOK)
    {
        return res;
    }

    gyro->x = ((rt_uint16_t)buffer[0] << 8) + buffer[1];
    gyro->y = ((rt_uint16_t)buffer[2] << 8) + buffer[3];
    gyro->z = ((rt_uint16_t)buffer[4] << 8) + buffer[5];

    return RT_EOK;
}
获取mpu6050内部温度传感器原始数据:

static rt_err_t mpu6xxx_get_temp_raw(struct mpu6xxx_device *dev, rt_int16_t *temp)
{
    rt_uint8_t buffer[2];
    rt_err_t res;

    res = mpu6xxx_read_regs(dev, MPU6XXX_RA_TEMP_OUT_H, 2, buffer);
    if (res != RT_EOK)
    {
        return res;
    }

    *temp = ((rt_uint16_t)buffer[0] << 8) + buffer[1];

    return RT_EOK;
}
获取mpu6050的配置参数:

static rt_err_t mpu6xxx_get_param(struct mpu6xxx_device *dev, enum mpu6xxx_cmd cmd, rt_uint16_t *param)
{
    rt_uint8_t data = 0;
    rt_err_t res = RT_EOK;

    RT_ASSERT(dev);

    switch (cmd)
    {
    case MPU6XXX_GYRO_RANGE:  /* Gyroscope full scale range */
        res = mpu6xxx_read_bits(dev, MPU6XXX_RA_GYRO_CONFIG, MPU6XXX_GCONFIG_FS_SEL_BIT, MPU6XXX_GCONFIG_FS_SEL_LENGTH, &data);
        *param = data;
        break;
    case MPU6XXX_ACCEL_RANGE: /* Accelerometer full scale range */
        res = mpu6xxx_read_bits(dev, MPU6XXX_RA_ACCEL_CONFIG, MPU6XXX_ACONFIG_AFS_SEL_BIT, MPU6XXX_ACONFIG_AFS_SEL_LENGTH, &data);
        *param = data;
        break;
    case MPU6XXX_DLPF_CONFIG: /* Digital Low Pass Filter */
        res = mpu6xxx_read_bits(dev, MPU6XXX_RA_CONFIG, MPU6XXX_CFG_DLPF_CFG_BIT, MPU6XXX_CFG_DLPF_CFG_LENGTH, &data);
        *param = data;
        break;
    case MPU6XXX_SAMPLE_RATE: /* Sample Rate */
        /* Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV) */
        res = mpu6xxx_read_bits(dev, MPU6XXX_RA_CONFIG, MPU6XXX_CFG_DLPF_CFG_BIT, MPU6XXX_CFG_DLPF_CFG_LENGTH, &data);
        if (res != RT_EOK)
        {
            break;
        }

        if (data == 0 || data == 7) /* dlpf is disable */
        {
            res = mpu6xxx_read_regs(dev, MPU6XXX_RA_SMPLRT_DIV, 1, &data);
            *param = 8000 / (data + 1);
        }
        else /* dlpf is enable */
        {
            res = mpu6xxx_read_regs(dev, MPU6XXX_RA_SMPLRT_DIV, 1, &data);
            *param = 1000 / (data + 1);
        }
        break;
    case MPU6XXX_SLEEP: /* sleep mode */
        res = mpu6xxx_read_bit(dev, MPU6XXX_RA_PWR_MGMT_1, MPU6XXX_PWR1_SLEEP_BIT, &data);
        *param = data;
        break;
    }

    return res;
}
配置mpu6050参数:

rt_err_t mpu6xxx_set_param(struct mpu6xxx_device *dev, enum mpu6xxx_cmd cmd, rt_uint16_t param)
{
    rt_uint8_t data = 0;
    rt_err_t res = RT_EOK;

    RT_ASSERT(dev);

    switch (cmd)
    {
    case MPU6XXX_GYRO_RANGE:  /* Gyroscope full scale range */
        res = mpu6xxx_write_bits(dev, MPU6XXX_RA_GYRO_CONFIG, MPU6XXX_GCONFIG_FS_SEL_BIT, MPU6XXX_GCONFIG_FS_SEL_LENGTH, param);
        dev->config.gyro_range = param;
        break;
    case MPU6XXX_ACCEL_RANGE: /* Accelerometer full scale range */
        res = mpu6xxx_write_bits(dev, MPU6XXX_RA_ACCEL_CONFIG, MPU6XXX_ACONFIG_AFS_SEL_BIT, MPU6XXX_ACONFIG_AFS_SEL_LENGTH, param);
        dev->config.accel_range = param;
        break;
    case MPU6XXX_DLPF_CONFIG: /* Digital Low Pass Filter */
        res = mpu6xxx_write_bits(dev, MPU6XXX_RA_CONFIG, MPU6XXX_CFG_DLPF_CFG_BIT, MPU6XXX_CFG_DLPF_CFG_LENGTH, param);
        break;
    case MPU6XXX_SAMPLE_RATE: /* Sample Rate = 16-bit unsigned value.
                                 Sample Rate = [1000 -  4]HZ when dlpf is enable
                                 Sample Rate = [8000 - 32]HZ when dlpf is disable */

        //Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV)
        res = mpu6xxx_read_bits(dev, MPU6XXX_RA_CONFIG, MPU6XXX_CFG_DLPF_CFG_BIT, MPU6XXX_CFG_DLPF_CFG_LENGTH, &data);
        if (res != RT_EOK)
        {
            break;
        }

        if (data == 0 || data == 7) /* dlpf is disable */
        {
            if (param > 8000)
                data = 0;
            else if (param < 32)
                data = 0xFF;
            else
                data = 8000 / param - 1;
        }
        else /* dlpf is enable */
        {
            if (param > 1000)
                data = 0;
            else if (param < 4)
                data = 0xFF;
            else
                data = 1000 / param - 1;
        }
        res = mpu6xxx_write_reg(dev, MPU6XXX_RA_SMPLRT_DIV, data);
        break;
    case MPU6XXX_SLEEP: /* Configure sleep mode */
        res = mpu6xxx_write_bit(dev, MPU6XXX_RA_PWR_MGMT_1, MPU6XXX_PWR1_SLEEP_BIT, param);
        break;
    }

    return res;
}
获取加速度值:

rt_err_t mpu6xxx_get_accel(struct mpu6xxx_device *dev, struct mpu6xxx_3axes *accel)
{
    struct mpu6xxx_3axes tmp;
    rt_uint16_t sen;
    rt_err_t res;

    res = mpu6xxx_get_accel_raw(dev, &tmp);
    if (res != RT_EOK)
    {
        return res;
    }

    sen = MPU6XXX_ACCEL_SEN >> dev->config.accel_range;

    accel->x = (rt_int32_t)tmp.x * 1000 / sen;
    accel->y = (rt_int32_t)tmp.y * 1000 / sen;
    accel->z = (rt_int32_t)tmp.z * 1000 / sen;

    return RT_EOK;
}
获取陀螺仪数据:

rt_err_t mpu6xxx_get_gyro(struct mpu6xxx_device *dev, struct mpu6xxx_3axes *gyro)
{
    struct mpu6xxx_3axes tmp;
    rt_uint16_t sen;
    rt_err_t res;

    res = mpu6xxx_get_gyro_raw(dev, &tmp);
    if (res != RT_EOK)
    {
        return res;
    }

    sen = MPU6XXX_GYRO_SEN >> dev->config.gyro_range;

    gyro->x = (rt_int32_t)tmp.x * 100 / sen;
    gyro->y = (rt_int32_t)tmp.y * 100 / sen;
    gyro->z = (rt_int32_t)tmp.z * 100 / sen;

    return RT_EOK;
}
获取温度:

rt_err_t mpu6xxx_get_temp(struct mpu6xxx_device *dev, float *temp)
{
    rt_int16_t tmp;
    rt_err_t res;

    res = mpu6xxx_get_temp_raw(dev, &tmp);
    if (res != RT_EOK)
    {
        return res;
    }

    if (dev->id == MPU6050_WHO_AM_I)
    {
        /* mpu60x0: Temperature in degrees C = (TEMP_OUT Register Value as a signed quantity)/340 + 36.53 */
        *temp = (double)tmp / MPU60X0_TEMP_SEN + MPU60X0_TEMP_OFFSET;
    }
    else
    {
        /* mpu6500:  ((TEMP_OUT - RoomTemp_Offset)/Temp_Sensitivity)+ 21degC */
        *temp = (double)tmp / MPU6500_TEMP_SEN + MPU6500_TEMP_OFFSET;
    }

    return RT_EOK;
}
mpu6050初始化:

struct mpu6xxx_device *mpu6xxx_init(const char *dev_name, rt_uint8_t param)
{
    struct mpu6xxx_device *dev = RT_NULL;
    rt_uint8_t reg = 0xFF, res = RT_EOK;

    RT_ASSERT(dev_name);

    dev = rt_calloc(1, sizeof(struct mpu6xxx_device));
    if (dev == RT_NULL)
    {
        LOG_E("Can't allocate memory for mpu6xxx device on '%s' ", dev_name);
        goto __exit;
    }

    dev->bus = rt_device_find(dev_name);
    if (dev->bus == RT_NULL)
    {
        LOG_E("Can't find device:'%s'", dev_name);
        goto __exit;
    }

    if (dev->bus->type == RT_Device_Class_I2CBUS)
    {
        if (param != RT_NULL)
        {
            dev->i2c_addr = param;
        }
        else
        {
            /* find mpu6xxx device at address: 0x68 */
            dev->i2c_addr = MPU6XXX_ADDRESS_AD0_LOW;
            if (mpu6xxx_read_regs(dev, MPU6XXX_RA_WHO_AM_I, 1, ?) != RT_EOK)
            {
                /* find mpu6xxx device at address 0x69 */
                dev->i2c_addr = MPU6XXX_ADDRESS_AD0_HIGH;
                if (mpu6xxx_read_regs(dev, MPU6XXX_RA_WHO_AM_I, 1, ?) != RT_EOK)
                {
                    LOG_E("Can't find device at '%s'!", dev_name);
                    goto __exit;
                }
            }
            LOG_D("Device i2c address is:'0x%x'!", dev->i2c_addr);
        }
    }
    else if (dev->bus->type == RT_Device_Class_SPIDevice)
    {
#ifdef RT_USING_SPI
        struct rt_spi_configuration cfg;

        cfg.data_width = 8;
        cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;
        cfg.max_hz = MPU60X0_SPI_MAX_SPEED; /* Set spi max speed */

        rt_spi_configure((struct rt_spi_device *)dev->bus, &cfg);
#endif
    }
    else
    {
        LOG_E("Unsupported device:'%s'!", dev_name);
        goto __exit;
    }

    if (mpu6xxx_read_regs(dev, MPU6XXX_RA_WHO_AM_I, 1, ?) != RT_EOK)
    {
        LOG_E("Failed to read device id!");
        goto __exit;
    }

    dev->id = reg;

    switch (dev->id)
    {
    case MPU6050_WHO_AM_I:
        LOG_I("Find device: mpu6050!");
        break;
    case MPU6500_WHO_AM_I:
        LOG_I("Find device: mpu6500!");
        break;
    case MPU9250_WHO_AM_I:
        LOG_I("Find device: mpu9250!");
        break;
    case ICM20608G_WHO_AM_I:
    case ICM20608D_WHO_AM_I:
        LOG_I("Find device: icm20608!");
        break;
    case 0xFF:
        LOG_E("No device connection!");
        goto __exit;
    default:
        LOG_W("Unknown device id: 0x%x!", reg);
    }

    res += mpu6xxx_get_param(dev, MPU6XXX_ACCEL_RANGE, &dev->config.accel_range);
    res += mpu6xxx_get_param(dev, MPU6XXX_GYRO_RANGE, &dev->config.gyro_range);

    res += mpu6xxx_write_bits(dev, MPU6XXX_RA_PWR_MGMT_1, MPU6XXX_PWR1_CLKSEL_BIT, MPU6XXX_PWR1_CLKSEL_LENGTH, MPU6XXX_CLOCK_PLL_XGYRO);
    res += mpu6xxx_set_param(dev, MPU6XXX_GYRO_RANGE, MPU6XXX_GYRO_RANGE_250DPS);
    res += mpu6xxx_set_param(dev, MPU6XXX_ACCEL_RANGE, MPU6XXX_ACCEL_RANGE_2G);
    res += mpu6xxx_set_param(dev, MPU6XXX_SLEEP, MPU6XXX_SLEEP_DISABLE);

#ifdef PKG_USING_MPU6XXX_MAG
    mpu6xxx_write_reg(dev, MPU6XXX_RA_USER_CTRL, 0x20);
    mpu92_mag_write_reg(dev, AK8963_REG_CNTL2, 0x01);      /* [0]  Reset Device                  */
    rt_thread_mdelay(1);
    mpu92_mag_write_reg(dev, AK8963_REG_CNTL1, 0x00);      /* [1]  Power-down mode               */
    mpu92_mag_write_reg(dev, AK8963_REG_CNTL1, 0x0F);      /* [2]  Fuse ROM access mode          */
    mpu92_mag_write_reg(dev, AK8963_REG_CNTL1, 0x00);      /* [3]  Power-down mode               */
    rt_thread_mdelay(1);    // 100us
    mpu92_mag_write_reg(dev, AK8963_REG_CNTL1, 0x16);      /* [4]  16bits and Continuous measurement mode 2 */

    /* config mpu9250 i2c */
    rt_thread_mdelay(2);
    mpu6xxx_write_reg(dev, MPU6XXX_RA_I2C_MST_CTRL, 0x5D);
    rt_thread_mdelay(2);
    mpu6xxx_write_reg(dev, MPU6XXX_RA_I2C_SLV0_ADDR, AK8963_I2C_ADDR | 0x80);
    rt_thread_mdelay(2);
    mpu6xxx_write_reg(dev, MPU6XXX_RA_I2C_SLV0_REG, AK8963_REG_ST1);
    rt_thread_mdelay(2);
    mpu6xxx_write_reg(dev, MPU6XXX_RA_I2C_SLV0_CTRL, MPU6500_I2C_SLVx_EN | 8);
    rt_thread_mdelay(2);
    mpu6xxx_write_reg(dev, MPU6XXX_RA_I2C_SLV4_CTRL, 0x09);
    rt_thread_mdelay(2);
    mpu6xxx_write_reg(dev, MPU6XXX_RA_I2C_MST_DELAY_CTRL, 0x81);
#endif

    if (res == RT_EOK)
    {
        LOG_I("Device init succeed!");
    }
    else
    {
        LOG_W("Error in device initialization!");
    }
    return dev;

__exit:
    if (dev != RT_NULL)
    {
        rt_free(dev);
    }
    return RT_NULL;
}


7
点赞|  楼主 | 2025-7-27 21:36 | 只看该作者
效果验证:
在串口调试工具,输入:
8
点赞|  楼主 | 2025-7-27 21:50 | 只看该作者
效果验证:
在串口调试工具,输入:
mpu6xxx_test
会打印mpu6050的加速度和陀螺仪数据如下:

3136868862bbe2bf6d.png (73.36 KB )

3136868862bbe2bf6d.png
9
ShimmeringDawn| | 2025-7-28 11:37 | 只看该作者
老哥求例程
10
fanzq2005| | 2025-7-28 19:38 | 只看该作者
谢谢分享,大家一起进步~!谢谢分享,大家一起进步~!
11
魔法森林精灵| | 2025-8-1 12:00 | 只看该作者
MPU6050的数据融合技术确实在很多领域都有应用,特别是在需要精确姿态控制的场合。
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

19

帖子

0

粉丝
50年婚姻是什么婚 孕妇查凝血是检查什么 紧急避孕药什么时候吃最有效 生物学是什么 青石是什么石头
什么是硬下疳 血稠吃什么食物好得快 泌尿外科主要检查什么 鼓动是什么意思 小孩腰疼是什么原因
猪下水是什么 肾功能不好有什么症状 动卧是什么意思 喝什么饮料解酒最快最有效 受持是什么意思
人中上窄下宽代表什么 吃苹果有什么好处 会厌炎是什么病 对策是什么意思 肛门痒痒的是什么原因
domestic是什么意思hcv9jop5ns3r.cn 嘴巴疱疹用什么药膏hcv8jop3ns6r.cn 六月初三是什么日子hcv8jop7ns0r.cn 巨石强森是什么人种hcv7jop5ns4r.cn 消炎药吃多了有什么副作用hcv7jop9ns1r.cn
鱼子酱什么味道liaochangning.com 喝什么利尿效果最好hcv9jop7ns5r.cn 睡觉爱做梦是什么原因hcv9jop4ns7r.cn 这个季节种什么菜合适hcv8jop3ns6r.cn 美女指什么生肖hcv8jop8ns0r.cn
发烧打冷颤是什么原因tiangongnft.com 感染是什么意思hcv8jop6ns7r.cn 舌头辣辣的是什么原因huizhijixie.com 手机账号是什么hcv8jop3ns6r.cn 珠胎暗结是什么意思imcecn.com
525什么星座hcv8jop9ns2r.cn 头痛是什么原因hcv8jop3ns3r.cn 失眠吃什么药最有效hcv8jop8ns5r.cn 小马拉大车什么意思hcv9jop6ns5r.cn 鸟加一笔变成什么字hcv9jop6ns9r.cn
百度