stm32 mpu6050 模拟i2c实例实现

发布者:静逸闲云最新更新时间:2019-08-09 来源: eefocus关键字:stm32  mpu6050  模拟i2c 手机看文章 扫描二维码
随时随地手机看文章

    最近准备一个比赛,所以正在加紧学习stm32,这篇文章就结合mpu6050分析一下利用i2c实现芯片之间的通信。


    首先可以在原有的LED文件或显示屏(OLED)的文件基础上,新建一个HANDWARE,在其中加入mpu6050.c和mpu6050.h(名字自定)。

    首先是在C文件中加入基本的I2C通信函数


    1.I2C的GPIO端口初始化SDA、SCL设置为推挽输出。


    2.然后是i2c_start();i2c_stop();函数,根据时序图设置SCL、SDA的高低电平变化。


    3.之后加入主机ack的响应函数和ack的等待响应函数i2c_wait_ack();i2c_ack();i2c_waitack();。


    4.最后加入IIC_Send_Byte();和IIC_Read_Byte();


    具体实现可以参考其他文章,这里重点讲解mpu6050的通信实现。


    上面部分的一个难点在于GPIO口的模式转化,因为SDA的输入输出在变化,所以可以使用寄存器操作的宏定义来改变IO口的模式,使用位操作来控制SDA、SCL的高低电平。其中在wait_ack中设置SDA为输入,可以通过SDA_w的设置达到输入的上拉、下拉的设置,具体参考下面的端口位配置表。


#define SDA_IN()  {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=8<<0;}

#define SDA_OUT() {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=3<<0;}

 

//IO操作函数  

#define SCL    PBout(9) //SCL

#define SDA_w    PBout(8) //SDA  

#define SDA_r  PBin(8) //输入SDA 

       完成上面的I2C函数,就可以根据I2C函数完成mpu6050函数的编写了。对于具体芯片,有具体的时序分析。这部分也可以参考其他文章,这里列出实例。


u8 MPU_Write_Byte(u8 reg,u8 data)  

    i2c_start(); 

IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令

if(i2c_wait_ack()) //等待应答

{

i2c_stop();  

return 1;

}

    IIC_Send_Byte(reg); //写寄存器地址

    i2c_wait_ack(); //等待应答 

IIC_Send_Byte(data);//发送数据

if(i2c_wait_ack()) //等待ACK

{

i2c_stop();  

return 1;  

}  

    i2c_stop();  

return 0;

}

u8 MPU_Read_Byte(u8 reg)

{

u8 res;

    i2c_start(); 

IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令

i2c_wait_ack(); //等待应答 

    IIC_Send_Byte(reg); //写寄存器地址

    i2c_wait_ack(); //等待应答

    i2c_start();

IIC_Send_Byte((MPU_ADDR<<1)|1);//发送器件地址+读命令

    i2c_wait_ack(); //等待应答 

res=IIC_Read_Byte(0);//读取数据,发送nACK 

    i2c_stop(); //产生一个停止条件 

return res;

}

    


  1.针对mpu6050写出具体的字节发送、读取函数,mpu6050主要用到了MPU_Read_Byte,MPU_Write_Byte,MPU_Read_Len(连续读函数)。


    2.mpu6050的初始化函数MPU_Init(),其中会向芯片的指定寄存器传入参数,所以可以在.h文件中加入寄存器的宏定义。


    3.根据需要定义向指定寄存器读取数值的函数,mpu6050可以读取陀螺仪值、加速度值、温度值。


    其中加速度计通过重力加速度分解(利用atan2)可以得到倾角,而陀螺仪则可以测得角速度。但是这两类数据都不准确,需要数据融合。


这里给出一个互补滤波的算法。


    Angle = (0.98) * (Angle + gyro * dt) + (0.02) *(acc); 


    利用这个算法可以得到较精确的值。

关键字:stm32  mpu6050  模拟i2c 引用地址:stm32 mpu6050 模拟i2c实例实现

上一篇:STM32(五)IIC通信原理及IO口软件模拟编程
下一篇:STM32(五)IIC通信原理及IO口软件模拟编程

推荐阅读最新更新时间:2024-11-08 10:25

