F1-HAL库快速移植MPU6050

这篇具有很好参考价值的文章主要介绍了F1-HAL库快速移植MPU6050。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前段时间在做平衡车,需要移植MPU6050程序。但是在网上找了挺多相关例子的,但是有时候一步步跟着做,结果还是一堆errors 或者读不出数据来,最后自己花了些时间,终于移植好了,前来分享一下。

先分享我的工程,和需要移植的MPU6050的程序

完整工程 + MPU6050移植程序

提取码:3ycr

效果演示

F1-HAL库快速移植MPU6050

接下来进入正题:

一、首先在CubeMX中创建工程

1. 先正常配置RCC、SYS和时钟树。

2. 我这里选择PB6和PB7读MPU6050用、打开了串口1、并且我打开了4个脚给OLED用。

F1-HAL库快速移植MPU6050

3. 然后生成工程好了。

二、程序移植

1. 我们把下载到的MPU6050程序添加到工程中,加入.c文件,并且把头文件路径也添加进来。

F1-HAL库快速移植MPU6050

F1-HAL库快速移植MPU6050

2. #include "头文件"  

F1-HAL库快速移植MPU6050

代码放这里 

#include "mpu6050.h"//MPU6050驱动库
#include "inv_mpu.h"//陀螺仪驱动库
#include "inv_mpu_dmp_motion_driver.h" //DMP姿态解读库读库

#include "XMF_OLED_STM32Cube.h" //OLED头文件
#include "stdio.h"		//使用printf用

此时编译会发现报很多错 

F1-HAL库快速移植MPU6050

三、修改程序 

 1. 把这下面几个文件,用main.h 代替 sys.h 和 stm32f10x.h 

F1-HAL库快速移植MPU6050

 2. 然后再main.h文件下加入下面这些

F1-HAL库快速移植MPU6050

 代码放这里

typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;

//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
//IO口地址映射
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 

//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

3. 自己创建delay.c 和 delay.h 文件 加入工程,包含头文件路径.分别在里面加入下面这些代码

delay.h

#ifndef __DELAY_H
#define __DELAY_H 	

#include "main.h"
	
void delay_ms(u16 nms);
void delay_us(u32 nus);

#endif

delay.c

#include "delay.h"
	    								   
void delay_us(u32 nus)
{		
	uint32_t us_tick=SystemCoreClock / 1000000UL;
	uint32_t start,now,JianGe,reload;
	start=SysTick->VAL;              //把最开始获得的计数值作为基准值
	reload = SysTick->LOAD;
	do{
	 now=SysTick->VAL;				//获取当前值
		JianGe = start > now ? start - now : reload + start - now;
	}while(JianGe<nus*us_tick);			 //判断是否到达间隔

}

void delay_ms(u16 nms)
{	 		  	  
	HAL_Delay(nms);	
} 

4. 把mpuiic.c里面的下图内容注释掉

F1-HAL库快速移植MPU6050

5.接下来编译就可以通过啦

F1-HAL库快速移植MPU6050

 四、在main.c下面加入串口重定向,以及 MPU6050的一些变量 ,再加入读数据的函数就大功告成啦 !

F1-HAL库快速移植MPU6050

代码放这里

#pragma import(__use_no_semihosting)             
//标准库需要的支持函数    
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
	return ch;
}

float pitch,roll,yaw; 		//欧拉角:俯仰角,滚转角,偏航角
short aacx,aacy,aacz;		//加速度传感器原始数据  加速度
short gyrox,gyroy,gyroz;	//陀螺仪原始数据  角速度
short temp;					//MPU温度
uint8_t str_buff[64];
uint8_t str_buff1[64]="俯仰角:";		//pitch
uint8_t str_buff2[64]="偏航角:";		//yaw
uint8_t str_buff3[64]="翻滚角:";		//roll
uint8_t str_buff4[64]="温度值:";

struct MPU6050				//MPU6050结构体
{
	u8 flag;				//采集成功标志位
	u8 speed;				//上报速度
}mpu6050;					//唯一结构体变量

 读数据的一些函数 放再这下面  有MPU_Read 和 DATA_Report 两个函数

F1-HAL库快速移植MPU6050

 代码放这里

