【stm32】stm32学习笔记(江科大)-详解stm32获取Mpu6050陀螺仪和加速度

这篇具有很好参考价值的文章主要介绍了【stm32】stm32学习笔记(江科大)-详解stm32获取Mpu6050陀螺仪和加速度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

I2C

起始条件:

终止条件:

 发送一个字节

接收一个字节

 接收发送应答

 代码

I2C

I2C.C

I2C.h

Mpu6050

Mpu6050.c

Mpu6050.h

Mpu6050Reg.h

main.c

结果


 文章来源地址https://www.toymoban.com/news/detail-574360.html

要想获取Mpu6050陀螺仪和加速度那就需要了解一下Mpu6050。Mpu6050使用的是I2C通讯

先了解一下

I2C

起始条件:

SCL高电平期间,SDA从高电平切换到低电平

终止条件:

SCL高电平期间,SDA从低电平切换到高电平

mpu6050 stm32代码,stm32,stm32,单片机,嵌入式硬件

 发送一个字节

mpu6050 stm32代码,stm32,stm32,单片机,嵌入式硬件

接收一个字节

mpu6050 stm32代码,stm32,stm32,单片机,嵌入式硬件

 接收发送应答

mpu6050 stm32代码,stm32,stm32,单片机,嵌入式硬件

 代码

下来让我们用代码实现一下I2C通讯:

I2C

I2C.C

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
void MyI2C_W_SCL(uint8_t  Bitvalue)//SCL电平,可以给这个函数0或1
{                                                        //设置引脚引脚后续可以改
	GPIO_WriteBit(GPIOB,GPIO_Pin_10,(BitAction)Bitvalue);//bitactiion就是一个枚举类型的变量,给1或0就可以拉低或拉高电平
	Delay_us(10);//延时10um
}
void MyI2C_W_SDA(uint8_t  Bitvalue)//SAD电平,可以给这个函数0或1
{                                                       //设置引脚引脚后续可以改
	GPIO_WriteBit(GPIOB,GPIO_Pin_11,(BitAction)Bitvalue);//bitactiion就是一个枚举类型的变量,表示这个位是高电平还是低电平
	Delay_us(10);//延时10um
}
//因为stm32读和写不是一个寄存器
uint8_t MyI2C_R_SDA(void)//读SDA
{
	uint8_t Bitvalue;
	Bitvalue = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11);/*函数 GPIO_ReadInputDataBit 读的是 GPIOx_IDR
读的是当 IO 口设置为输入状态时候的 IO 口电平状态值。*/
	Delay_us(10);//延时
	return Bitvalue;//返回值
}



void MyI2C_inite(void)//初始化引脚
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//因为mpu6050接的是PB10和11脚
	
	GPIO_InitTypeDef GPIO_InitStructure;//结构体
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//设为开漏输出 可输入输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;//设置引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置频率
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_11);
	
}

void MyI2C_start(void)
{
	MyI2C_W_SDA(1);//先给这两条线的电平先释放
	MyI2C_W_SCL(1);

	MyI2C_W_SDA(0);//先拉底SDA再拉低SCL
	MyI2C_W_SCL(0);
}
void MyI2C_stop(void)
{
	
	MyI2C_W_SDA(0);//先拉低SDA确保他处于低电平
	MyI2C_W_SCL(1);//然后拉高SCL再拉高SDA终止通讯
	MyI2C_W_SDA(1);
	
	
}


void MyI2C_SendByte(uint8_t Byte)//发送字节参数是八位的字节
{
	uint8_t i;//定义变量
	for(i=0;i<8;i++)//进入循环
	{
	MyI2C_W_SDA(Byte & (0x80 >> i));//取最高位向右移,与取最高位依次取出字节
	MyI2C_W_SCL(1);//释放SCL拉低SCL给它一个脉冲继续取下一个数据
	MyI2C_W_SCL(0);
	}
	
}
uint8_t MyI2C_ReceiveByte(void)//接收字节
{
	uint8_t i,Byte= 0x00;
	MyI2C_W_SDA(1);//先释放SDA
	for(i=0;i<8;i++)
	{
	MyI2C_W_SCL(1);//SCL高电平是读SCL低电平是写 
	if (MyI2C_R_SDA() == 1){Byte|=(0x80>>i);}
	MyI2C_W_SCL(0);
}
	return Byte;
	
}