stm32学习笔记(一)点亮LED
#include stm32f10x.h #include delay.h void Delay(u32 count) { u32 i=0; for(;i count;i++); } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA delay_init(); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-- PA.8 端口配置 GPIO_Ini
[单片机]
<font color='red'>stm32</font>学习笔记(一)点亮LED
STM32开发笔记24:STM32L0低功耗设计
这几篇日志将详细记录,自己应用stm32进行低功耗设计的全过程。 使用芯片:STM32L053R8T6 运行模式: Range 1:电源电压限制在1.71-3.6V,CPU最大运行频率为32MHz。 Range 2:CPU最大运行频率为16MHz。 Range 3:CPU最大运行频率4.2MHz 低功耗模式: Sleep mode(睡眠模式)、Low-power run mode(低功耗运行模式)、Low-power sleep mode(低功耗睡眠模式)、Stop mode with RTC(带有RTC的停止模式)、Stop mode without R
[单片机]
<font color='red'>STM32</font>开发笔记24:STM32L0低功耗设计
STM32 FSMC机制flash拓展
STM32是ST(意法半导体)公司推出的基于ARM内核Cortex-M3的32位微控制器系列。Cortex-M3内核是为低功耗和价格敏感的应用而专门设计的,具有突出的能效比和处理速度。通过采用Thumb-2高密度指令集,Cortex-M3内核降低了系统存储要求,同时快速的中断处理能够满足控制领域的高实时性要求,使基于该内核设计的STM32系列微控制器能够以更优越的性价比,面向更广泛的应用领域。 STM32系列微控制器为用户提供了丰富的选择,可适用于工业控制、智能家电、建筑安防、医疗设备以及消费类电子产品等多方位嵌入式系统设计。STM32系列采用一种新型的存储器扩展技术——FSMC,在外部存储器扩展方面具有独特的优势,可根据系统的
[单片机]
<font color='red'>STM32</font> FSMC机制flash拓展
STM32学前班教程之三:让PC工作,开发软件的选择
1、 软件与版本的选择 需求:支持STLink2或未来的Jlink V7调试接口(因为STM32-SK使用这个接口),能够找到去除软件限制的方法,最好具有中文版帮助和界面,最好带有纯软件仿真 选择:RealView MDK 3.23RPC或者IAR EWARM 4.42A(5版本观望一下)。 2、 RealView MDK 3.23RPC(中国版)安装与去除限制 第一步:执行安装程序完成基本安装,最后选项选择加入虚拟硬件,便于纯软件调试。 第二步:执行软件,点击File-- Licence Manager,复制CID的数据到破解器的CID,其他选项如下图,然后点击Generate。 第三步:复制LIC0的数据到软件的LI
[单片机]
STM32图像处理库介绍
STM32图像处理库介绍 STM32图像处理库(STM32IPL)是一个用C语言编写的开源软件库,它提供图像处理和计算机视觉功能,以便在STM32微控制器上更快地开发视觉分析应用程序。最近,STM32IPL作为STM32Cube的一个中间件组件, 在FP-AI-VISION1功能包的最新版本(v3.1.0)中一起发布。 众所周知,计算机视觉深度学习模型的输入通常与相机捕获的图像帧不同。深度学习模型的输入可能有不同的维度和不同的图像格式,因此通常需要对原始图像进行一些基本的预处理,例如:调整大小、图像格式转换、归一化等。STM32IPL通过提供一些功能强大且随时可用的软件组件,简化并加速此类图像预处理功能的开发。 主要特性 STM3
[单片机]
<font color='red'>STM32</font>图像处理库介绍
stm32使用中,printf函数不执行的问题
一、程序中已经添加了printf的库函数 #include“stdio.h” 二、stm32串口通讯测试没问题,此处可以通过调用 USART_SendData(USART1, 0xAA)函数来进行验证; 三、现象。printf函数无法工作 四、解决办法,使用自带的迷你库,就可以正常运行。
[单片机]
<font color='red'>stm32</font>使用中,printf函数不执行的问题
STM32中定时器的时钟源
STM32中有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。 下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图: 从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。 下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当 APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟
[单片机]
<font color='red'>STM32</font>中定时器的时钟源
ST低价32位MCU:传承STM32基因 发展自己的生态系统
日前,意法半导体发布了它最新的STM32F030基于Cortex-M0内核的超值系列微控制器,以0.32美元的批量订货价格引发热议。意法半导体表示:“与同类竞争产品不同的是,STM32F030虽然只有8位微控制器的价格,但在性能和特性上并没有受到任何影响。它保持了原有的内核速度和丰富的外设,传承了STM32F0家族的优异基因。”STM32F030将面向工业控制、消费电子和家用电器三大目标应用。 低价来源于规模经济 打造宽产品线平台 在新品的交流中,意法半导体大中华与亚太区微控制器市场及应用总监James Wiart提供了这样的数据:从2009到2012年,ST在MCU市场的份额翻了一番,年增长率达到市场平均的三倍。其中
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved