THWATCH-01 陀螺仪 MPU6050 HAL库 正点原子 STM32驱动 计步

news/2024/11/24 8:59:55/

THWATCH-01 陀螺仪 MPU6050 HAL库 正点原子 STM32驱动 计步

  • 一级目录
    • 二级目录
      • 三级目录
  • 一、cubemx配置
    • 1、使用cubemx配置串口
    • 2、配置IIC1
    • 3、配置时钟和SWDIO下载口
  • 二、修改KEIL工程
    • 1、IIC驱动
    • 2、main函数
  • 三、计步器

一级目录

二级目录

三级目录

使用了正点原子的mpu6050的历程。使用里面的DMP算法库,我这里使用的是STM32 F4的单片机。
环境:
CubeMX
KEIL5
HAL库

一、cubemx配置

1、使用cubemx配置串口

在这里插入图片描述
配置了串口1 作为调试信息的输出;
串口1的波特率设置成了115200;

2、配置IIC1

和单片机连接的IIC总线我使用的是IIC1
配置为:
在这里插入图片描述

3、配置时钟和SWDIO下载口

在这里插入图片描述在这里插入图片描述
生成工程:
在这里插入图片描述
在这里插入图片描述

二、修改KEIL工程

1、IIC驱动

为了方便配置不再使用模拟IIC接口,直接使用HAL库提供的接口:

//IIC连续写
//addr:器件地址 
//reg:寄存器地址
//len:写入长度
//buf:数据区
//返回值:0,正常
//    其他,错误代码
u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{HAL_I2C_Mem_Write(&hi2c1, ((addr<<1)|0), reg, 1, (unsigned char *)buf, len, HAL_MAX_DELAY);return 0;	
} //IIC连续读
//addr:器件地址
//reg:要读取的寄存器地址
//len:要读取的长度
//buf:读取到的数据存储区
//返回值:0,正常
//    其他,错误代码
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{ HAL_I2C_Mem_Read(&hi2c1, ((addr<<1)|1), reg, 1, (unsigned char *)buf, len, HAL_MAX_DELAY);return 0;	
}//IIC写一个字节 
//reg:寄存器地址
//data:数据
//返回值:0,正常
//    其他,错误代码
u8 MPU_Write_Byte(u8 reg,u8 data) 				 
{ HAL_I2C_Mem_Write(&hi2c1, (MPU_ADDR<<1)|0, reg, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY);	return 0;
}//IIC读一个字节 
//reg:寄存器地址 
//返回值:读到的数据
u8 MPU_Read_Byte(u8 reg)
{u8 res;HAL_I2C_Mem_Read(&hi2c1, (MPU_ADDR<<1)|1, reg, I2C_MEMADD_SIZE_8BIT, &res, 1, HAL_MAX_DELAY);return res;		
}

上面的四个函数基本实现了IIC的读取一个字节,写入一个字节,读取多个字节,写入多个字节的操作。直接调用即可。

2、main函数

首先在main函数总增减头文件的调用:

#include "stdio.h"#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h" 

配置printf函数:
在引用头文件下方增加

int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1, 0xFFFF);return ch;
}

修改好如下图:
在这里插入图片描述

在main函数中增加变量的定义:

float pitch,roll,yaw; 		//欧拉角
short aacx,aacy,aacz;		//加速度传感器原始数据
short gyrox,gyroy,gyroz;	//陀螺仪原始数据
short temp;					//温度

在面函数中调用初始化函数

MPU_Init();					//初始化MPU6050
while(mpu_dmp_init())
{printf("error\r\n");HAL_Delay(10);
}

在while循环中增加读取欧拉角的函数

if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{temp=MPU_Get_Temperature();	//得到温度值MPU_Get_Accelerometer(&aacx,&aacy,&aacz);	//得到加速度传感器数据MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);	//得到陀螺仪数据printf("%.1f %.1f %.1f \r\n",pitch,roll,yaw);
}HAL_Delay(20);

最后得到如图:
在这里插入图片描述

三、计步器

MPU6050的DMP库提供了计步器接口,自己测试准确率还是比较高的

dmp_get_pedometer_step_count(&STEPS); //计步器获取到步数
printf("%d\r\n",STEPS); //显示计步器的步数

资源:(不用花钱哦)https://download.csdn.net/download/qq_44179528/15619484

看到最后了别忘了先赞 !!!!!❤
||
||
V


http://www.ppmy.cn/news/527528.html

相关文章

3.体验android 4.2.2

上次在pandaboardES上体验了ubuntu12.04&#xff0c;今天这体验下android4.2.2&#xff0c;看看效果如何。以下步骤全部参考官网https://releases.linaro.org/13.02/android/panda/ 1.从上面的连接中获得boot.tar.bz2 system.tar.bz2 userdata.tar.bz2三个文件&#xff1b; 2.…

多核处理器基础:SMP、AMP和BMP 以及 AP、BP和CP

原文链接&#xff1a;https://www.cnblogs.com/zamely/p/4334979.html 多核处理器也称片上多核处理器&#xff08;Chip Multi-Processor&#xff0c;CMP&#xff09;。 1.多核处理器的流行 多核出现前&#xff0c;商业化处理器都致力于单核处理器的发展&#xff0c;其性能已经…

u-boot spl 学习总结

什么是SPL&#xff1f; SPL(secondary program loader)是一个十分小的bin文件&#xff0c;它是用来引导主u-boot文件。对于一些SRAM很小的SOC&#xff0c;无法一次性加载ROM中的bootloader到SRAM中&#xff0c;因为一般SRAM远远小于bootloader的大小。这时候SPL应运而生了。 …

omap_prcm_PM

原文地址&#xff1a;http://lhsblog01.blog.163.com/blog/static/102004519201022110333796/ //*****************prcm******************************************************* power reset and clock managment. PM由三个架构模块组成&#xff1a; power, clock, volta…

PX4驱动分析之MPU6000

PX4驱动分析之MPU6000 前言&#xff1a; 首先分析PX4中MPU6000传感器驱动的注册&#xff0c;调用&#xff0c;实例的过程&#xff0c;先要理解一个事情。就是PX4是使用了一个类Linux操作系统的Nuttx操作系统。 也就是PX4上的驱动编写类似于Linux上的驱动编写。 软件层次图 所…

基于Ti Omap3x 分析v4l2架构

1 概述 本文将基于Ti Omap3x这个典型的实例来分析v4l2在具体media场景中的应用。通过分析app层的行为以及driver层的实现来对整个多媒体框架有一个大概的认识。内容主要包括主要包括v4l2-core、meida framework。 前几章的内容借鉴了这篇文章&#xff1a; 【原创】Linux v4l…

Linux_OMAP4460 u-boot 1.1.4代码分析

最近在调试omap4460,决定跟踪下u-boot的代码。 有问题留下邮箱可以共同学习,调试。 代码阅读顺序: 1.第一阶段(Stage 1) 第一阶段的启动代码在 cpu\<cpu type>\start.s中,完成的工作主要有: CPU自身初始化:包括 MMU,Cache,时钟系统,SDRAM 控制器等的初始化 …

CoCube传感器MPU6050笔记

参考&#xff1a; 输出x&#xff0c;y&#xff0c;z角度信息&#xff1a; #include <MPU6050_tockn.h> #include <Wire.h>MPU6050 mpu6050(Wire);void setup() {Serial.begin(9600);Wire.begin();mpu6050.begin();mpu6050.calcGyroOffsets(true); }void loop() {…