void MyI2C_SendAck(uint8_t AckBit)//发送应答
{
	
	MyI2C_W_SDA(AckBit);//取最高位
	MyI2C_W_SCL(1);
	MyI2C_W_SCL(0);//进入下一个时序单位
	
	
}
uint8_t MyI2C_ReceiveAck(void)
{
	uint8_t AckBit;
	MyI2C_W_SDA(1);
	MyI2C_W_SCL(1);
	AckBit = MyI2C_R_SDA();//接收SDA的信号
	MyI2C_W_SCL(0);//进入下一个时序单位

	return AckBit;
	
}

I2C.h

#ifndef __MYI2C_H
#define __MYI2C_H

void MyI2C_inite(void);
void MyI2C_start(void);
void MyI2C_stop(void);
void MyI2C_SendByte(uint8_t Byte);
uint8_t MyI2C_ReceiveByte(void);
void MyI2C_SendAck(uint8_t AckBit);
uint8_t MyI2C_ReceiveAck(void);
 void Mpu6050_GetData(int16_t*AccX,int16_t*AccY,int16_t*AccZ,int16_t*GyroX,int16_t*GyroY,int16_t*GyroZ);
#endif

写好了i2c的通讯就可以来写mpu6050的代码

Mpu6050

Mpu6050.c

#include "stm32f10x.h"                 
#include "Mpu6050Reg.h"
#include "myi2c.h"
#include "Delay.h"
 
#define    MPU6050_ADDRESS    0XD0 

void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)//写入地址和写入数据
{
	MyI2C_start();//打开I2C通讯
	MyI2C_SendByte(MPU6050_ADDRESS);//从机地址+读写位,0是写,1读
	MyI2C_ReceiveAck();//返回一个应答位,接收
	MyI2C_SendByte(RegAddress);//发送指定寄存器
	MyI2C_ReceiveAck();//返回一个应答位,接收
	MyI2C_SendByte(Data);//给寄存器写入数据
	MyI2C_ReceiveAck();//返回一个应答位,接收
	MyI2C_stop();//停止通讯
}

uint8_t MPU6050_ReadReg(uint8_t RegAddress)//读寄存器地址
{
	uint8_t Data;
	
	MyI2C_start();//打开I2C通讯
	MyI2C_SendByte(MPU6050_ADDRESS);//从机地址
	MyI2C_ReceiveAck();//返回一个应答位,接收回应
	MyI2C_SendByte(RegAddress);//发送指定寄存器
	MyI2C_ReceiveAck();//返回一个应答位,接收回应
	
	MyI2C_start();//打开I2C通讯
	MyI2C_SendByte(MPU6050_ADDRESS | 0x01);//从机地址+读写位,0是写,1读
	MyI2C_ReceiveAck();//返回一个应答位,接收回应
	Data = MyI2C_ReceiveByte();//读取信息存储到data
	MyI2C_SendAck(1);//1不给从机应答,0给从机应答.
	MyI2C_stop();//停止通讯
	
	return Data;//返回值
}

void Mpu6050_Init(void)//mpu6050初始化
{
	MyI2C_inite();//初始化I2C通讯
	MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);//陀螺仪时钟
	MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);//六个轴均不待机
	MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);//采样率分频   10分频   值越小越快
	MPU6050_WriteReg(MPU6050_CONFIG, 0x06);//配置寄存器
	MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);//陀螺仪配置寄存器
	MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);//加速度计配置寄存器
}

uint8_t Mpu6050_GetID(void)//获取mpu6050ID号
{
	return MPU6050_ReadReg(MPU6050_WHO_AM_I);
}