void MPU_Read(void)
{
	
	if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)//dmp处理得到数据,对返回值进行判断
	{ 
//		temp=MPU_Get_Temperature();	              //得到温度值
		MPU_Get_Accelerometer(&aacx,&aacy,&aacz);	//得到加速度传感器数据
		MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);	//得到陀螺仪数据
		mpu6050.speed++;                          //上报速度自加
		if(mpu6050.speed == 4)						//上报速度阈值设置
		{
			mpu6050.flag = 1;						//采集成功标志位设置为有效
			mpu6050.speed = 0;						//上报速度归零
		}	
	}
	else 											//采集不成功										
	{
		mpu6050.flag = 0;							//采集成功标志位设置为无效
	}	
}
/**
  * @brief  MPU6050数据上报
  * @param  无
  * @retval 无
  */
void DATA_Report(void)
{
	if(mpu6050.flag == 1)						//采集成功时
	{ 
		if(temp<0)								//对数据正负判断,判断为负时
		{
			temp=-temp;							//对负数据取反
		}
		else                                    //判断为正时
		{
		}
//		sprintf((char *)str_buff,"%d.%d",temp/100,temp%10);
//		OLED_ShowString(60,0,str_buff);
//		printf("temp:%d.%d --- ",temp/100,temp%10); //通过串口1输出温度
		
		temp=pitch*10;							 //赋temp为pitch
		if(temp<0)								//对数据正负判断,判断为负时
		{
			temp=-temp;						    //对负数据取反		
		}
		else                                    //判断为正时 
		{
		}
		sprintf((char *)str_buff,"%d.%d",(temp)/10,(temp)%10);
		OLED_ShowString(60,0,str_buff);
//		OLED_ShowString(65,6,str_buff);
//		printf("pitch:%d.%d --- ",temp/10,temp%10); //通过串口1输出pitch	
		
		temp=roll*10;                            //赋temp为roll
		if(temp<0)								//对数据正负判断,判断为负时
		{
			temp=-temp;						    //对负数据取反	
		}
		else                                    //判断为正时
		{
		}
		sprintf((char *)str_buff,"%d.%d",temp/10,temp%10);
		OLED_ShowString(60,4,str_buff);
//		printf("roll:%d.%d --- ",temp/10,temp%10);//通过串口1输出roll
		
		temp=yaw*10;                           //赋temp为yaw
	if(temp<0)								//对数据正负判断,判断为负时
		{
			temp=-temp;						    //对负数据取反
//			OLED_ShowString(100,6,"-");
		}
		else                                    //判断为正时
		{	//OLED_ShowString(100,6,"+");
		}
		sprintf((char *)str_buff,"%d.%d",temp/10,temp%10);
		OLED_ShowString(60,2,str_buff);
//		sprintf((char *)str_buff,"%f",yaw);
//		OLED_ShowString(60,0,str_buff);
//		printf("yaw:%d.%d\r\n",temp/10,temp%10);//通过串口1输出yaw	
//		printf("gyrox:%d,gyroy:%d,gyroz:%d,aacx:%d,aacy:%d,aacz:%d\r\n",gyrox,gyroy,gyroz,aacx,aacy,aacz);//上报角速度数据,角加速度数据
		mpu6050.flag = 0;									//采集成功标志位设置为无效
	}
	else ;														//防卡死
}

五、最后把这两个函数放在while(1)里调用就可以读出数据啦 !

F1-HAL库快速移植MPU6050

 如果想改SDA 和 SCL 的引脚 ,修改这里

F1-HAL库快速移植MPU6050

第一次写博客,有些写得不好的地方请大家指正  谢谢大家  0.0文章来源地址https://www.toymoban.com/news/detail-415938.html

