这两天买了两块6050的模块来玩 看了下例程 大部分都是51的 于是移植到32上调试下

硬件图

串口助手调试效果 加速度,陀螺仪,温度

其实陀螺仪这个东西说明白还是不太容易 ,但是我们会用就好了,随着三轴变化(x,y,z) 值会产生区间变化, 以此来判断动作。


源码部分

MPU6050.c

#include "mpu6050.h"
#include "usart.h"
#include "bsp_i2c.h"
void MPU6050_WriteReg(u8 reg_add,u8 reg_dat)
{i2c_Start();i2c_SendByte(MPU6050_SLAVE_ADDRESS);i2c_WaitAck();i2c_SendByte(reg_add);i2c_WaitAck();i2c_SendByte(reg_dat);i2c_WaitAck();i2c_Stop();
}
void MPU6050_ReadData(u8 reg_add,unsigned char*Read,u8 num)
{unsigned char i;i2c_Start();i2c_SendByte(MPU6050_SLAVE_ADDRESS);i2c_WaitAck();i2c_SendByte(reg_add);i2c_WaitAck(); i2c_Start();i2c_SendByte(MPU6050_SLAVE_ADDRESS+1);i2c_WaitAck();for(i=0;i<(num-1);i++){*Read=i2c_ReadByte(1);Read++;}*Read=i2c_ReadByte(0);i2c_Stop();
}/*初始化MPU6050芯片*/
void MPU6050_Init(void)
{int i=0,j=0;//在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错for(i=0;i<1000;i++){for(j=0;j<1000;j++){ ;}}MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00);     //解除休眠状态MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07);     //陀螺仪采样率,1KHzMPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06);         //低通滤波器的设置,截止频率是1K,带宽是5KMPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x00);   //配置加速度传感器工作在2G模式,不自检MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18);     //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
}/*读取MPU6050的ID*/
uint8_t MPU6050ReadID(void)
{unsigned char Re = 0;MPU6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1);    //读器件地址if(Re != 0x68){printf("MPU6050 dectected error!\r\n检测不到MPU6050模块,请检查模块与开发板的接线");return 0;}else{printf("MPU6050 ID = %d\r\n",Re);return 1;}}
/*读取MPU6050的加速度数据*/
void MPU6050ReadAcc(short *accData)
{u8 buf[6];MPU6050_ReadData(MPU6050_ACC_OUT, buf, 6);accData[0] = (buf[0] << 8) | buf[1];accData[1] = (buf[2] << 8) | buf[3];accData[2] = (buf[4] << 8) | buf[5];
}/*读取MPU6050的角加速度数据*/
void MPU6050ReadGyro(short *gyroData)
{u8 buf[6];MPU6050_ReadData(MPU6050_GYRO_OUT,buf,6);gyroData[0] = (buf[0] << 8) | buf[1];gyroData[1] = (buf[2] << 8) | buf[3];gyroData[2] = (buf[4] << 8) | buf[5];
}/*读取MPU6050的原始温度数据*/
void MPU6050ReadTemp(short *tempData)
{u8 buf[2];MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2);     //读取温度值*tempData = (buf[0] << 8) | buf[1];
}/*读取MPU6050的温度数据,转化成摄氏度*/
void MPU6050_ReturnTemp(float *Temperature)
{short temp3;u8 buf[2]; MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2);     //读取温度值temp3= (buf[0] << 8) | buf[1]; *Temperature=((double) temp3/340.0)+36.53;
}

iic.c