void Mpu6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, //陀螺仪三个轴     加速度计三个轴
						int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{
	uint8_t DataH, DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);//读取加速度X,Y,Z轴高八位和低八位
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
	*AccX = (DataH << 8) | DataL;//获取16位存入指针
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);
	*AccY = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
	*AccZ = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);//读取陀螺仪X,Y,Z轴高八位和低八位
	DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);
	*GyroX = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);
	*GyroY = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);
	*GyroZ = (DataH << 8) | DataL;
}

Mpu6050.h

#ifndef _Mpu6050_H
#define _Mpu6050_H

void Mpu6050_WriteReg(uint8_t RegAddress,uint8_t Data); //指定地址写寄存器
uint8_t Mpu6050_ReadReg(uint8_t RegAddress);
uint8_t Mpu6050_GetID(void);
void Mpu6050_Init(void);
void Mpu6050_GetData(int16_t*AccX,int16_t*AccY,int16_t*AccZ,int16_t*GyroX,int16_t*GyroY,int16_t*GyroZ);

#endif

还需要Mpu6050的寄存器地址

Mpu6050Reg.h

#ifndef _Mpu6050Reg_H//宏定义mpu6050的寄存器
#define _Mpu6050Reg_H

#define	MPU6050_SMPLRT_DIV		0x19
#define	MPU6050_CONFIG			0x1A
#define	MPU6050_GYRO_CONFIG		0x1B
#define	MPU6050_ACCEL_CONFIG	0x1C

#define	MPU6050_ACCEL_XOUT_H	0x3B
#define	MPU6050_ACCEL_XOUT_L	0x3C
#define	MPU6050_ACCEL_YOUT_H	0x3D
#define	MPU6050_ACCEL_YOUT_L	0x3E
#define	MPU6050_ACCEL_ZOUT_H	0x3F
#define	MPU6050_ACCEL_ZOUT_L	0x40
#define	MPU6050_TEMP_OUT_H		0x41
#define	MPU6050_TEMP_OUT_L		0x42
#define	MPU6050_GYRO_XOUT_H		0x43
#define	MPU6050_GYRO_XOUT_L		0x44
#define	MPU6050_GYRO_YOUT_H		0x45
#define	MPU6050_GYRO_YOUT_L		0x46
#define	MPU6050_GYRO_ZOUT_H		0x47
#define	MPU6050_GYRO_ZOUT_L		0x48

#define	MPU6050_PWR_MGMT_1		0x6B
#define	MPU6050_PWR_MGMT_2		0x6C
#define	MPU6050_WHO_AM_I		0x75     

#endif

实现把Mpu6050数据显示到oled屏幕上

main.c

#include "stm32f10x.h"                  
#include "Delay.h"
#include "OLED.h"
#include "Mpu6050.h"

uint8_t ID;//存放ID号的变量
int16_t AX, AY, AZ, GX, GY, GZ;//存放加速度计和陀螺仪的值

int main(void)
{
	OLED_Init();//初始化OLED
	Mpu6050_Init();//初始化mpu6050
	//显示内容mpu6050的ID号
	OLED_ShowString(1, 1, "ID:");
	ID = Mpu6050_GetID();//获取ID号
	OLED_ShowHexNum(1, 4, ID, 2);
	
	while (1)
	{
		Mpu6050_GetData(&AX, &AY, &AZ, &GX, &GY, &GZ);//获取AX到GZ的值
		//显示加速度计和陀螺仪到OLED
		OLED_ShowSignedNum(2, 1, AX, 5);
		OLED_ShowSignedNum(3, 1, AY, 5);
		OLED_ShowSignedNum(4, 1, AZ, 5);
		OLED_ShowSignedNum(2, 8, GX, 5);
		OLED_ShowSignedNum(3, 8, GY, 5);
		OLED_ShowSignedNum(4, 8, GZ, 5);
	}
}

结果

mpu6050 stm32代码,stm32,stm32,单片机,嵌入式硬件

参考视视频:

【STM32入门教程-2023持续更新中-哔哩哔哩】 https://b23.tv/mVJHA3h

 

 

 

