单片机开发教程3 您所在的位置:网站首页 单片机无人机设计 单片机开发教程3

单片机开发教程3

2022-12-31 17:20| 来源: 网络整理| 查看: 265

文章目录 1. 简介1.1 模块原理图1.2 引脚说明1.3 接线方式 2. IIC通信2.1 IIC介绍2.2 例程讲解 3. 姿态解算3.1 欧拉角3.2 解算方法3.3 一阶互补滤波 4. 串口通信4.1 概念4.2 串口显示姿态角4.3 接线图

1. 简介

MPU6050 是 InvenSense 公司推出的整合性 6 轴运动处理组件,其内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个IIC 接口, 可用于连接外部磁力传感器,并利用自带的数字运动处理器(DMP: Digital Motion Processor) 硬件加速引擎,通过主 IIC 接口,向应用端输出完整的 9 轴融合演算数据。

InvenSense 公司提供了一套基于DMP的运动处理驱动库,可大大降低单片机对动处理运算的负荷,同时也大大降低了编程难度。该模块广泛运用于飞控、计步等电子产品中。

1.1 模块原理图

在这里插入图片描述

1.2 引脚说明 序号引脚说明1VCC3.3V/5V2GND地线3SCL作为从机时 IIC 时钟线4SDA作为从机时 IIC 数据线5XDA作为主机时 IIC 数据线6XCL作为主机时 IIC 时钟线7AD0作为从机时 IIC 地址8INT中断输出引脚

XDA和XCL是在MPU6050作为主机时的信号线,在与单片机的IIC通信中,MPU6050作为从机,所以用不到

AD0 是从 IIC 接口(接 MCU)的地址控制引脚,该引脚控制IIC 地址的最低位。由原理图可知,AD0 接了 GND,所以 MPU6050 的 IIC 地址默认为:0X68

INT也用不到,当模块需要输出数据时,可以通过该引脚给单片机中断信号,一般都不需要

1.3 接线方式

单片机 —— MPU6050

5V VCC GND GND Px.x SCL Px.x SDA

2. IIC通信

如果你学过一段时间单片机,你或多或少会听说过IIC通信(也写作I2C,通常读作:I方C),这是硬件开发里很常见、很常用的一种通信协议。

其实协议并不是听上去的那么高不可攀,它终究是人为定义的一个标准而已,我们只需遵循这个标准就可以了。

这里面的协议层会涉及到时序,如果你还不是“老司机”,暂且可以放下不去专研,因为这些都会被封装为函数,使用格式也非常固定,完全不必担心。比如通信中最频繁的 读写操作 ,会被封装成 IIC读/写函数 ,而读写只能算是最基础的操作,还可以利用它进一步封装成各种设置函数和数据采集函数。

2.1 IIC介绍

I2C(Inter-Integrated Circuit)总线是由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是 同步通信的一种特殊形式,具有接口线少,控制方式简单, 器件封装形式小,通信速率较高等优点。 I2C 总线 只有 两根双向信号线 。一根是 数据线 SDA ,另一根是 时钟线 SCL 。由于其管脚少,硬件实现简单,可扩展性强等特点,因此被广泛的使用在各大集成芯片内。

2.2 例程讲解

开发资料中的例程代码虽然很多,但最后在main函数里对MPU6050操作的只有两个函数,其他函数大多作为这两个函数的内容。其实,对于这种不小的工程项目,我们往往会写成多个文件,方便查看和使用,这就涉及到了工程项目的管理,后续可能还会出一篇教程 (>﹏<)

// 初始化MPU6050 void InitMPU6050() { Single_WriteI2C(PWR_MGMT_1, 0x00); // #define PWR_MGMT_1 0x6B Single_WriteI2C(SMPLRT_DIV, 0x07); // #define SMPLRT_DIV 0x19 Single_WriteI2C(CONFIG, 0x06); // #define CONFIG 0x1A Single_WriteI2C(GYRO_CONFIG, 0x18); // #define GYRO_CONFIG 0x1B Single_WriteI2C(ACCEL_CONFIG, 0x01);// #define ACCEL_CONFIG 0x1C } // 合成数据 int GetData(uchar REG_Address) { uchar H,L; H=Single_ReadI2C(REG_Address); // 相应寄存器地址 L=Single_ReadI2C(REG_Address+1); return ((H Ax=GetData(ACCEL_XOUT_H); Ay=GetData(ACCEL_YOUT_H); Az=GetData(ACCEL_ZOUT_H); Gx=GetData(GYRO_XOUT_H); Gy=GetData(GYRO_YOUT_H); Gz=GetData(GYRO_ZOUT_H); TR0 = 0; time = (TH0


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有