到了这里,关于F1-HAL库快速移植MPU6050的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 安卓RK3399编译驱动MPU6050,实现内核层与HAL层驱动

    今天我们一起学习一下如何实现对一款有驱动代码的传感器适配安卓系统 开发板:某AR眼镜公司的开发板RK3399 1. 什么是设备树(.dts) DTS即Device Tree Source 设备树源码, Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。 其主要目的是定义MCU各个引脚的接线功能,通过

    2024年02月04日
    浏览(50)
  • 01_STM32软件+硬件I2C读取MPU6050(HAL库)

    目录 1、I2C简介 2、I2C时序单元 2.1 起始条件 2.2 终止条件 2.3 发送一个字节 2.4 接收一个字节 2.5 发送应答 2.6 接收应答 3、I2C完整时序 3.1 指定地址写一个字节 3.2 当前地址读一个字节 3.2 指定地址读一个字节 4、简单软件I2C代码(HAL) 4.1 软件I2C 4.2 软件I2C读MPU6050寄存器 5、ST

    2024年04月17日
    浏览(47)
  • 【STM32】I2C练习,HAL库读取MPU6050角度陀螺仪

    MPU-6000(6050)为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时间轴之差的问题,减少了大量的封装空间。当连接到三轴磁强计时,MPU-60X0提供完整的9轴运动融合输出到其主I2C或SPI端口(SPI仅在MPU-6000上可用)。 寄存器地址 寄存器内容 0X3B

    2024年02月16日
    浏览(50)
  • 【STM32F4系列】【HAL库】【模块介绍】MPU6050设置与DMP库使用

    MPU6050是一个3轴陀螺仪(测角加速度)和3轴加速度计(测量线加速度)的测量芯片 内部自带运算单元(DMP),可以输出经姿态融合计算后的 四元数 (一种表示旋转的方法) 而且MPU6050的价格较低(10r以下),常被用于精度不高的场合作为姿态感知的芯片 如经典项目平衡车,某年电赛题目风力摆

    2024年02月05日
    浏览(39)
  • 【记录】MPU6050原理快速入门(附手册)

            MPU6050 MPU6050主要参数 MPU6050通信接口 MPU6050电路 向MPU6050的一个寄存器写一个字节的数据 从MPU6050的一个寄存器读一个字节的数据 MPU6050是一个运动处理传感器,其内部集成了3轴加速度传感器和3轴陀螺仪(角速度传感器) (芯片内部陀螺仪,当改变其转动时会产生

    2023年04月11日
    浏览(36)
  • 平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角

    上一篇,给大家介绍了平衡小车的硬件资源及其小车底层硬件介绍篇 平衡小车学习教程1——硬件资源及其小车底层硬件介绍篇 这篇来教大家 如何快速的使用MPU6050自带的DMP库读取陀螺仪数据,读取翻滚角(Roll)、俯仰角(Pitch)、航向角(Yaw)这三个角的数据。 而我们平衡小车的

    2024年02月15日
    浏览(43)
  • 【STM32+cubemx】0027 HAL库开发:MPU6050陀螺仪和加速度计数据的获取和校准

    在制作平衡车或者飞行器时,不可避免地需要知道设备本身的姿态,一般我们使用陀螺仪和加速度计来获取这些信息。 陀螺仪用来测量物体的角度。传统的机械式陀螺的原理,和我们小时候玩的陀螺一样,是利用了高速旋转的物体能保持轴线稳定的特性;机械式陀螺需要的加

    2023年04月08日
    浏览(48)
  • STM32MPU6050角度的读取(STM32驱动MPU6050)

    注:文末附STM32驱动MPU6050代码工程链接,需要的读者请自取。 MPU6050是一款集成了三轴陀螺仪和三轴加速度计的传感器芯片,由英国飞利浦半导体(现为恩智浦半导体)公司生产。它通过电子接口(如I2C或SPI)与微控制器进行通信,可用于测量物体的加速度和角速度,广泛应

    2024年02月20日
    浏览(52)
  • 模块学习(二)——MPU6050

    去年电赛备赛期间,学的STM32标准库,那一整个繁琐直接给我劝退了,当时学习MPU6050时就非常痛苦,代码也看不懂,无非抄来抄去,然后就是编译,改错,编译无穷尽也。最近参考野火的MPU6050代码,将其移植到了MSP430f5529之上,今天分享出来。 1.重要性 MPU6050模块对于不论平

    2024年02月16日
    浏览(41)
  • MPU6050调试

    1 原理简介 1.1 MPU6050芯片资料 1.内部主要结构:陀螺仪、加速度计、数字运动处理器DMP(Digital Motion Processor)。另外MPU6050还含有第二个IIC接口,用于连接一个第三方数字传感器AUXAUX_DA(如磁力计)用于输出完整九轴信号(角速度、角加速度以及磁场信号等) 2.连接接口: (1

    2024年02月06日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包