MPU6050陀螺仪 GY-25模块调试
这两天买了两块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模块调试相关推荐
- ROC-RK3308-CC开发实例总结--MPU6050运动处理传感器模块调试
传感器介绍 MPU60X0是invenSence公司的一款全球首例9轴运动处理传感器.它内部集成了3轴MEMS陀螺仪和3轴MEMS加速度计,同时可以通过I2C接口(注意这个接口是XDA. ...
- 树莓派基础实验31:MPU6050陀螺仪加速度传感器实验
一.介绍 MPU6050是世界上第一款也是唯一一款专为智能手机.平板电脑和可穿戴传感器的低功耗.低成本和高性能要求而设计的6轴运动跟踪设备. 它集成了3轴MEMS陀螺仪,3轴MEMS加速度 ...
- 【51单片机快速入门指南】4.3: I2C读取MPU6050陀螺仪的原始数据
目录 硬知识 特性参数 MPU6050 简介 模块重要寄存器简介 电源管理寄存器 1 陀螺仪配置寄存器 加速度传感器配置寄存器 FIFO 使能寄存器 陀螺仪采样率分频寄存器 配置寄存器 电源管理寄存器 ...
- android 陀螺仪滤波_Arduino MPU6050陀螺仪运用卡尔曼滤波姿态解算实验
Arduino MPU6050陀螺仪运用卡尔曼滤波姿态解算实验 版权声明:本文为博主原创文章,未经博主允许不得转载. 2019年3月20日 发布 实例效果 输出效果: 首先看看本例程XYZ轴的输出效果 ...
- android 陀螺仪滤波_Arduino+mpu6050陀螺仪运用卡尔曼滤波姿态解算实验
MPU6050六轴陀螺仪 作用于四轴无人机,平衡车,机器人等等的电子实作当中,用于姿态判断,掌握了可以发挥自己的想象完成更多更有趣的作品. 本例程输出XYZ的角度,正负90度. 运用卡尔曼滤波算法解算 ...
- Arduino uno + mpu6050 陀螺仪 运用卡尔曼滤波姿态解算实验
MPU6050六轴陀螺仪 作用于四轴无人机,平衡车,机器人等等的电子实作当中,用于姿态判断,掌握了可以发挥自己的想象完成更多更有趣的作品. 本例程输出XYZ的角度,正负90度. 运用卡尔曼滤波算法解算 ...
- 平衡车入门---MPU6050陀螺仪的使用
平衡车入门---MPU6050陀螺仪的使用 一.MPU6050简介 二.学习MPU6050的步骤 三.I2C协议简介 四.MPU6050硬件介绍 五.MPU6050的几个重要寄存器 六.原始数据的单位 ...
- ESP-Drone四旋翼无人机控制板上的MPU6050陀螺仪芯片I2C总线测试
1.摘要 一款新的控制板卡在第一次使用时,都需要进行硬件功能的测试,以确保所有的硬件都能够正常工作后,才可以进入后续的软件编程阶段,ESP-Drone四旋翼无人机的控制板使用了mpu6050陀螺仪芯片 ...
- AP6236 WiFi模块调试记录
AP6236 WiFi模块调试记录 Platform: RK3368 OS: Android 6.0 Kernel: 3.10.0 文章目录 AP6236 WiFi模块调试记录 内核驱动移植 1. 更 ...
- Linux驱动编程 step-by-step (六) 用户地址检测 简单模块调试 以及一些杂项
用户地址检测 简单模块调试 以及一些杂项 检测用户空间地址的有效性 上一节中提到在read write时候要检测用户空间传递的参数地址是否是有效地址,有的内核函数会自行检测,但是在调用轻量级的内核函数 ...
最新文章
- 递归学习五--折半查找--java
- 【今晚七点半】:爱奇艺DRM探索之路
- 都是大人物,看看你认识几个。
- php连接mysql的方式_php有几种连接mysql的方法
- linux内核启动过程4:内核运行时
- 22-win10下ElasticSearch.6.1.0与logstash6.1.0的整合
- WSGI Application/Framework
- iOS地图之MapKit框架
- [bzoj1566][NOI2009]管道取珠
- 在linux目录中设置权限设置,linux下为目录和文件设置权限(示例代码)
- 交换机基本原理与配置
- Mac使用-键盘符号对照
- Java开发基础知识学习总结之(上)-王者笔记建议收藏
- C1 驾驶证考试科目二考试心得
- 仪表研发工程师所需要了解的蓝牙和WiFi知识
- 电脑插了耳机后声音还是外放解决方案
- SpringBoot+vue 使用阿里云的短信功能发送手机验证码
- 金蝶EAS DEP脚本(5)给常用控件添加值改变事件
- 近端梯度下降法 (proximal gradient descent)
- 一键复制 html,最简单js代码实现一键复制文字