/********************************************************************************* @file    bsp_i2c.c* @brief   软件IIC 驱动*******************************************************************************/#include "stm32f10x.h"
#include "bsp_i2c.h"/* 定义I2C总线连接的GPIO端口, 用户只需要修改下面4行代码即可任意改变SCL和SDA的引脚 */
#define GPIO_PORT_I2C   GPIOB           /* GPIO端口 */
#define RCC_I2C_PORT    RCC_APB2Periph_GPIOB        /* GPIO端口时钟 */
#define I2C_SCL_PIN     GPIO_Pin_6          /* 连接到SCL时钟线的GPIO */
#define I2C_SDA_PIN     GPIO_Pin_7          /* 连接到SDA数据线的GPIO *//* 定义读写SCL和SDA的宏,已增加代码的可移植性和可阅读性 */
#if 0   /* 条件编译: 1 选择GPIO的库函数实现IO读写 */#define I2C_SCL_1()  GPIO_SetBits(GPIO_PORT_I2C, I2C_SCL_PIN)      /* SCL = 1 */#define I2C_SCL_0()  GPIO_ResetBits(GPIO_PORT_I2C, I2C_SCL_PIN)       /* SCL = 0 */#define I2C_SDA_1()  GPIO_SetBits(GPIO_PORT_I2C, I2C_SDA_PIN)     /* SDA = 1 */#define I2C_SDA_0()  GPIO_ResetBits(GPIO_PORT_I2C, I2C_SDA_PIN)       /* SDA = 0 */#define I2C_SDA_READ()  GPIO_ReadInputDataBit(GPIO_PORT_I2C, I2C_SDA_PIN) /* 读SDA口线状态 */
#else   /* 这个分支选择直接寄存器操作实现IO读写 *//* 注意:如下写法,在IAR最高级别优化时,会被编译器错误优化 */#define I2C_SCL_1()  GPIO_PORT_I2C->BSRR = I2C_SCL_PIN             /* SCL = 1 */#define I2C_SCL_0()  GPIO_PORT_I2C->BRR = I2C_SCL_PIN             /* SCL = 0 */#define I2C_SDA_1()  GPIO_PORT_I2C->BSRR = I2C_SDA_PIN                /* SDA = 1 */#define I2C_SDA_0()  GPIO_PORT_I2C->BRR = I2C_SDA_PIN             /* SDA = 0 */#define I2C_SDA_READ()  ((GPIO_PORT_I2C->IDR & I2C_SDA_PIN) != 0) /* 读SDA口线状态 */
#endifvoid i2c_GPIO_Config(void);/*
*********************************************************************************************************
*   函 数 名: i2c_Delay
*   功能说明: I2C总线位延迟,最快400KHz
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
static void i2c_Delay(void)
{uint8_t i;/* 下面的时间是通过安富莱AX-Pro逻辑分析仪测试得到的。CPU主频72MHz时,在内部Flash运行, MDK工程不优化循环次数为10时,SCL频率 = 205KHz 循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us 循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us IAR工程编译效率高,不能设置为7*/for (i = 0; i < 10; i++);
}/*
*********************************************************************************************************
*   函 数 名: i2c_Start
*   功能说明: CPU发起I2C总线启动信号
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_Start(void)
{/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */I2C_SDA_1();I2C_SCL_1();i2c_Delay();I2C_SDA_0();i2c_Delay();I2C_SCL_0();i2c_Delay();
}/*
*********************************************************************************************************
*   函 数 名: i2c_Start
*   功能说明: CPU发起I2C总线停止信号
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_Stop(void)
{/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */I2C_SDA_0();I2C_SCL_1();i2c_Delay();I2C_SDA_1();
}/*
*********************************************************************************************************
*   函 数 名: i2c_SendByte
*   功能说明: CPU向I2C总线设备发送8bit数据
*   形    参:_ucByte : 等待发送的字节
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_SendByte(uint8_t _ucByte)
{uint8_t i;/* 先发送字节的高位bit7 */for (i = 0; i < 8; i++){     if (_ucByte & 0x80){I2C_SDA_1();}else{I2C_SDA_0();}i2c_Delay();I2C_SCL_1();i2c_Delay(); I2C_SCL_0();if (i == 7){I2C_SDA_1(); // 释放总线}_ucByte <<= 1;    /* 左移一个bit */i2c_Delay();}
}/*
*********************************************************************************************************
*   函 数 名: i2c_ReadByte
*   功能说明: CPU从I2C总线设备读取8bit数据
*   形    参:无
*   返 回 值: 读到的数据
*********************************************************************************************************
*/
uint8_t i2c_ReadByte(u8 ack)
{uint8_t i;uint8_t value;/* 读到第1个bit为数据的bit7 */value = 0;for (i = 0; i < 8; i++){value <<= 1;I2C_SCL_1();i2c_Delay();if (I2C_SDA_READ()){value++;}I2C_SCL_0();i2c_Delay();}if(ack==0)i2c_NAck();elsei2c_Ack();return value;
}/*
*********************************************************************************************************
*   函 数 名: i2c_WaitAck
*   功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
*   形    参:无
*   返 回 值: 返回0表示正确应答,1表示无器件响应
*********************************************************************************************************
*/
uint8_t i2c_WaitAck(void)
{uint8_t re;I2C_SDA_1();    /* CPU释放SDA总线 */i2c_Delay();I2C_SCL_1();    /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */i2c_Delay();if (I2C_SDA_READ())    /* CPU读取SDA口线状态 */{re = 1;}else{re = 0;}I2C_SCL_0();i2c_Delay();return re;
}/*
*********************************************************************************************************
*   函 数 名: i2c_Ack
*   功能说明: CPU产生一个ACK信号
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_Ack(void)
{I2C_SDA_0();   /* CPU驱动SDA = 0 */i2c_Delay();I2C_SCL_1(); /* CPU产生1个时钟 */i2c_Delay();I2C_SCL_0();i2c_Delay();I2C_SDA_1(); /* CPU释放SDA总线 */
}/*
*********************************************************************************************************
*   函 数 名: i2c_NAck
*   功能说明: CPU产生1个NACK信号
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_NAck(void)
{I2C_SDA_1();   /* CPU驱动SDA = 1 */i2c_Delay();I2C_SCL_1(); /* CPU产生1个时钟 */i2c_Delay();I2C_SCL_0();i2c_Delay();
}/*
*********************************************************************************************************
*   函 数 名: i2c_GPIO_Config
*   功能说明: 配置I2C总线的GPIO,采用模拟IO的方式实现
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_I2C_PORT, ENABLE);  /* 打开GPIO时钟 */GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN | I2C_SDA_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;      /* 开漏输出 */GPIO_Init(GPIO_PORT_I2C, &GPIO_InitStructure);/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */i2c_Stop();
}/*
*********************************************************************************************************
*   函 数 名: i2c_CheckDevice
*   功能说明: 检测I2C总线设备,CPU向发送设备地址,然后读取设备应答来判断该设备是否存在
*   形    参:_Address:设备的I2C总线地址
*   返 回 值: 返回值 0 表示正确, 返回1表示未探测到
*********************************************************************************************************
*/
uint8_t i2c_CheckDevice(uint8_t _Address)
{uint8_t ucAck;i2c_GPIO_Config();       /* 配置GPIO */i2c_Start();        /* 发送启动信号 *//* 发送设备地址+读写控制bit(0 = w, 1 = r) bit7 先传 */i2c_SendByte(_Address|I2C_WR);ucAck = i2c_WaitAck();    /* 检测设备的ACK应答 */i2c_Stop();         /* 发送停止信号 */return ucAck;
}

