惯导系列(一):STM232 IIC读取MPU数据

2023-11-04

前言

消失了几天的我在哪?对,没错,就在实验室默默的调试代码。
折磨我几天的MPU终于弄好了(虽然只是弄好一半,但是也是值得令人开心的)


本节介绍

本节主要介绍关于stm32使用IIC来读取mpu数据的过程,准确来说是模拟IIC读取mpu6050以及9250的相关过程


一、IIC通讯

1.1 IIC通讯简介

简单来说IIC是一种通讯方式,一般的连线方式是这样的。

 也就是说IIC需要三根线对外设进行通讯。SCL、SDA以及GND。在使用模块的时候可能会有其他的要求,比方说接5V,或者接地,这部分在开发的时候再进一步叙述。因为版权问题,IIC在STM32中设计的比较复杂(这部分看杨桃的IIC代码就明白了),最然说直接用就行了,但是还需要稍微懂一些。所以我们一般使用模拟IIC实现IIC的通讯功能。模拟IIC这里不给出代码,但是会解释有哪些步骤

1.2 模拟IIC

void IIC_Init(void);                //初始化IIC的IO口				 
void IIC_Start(void);				//发送IIC开始信号
void IIC_Stop(void);	  			//发送IIC停止信号
void IIC_Send_Byte(u8 txd);			//IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void); 				//IIC等待ACK信号
void IIC_Ack(void);					//IIC发送ACK信号
void IIC_NAck(void);				//IIC不发送ACK信号

这是模拟IIC实现函数,有些代码中可能有一些延时,没得关系。
实际使用的使用还有一些坑:

  • 1模拟IIC虽然不是真正的IIC,但是仍然也需要在原来的IIC端口上面才能开模拟IIC(我是这样觉得的)
  • 2一定要注意你的芯片IIC端口,和你代码的IIC端口要一致(比方说下面的代码就是PC12、PC11端口)连线更不能错。
//IO方向设置
#define SDA_IN()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}

//IO操作函数	 
#define IIC_SCL    PCout(12) //SCL
#define IIC_SDA    PCout(11) //SDA	 
#define READ_SDA   PCin(11)  //输入SDA 

关于IO端口方向问题,建议看这位博主的介绍:(59条消息) GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=(u32)8<<12;(学习笔记)_gpiob->crh_浦子哥的博客-CSDN博客

1.3 mpu外设

这一块直接介绍两个外设:mpu6050以及9250,因为还不做开发,所以先说一下模块:

IIC连接上面四根线就行了(9250连线也是这样)

6050主要是三轴陀螺仪与三轴加速度计组成
9250是6500(类似6050)结合磁力计组成

在设计过程中6050可以使用IIC,9250不仅可以使用IIC还可以使用spi(通讯方式)

DMP是MPU模块中官方设计的一个固件装置,这个装置对于新手比较友好,比方说能够固件滤波。9250固件库甚至有直接换成算四元素的封装函数。但是,即使优点那么多,我们还是需要使用原始数据的。(因为我们要实现更加准确的滤波算法)后面会实现位姿准换以及滤波实现。

模拟IIC对于MPU设定的ID和实际地址:

9250:
#define MPU9250_ADDR            0X68    //MPU6500的器件IIC地址
磁力计的ID地址比较复杂
6050:
//如果AD0脚(9脚)接地,IIC地址为0X68(不包含最低位).
//如果接V3.3,则IIC地址为0X69(不包含最低位).
#define MPU_ADDR				0X68

 二、实现

实现模拟IIC读取MPU的逻辑:
STM32采用IIC对MPU建立通讯,然后使用USART串口实现调试(也可以使用LCD显示屏)

2.1 代码实现

实际代码初始化MPU以及模拟IIC(模拟IIC可以放在MPU中初始化)然后在mpu的驱动函数中直接找出读取的数据然后放在主函数定义的数据里面就行了,具体说就是

MPU_Get_Accelerometer()
MPU_Get_Gyroscope()

printf()打印给串口调试工具就行了

2.2 BUG

可能出现的bug问题:

  • 一定要注意:你是否成功初始化了MPU以及模拟IIC两部分,是否能够运行到while(1)循环(因为你器件的问题就不会初始化结束卡住了),建议在while里面放一个LED0=!LED0来提示系统正在运行。
  • 你的模拟IIC定义的引脚还有MPU模块连线是否有问题,很大有可能复制别人模块忘记调端口了,导致芯片的IIC端口不对,或者设置的端口就不是你连接的端口
  • 你的器件模块一旦AD0接线了那你的MPU的ID地址就不对了
  • IIC端口设置为开漏输出(不一定有用)。正点官方是推挽输出。之前看了别人的博客说是需要设定为开漏输出,也就是这里:
    void IIC_Init(void)
    {					     
    	GPIO_InitTypeDef GPIO_InitStructure;
    	//RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟 
    	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOC, ENABLE );	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;
    	//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOC, &GPIO_InitStructure);
    	IIC_SCL=1;
    	IIC_SDA=1;
    }

 上述是仅仅从模拟IIC与MPU建立通讯的角度来谈的,后面博客还会进一步就滤波还有频率问题仔细的研究。代码因为涉及版权就不放出来了。

三、感谢

感谢这些博主还有官网的支持
正点原子
杨桃电子
(59条消息) STM32 软件模拟IIC_stm32模拟iic_一个旅者的博客-CSDN博客
【快速入门】MPU6050工作原理及应用_哔哩哔哩_bilibili

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

惯导系列(一):STM232 IIC读取MPU数据 的相关文章