到了这里,关于【stm32】stm32学习笔记(江科大)-详解stm32获取Mpu6050陀螺仪和加速度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32单片机入门学习笔记——MPU6050

    笔记整理自B站UP主江科大自化协教程《[10-2] MPU6050简介_哔哩哔哩_bilibili》,所用单片机也为教程推荐单片机。 如果芯片里再集成一个3轴的磁场传感器,测量XYZ轴的磁场强度,那就叫做9轴姿态传感器,如果再集成一个气压传感器,测量气压大小,那就叫做10轴姿态传感器,一

    2024年02月08日
    浏览(52)
  • 【STM32】STM32学习笔记-软件I2C读写MPU6050(33)

    I2C(Inter-Integrated Circuit)总线 是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 串行的 8 位双向数据传输位速率在标准模式下可

    2024年01月21日
    浏览(64)
  • 【STM32】STM32学习笔记-硬件I2C读写MPU6050(35)

    I2C(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 串行的 8 位双向数据传输位速率在标准模式下可

    2024年01月25日
    浏览(63)
  • STM32之MPU6050获取欧拉角

    mpu6050 集成了三轴 MEMS 陀螺仪,三轴 MEMS 加速度计,以及一个可扩展的数字运动处理器 DMP(Digital Motion Processor)。辅助I2C接口可以连接一个第三方的数字传感器,比如磁力计。扩展了磁力计之后就可以通过其主要I2C接口输出一个 9 轴的信号(否则只能输出一个6轴的信号)。

    2023年04月20日
    浏览(80)
  • STM32学习笔记(十)丨I2C通信(使用I2C实现MPU6050和STM32之间通信)

    ​  本次课程采用单片机型号为STM32F103C8T6。(鉴于笔者实验时身边只有STM32F103ZET6,故本次实验使基于ZET6进行的) ​  课程链接:江协科技 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试

    2024年01月19日
    浏览(59)
  • 物联网AI MicroPython传感器学习 之 mpu6050六轴陀螺仪传感器

    学物联网,来万物简单IoT物联网!! MPU6050是一款6轴运动传感器,它集成了3 轴MEMS 陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其I2C 或SPI 接口输出一个

    2024年04月17日
    浏览(56)
  • 陀螺仪MPU6050(IIC&源码)

    1. 陀螺仪 1.1   什么是陀螺仪? 检测角度变化的一个装置。 1.1.1  有什么用?? 用于检测角度变化,用角度变化的值判断物体的运动轨迹。 1.1.2  我们怎么用? 我们是使用这个装置(或者说设备)获取到数据,再使用这个数据得到我们想要的信息。 这里我使用陀螺仪获取板

    2024年02月13日
    浏览(40)
  • STM32 F103C8T6学习笔记6:IIC通信__驱动MPU6050 6轴运动处理组件—一阶互补滤波

    今日主要学习一款倾角传感器——MPU6050,往后对单片机原理基础讲的会比较少,更倾向于简单粗暴地贴代码,因为经过前些日子对MSP432的学习,对原理方面也有些熟络了,除了在新接触它时会对其引脚、时钟、总线等进行仔细一些的研究之外,其余驱动方面便是照搬经验了~

    2024年02月13日
    浏览(60)
  • STM32入门笔记(02):MPU6050、MPU9250、ICM20948及姿态解算(SPL库函数版)

    【正点原子】 手把手教你学STM32 系列视频之 STM32F4-基于探索者F407 DMP 读取MPU6050角度数据以及匿名四轴飞控上位机介绍 STM32F103 DMP读取MPU6050角度数据 MPU6050是InvenSense公司( Invensense公司成立于2003年6月,总部位于美国Sunnyvale,主要生产的产品为运动感测追踪组件。) 推出的全球首

    2024年02月01日
    浏览(45)
  • 【STM32学习】——I2C通信协议&MPU6050姿态传感器&软件I2C读写MPU6050

    ​   目录 前言 一、I2C通信协议 1.简介 2.硬件电路设计 3.I2C时序(软件)

    2024年02月16日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包