main.c

int main(void){  short Accel[3];short Gyro[3];float Temp;   delay_init();        //延时函数初始化     uart_init(115200);i2c_GPIO_Config();MPU6050_Init();  //MPU6050初始化if(MPU6050ReadID() == 1) {     while(1){MPU6050ReadAcc(Accel);printf("\r\n加速度:%8d%8d%8d ",Accel[0],Accel[1],Accel[2]);MPU6050ReadGyro(Gyro);printf("陀螺仪:%8d%8d%8d ",Gyro[0],Gyro[1],Gyro[2]);              MPU6050_ReturnTemp(&Temp); printf("温度:%8.2f",Temp);delay_ms(1000);}
}}

全套资料免费分享 加群号或关注微信公众号回复mpu6050即可获得资料 群号 721421120

MPU6050陀螺仪 GY-25模块调试相关推荐

  1. ROC-RK3308-CC开发实例总结--MPU6050运动处理传感器模块调试

    传感器介绍        MPU60X0是invenSence公司的一款全球首例9轴运动处理传感器.它内部集成了3轴MEMS陀螺仪和3轴MEMS加速度计,同时可以通过I2C接口(注意这个接口是XDA. ...

  2. 树莓派基础实验31:MPU6050陀螺仪加速度传感器实验

    一.介绍    MPU6050是世界上第一款也是唯一一款专为智能手机.平板电脑和可穿戴传感器的低功耗.低成本和高性能要求而设计的6轴运动跟踪设备.    它集成了3轴MEMS陀螺仪,3轴MEMS加速度 ...

  3. 【51单片机快速入门指南】4.3: I2C读取MPU6050陀螺仪的原始数据

    目录 硬知识 特性参数 MPU6050 简介 模块重要寄存器简介 电源管理寄存器 1 陀螺仪配置寄存器 加速度传感器配置寄存器 FIFO 使能寄存器 陀螺仪采样率分频寄存器 配置寄存器 电源管理寄存器 ...

  4. android 陀螺仪滤波_Arduino MPU6050陀螺仪运用卡尔曼滤波姿态解算实验

    Arduino MPU6050陀螺仪运用卡尔曼滤波姿态解算实验 版权声明:本文为博主原创文章,未经博主允许不得转载. 2019年3月20日 发布 实例效果 输出效果: 首先看看本例程XYZ轴的输出效果 ...

  5. android 陀螺仪滤波_Arduino+mpu6050陀螺仪运用卡尔曼滤波姿态解算实验

    MPU6050六轴陀螺仪 作用于四轴无人机,平衡车,机器人等等的电子实作当中,用于姿态判断,掌握了可以发挥自己的想象完成更多更有趣的作品. 本例程输出XYZ的角度,正负90度. 运用卡尔曼滤波算法解算 ...

  6. Arduino uno + mpu6050 陀螺仪 运用卡尔曼滤波姿态解算实验

    MPU6050六轴陀螺仪 作用于四轴无人机,平衡车,机器人等等的电子实作当中,用于姿态判断,掌握了可以发挥自己的想象完成更多更有趣的作品. 本例程输出XYZ的角度,正负90度. 运用卡尔曼滤波算法解算 ...

  7. 平衡车入门---MPU6050陀螺仪的使用

    平衡车入门---MPU6050陀螺仪的使用 一.MPU6050简介 二.学习MPU6050的步骤 三.I2C协议简介 四.MPU6050硬件介绍 五.MPU6050的几个重要寄存器 六.原始数据的单位 ...

  8. ESP-Drone四旋翼无人机控制板上的MPU6050陀螺仪芯片I2C总线测试

    1.摘要 一款新的控制板卡在第一次使用时,都需要进行硬件功能的测试,以确保所有的硬件都能够正常工作后,才可以进入后续的软件编程阶段,ESP-Drone四旋翼无人机的控制板使用了mpu6050陀螺仪芯片 ...

  9. AP6236 WiFi模块调试记录

    AP6236 WiFi模块调试记录 Platform: RK3368 OS: Android 6.0 Kernel: 3.10.0 文章目录 AP6236 WiFi模块调试记录 内核驱动移植 1. 更 ...

  10. Linux驱动编程 step-by-step (六) 用户地址检测 简单模块调试 以及一些杂项

    用户地址检测 简单模块调试 以及一些杂项 检测用户空间地址的有效性 上一节中提到在read write时候要检测用户空间传递的参数地址是否是有效地址,有的内核函数会自行检测,但是在调用轻量级的内核函数 ...

最新文章

  1. 递归学习五--折半查找--java
  2. 【今晚七点半】:爱奇艺DRM探索之路
  3. 都是大人物,看看你认识几个。
  4. php连接mysql的方式_php有几种连接mysql的方法
  5. linux内核启动过程4:内核运行时
  6. 22-win10下ElasticSearch.6.1.0与logstash6.1.0的整合
  7. WSGI Application/Framework
  8. iOS地图之MapKit框架
  9. [bzoj1566][NOI2009]管道取珠
  10. 在linux目录中设置权限设置,linux下为目录和文件设置权限(示例代码)
  11. 交换机基本原理与配置
  12. Mac使用-键盘符号对照
  13. Java开发基础知识学习总结之(上)-王者笔记建议收藏
  14. C1 驾驶证考试科目二考试心得
  15. 仪表研发工程师所需要了解的蓝牙和WiFi知识
  16. 电脑插了耳机后声音还是外放解决方案
  17. SpringBoot+vue 使用阿里云的短信功能发送手机验证码
  18. 金蝶EAS DEP脚本(5)给常用控件添加值改变事件
  19. 近端梯度下降法 (proximal gradient descent)
  20. 一键复制 html,最简单js代码实现一键复制文字

热门文章

  1. Ubuntu 安装源及初始配置
  2. Chrome中devtools安装
  3. Java - JDK动态代理原理
  4. 【STM32】继电器的使用
  5. 机器学习(3)——无监督学习
  6. 艾美智能影库服务器ip,家庭影院播放器;影库 篇一:艾美影库MS-300 到底怎么样?...
  7. HSV颜色空间和RGB颜色空间相互转换C语言实现
  8. 基于大数据的软件项目知识图谱构造及问答方法
  9. Lagrange 四平方定理
  10. 用c语言编写kcl方程,求助各位大手子 求了好多次都不对 用kvl kcl求出电容c