随机推荐

  • ps命令解析

    ps命令用于报告当前系统的进程状态 可以搭配kill指令随时中断 删除不必要的程序 ps命令是最基本同时也是非常强大的进程查看命令 使用该命令可以确定有哪些进程正在运行和运行的状态 进程是否结束 进程有没有僵死 哪些进程占用了过多的资源等等
  • [mp4]The audio codec for mp4 atom

    In the esds atom there are a few fields of relevance to determining the codec used The first byte of content of the esds
  • 基于Spring Cloud Alibaba搭建nacos

    关系 Spring Boot是框架 将各个组件集合在一起 方便快速开发web应用 Spring Cloud基于Spring Boot 限定了一组特定的组件 从而可以方便地进行微服务工程的开发 Spring Cloud Alibaba在Spr
  • C/C++中如何获取数组的长度

    1 算术表达式 include
  • 2022李宏毅机器学习深度学习学习笔记第四周--Self-Supervised Learning

    文章目录 前言 Self Supervised Learning 什么是Self Supervised Learning Masking Input Next Sentence Prediction BERT如何使用 为什么BERT 有用呢
  • 最牛的人脸检测算法

    深大于老师的libfacedetection检测算法快速高效 准确率相当高 世界排名第五 最小可检测人脸12 12像素 关键是前两天开源了 于是我简单的看了一下 是自己用c 手敲的cnn代码 真心佩服 该代码可以在windows linux
  • pycharm安装beautifulsoup出错

    尝试一 将虚拟环境的解释器改成安装python真实路径的解释器 步骤 setting gt project interpreter gt show all gt gt system interpreter 尝试二 Python3的选择bs4
  • 休眠唤醒(suspend/resume)时长问题分析思路

    1 echo 1 gt sys power pm print times 打开suspend resume耗时开关 如下 可以看到系统休眠时各阶段驱动模块的耗时打印 可用来帮助分析排查休眠耗时长的问题 267 398855 lt 1 gt
  • windows系统c++多线程开发

    线程的一些基本概念 一 线程的基本概念 基本概念 线程 即轻量级进程 LWP LightWeight Process 是程序执行流的最小单元 一个标准的线程由线程ID 当前指令指针 PC 寄存器集合和堆栈组成 线程是进程中的一个实体 是被系
  • 50Hz双T陷波滤波器(带阻滤波器)

    一 双T陷波滤波器 针对其中50Hz仿真计算 https www docin com p 1945752171 html 双T型陷波滤波器 Ivan 的专栏 CSDN博客 t型滤波器 https blog csdn net stephani
  • C语言学习:运算符和表达式

    算数运算符 自增 自减运算符 作用是让变量的值加1减1 i 在使用i之前加一 i 在使用i之后加一 这种运算符只能用于变量 常常用在循环语句哪里 也用于指针变量 是指针指向下一个地址 算数优先级 一个数两边都有运算符 那么先考虑优先级 如果
  • 改善你的jQuery的25个步骤 千倍级效率提升

    1 从Google Code加载jQueryGoogle Code上已经托管了多种JavaScript类库 从Google Code上加载jQuery比直接从你的服务器加载更有优势 它节省了你服务器上的带宽 能够很快的从Google的内容分
  • 喜大普奔!70k Star 《Java面试突击手册》PDF版本开放下载啦!

    前段时间我的朋友 Guide 哥终于把PDF版本的 Java面试突击手册 搞定 废话不多说 直接上目录 这份文档是 JavaGuide 这个项目所有和 Java 面试相关的文章的集合 内容涵盖Java基础 计算机网络 数据库 Spring等
  • Cookie基本使用

    开发工具与关键技术 IDEA 撰写时间 2022 10 8 发送Cookie 创建Cookie对象 设置数据 Cookie cookie new Cookie String key String value 2 发送Cookie到客户端 使
  • spring使用内存数据库(h2)快速开发

    目录 什么是内存数据库 内存数据库可以解决什么问题 有哪些内存数据库 内存数据库这么多 到底选哪个好 可以参考对比 代码下载 https gitee com hong99 spring issues I1N1DF 代码实现 代码下载 htt
  • 移动端项目常见适配

    目录 1 视口设置 2 解决click事件0 3秒延迟问题 3 解决不同机型border显示不一样的问题 移动端rem适配 1 视口设置 如果是vue项目 视口设置一般在根目录或public下的index html 设置为理想视口 不允许用
  • 深度学习中训练时候遇到这些错误 RuntimeError、IndexError、ValueError如何解决

    深度学习训练中遇到一些bug torch版 RuntimeError 类型一 RuntimeError Input type torch cuda FloatTensor and weight type torch FloatTensor
  • 华为机试:最长方连续方波信号

    题目来源 最长方连续方波信号 题目描述 输入一串方波信号 求取最长的完全连续交替方波信号 并将其输出 如果有相同长度的交替方波信号 输出任一即可 方波信号高位用1标识 低位用0标识 如图 说明 1 一个完整的信号一定以0开始然后以0结尾 即
  • 我的全栈之路-C语言基础之C语言概述与开发环境搭建

    我的全栈之路 C语言基础之C语言概述与开发环境搭建 我的全栈之路 1 1 信息技术发展趋势 1 2 浅谈计算机系统架构 1 2 1 计算机系统架构概述 1 2 2 计算机硬件系统 1 2 2 计算机软件系统 1 3 程序和指令 1 4 编程
  • 惯导系列(一):STM232 IIC读取MPU数据

    前言 消失了几天的我在哪 对 没错 就在实验室默默的调试代码 折磨我几天的MPU终于弄好了 虽然只是弄好一半 但是也是值得令人开心的 本节介绍 一 IIC通讯 1 1 IIC通讯简介 1 2 模拟IIC 1 3 mpu外设 二 实现 2 1