STM32+MS5611测气压温度例程详解,测试无误

您所在的位置:网站首页 测量大气压的工具是什么 STM32+MS5611测气压温度例程详解,测试无误

STM32+MS5611测气压温度例程详解,测试无误

2024-07-12 10:58| 来源: 网络整理| 查看: 265

硬件平台:STM32F10X + MS5611 + JLink 

软件平台:Keil 4 

一、基础知识

首先,MS5611是什么?

MS5611气压传感器是集合SPI和I²C(高达20 MHz)总线接口的高分辨率气压传感器,分辨率可达到10cm。内部有一个高线性度的压力传感器和一个超低功耗的24位AD。

MS5611主要用于智能手机、海拔高度测量和导航辅助,做四轴的朋友一般都了解。

其次,对于飞行器的姿态控制,我们使用GY-86 10DOF 的模块,里面带有MS5611 + MPU6050 + HMC5883,通过IIC协议读取数据进行操作。MS5611挂在MPU5060的从I2C接口上。MS5611的I2C地址为0b111011Cx,其中C比特位由CSB引脚决定,为CSB引脚的补码值(取反)。GY-86上 MS5611的CSB引脚接地,所以CSB引脚值为0,8位I2C地址为0b1110111x(0xEE),7位I2C地址为 0b1110111(0x77)。

 

这里,0b表示二进制,0x表示十六进制,数字前加0表示八进制。例如:

  '\077' //是8进制表示' ',0可以省略,因为C,C++规定不允许使用斜杠加10进制数来表示字符;

  '\0x3F' //是16进制表示。这些都是C语言中的基础,不懂得请自行百度。

二、运行结果

三、相应模块

程序涉及的模块有:

RCC:复位及时钟控制模块,用于初始化STM32 USART外设时钟及IO口复用时钟;

IIC:模拟IIC 协议,好多人都说STM32的硬件IIC模块用不了,主要是因为STM32 的硬件 IIC 模块有个天生的 BUG,就是不能被中断,也就是IIC要处于中断的最高级,ST在自己后来的 DataSheet 中已经证实了这一点。

Delay:利用系统时钟SysTick,也号称“滴答”,写的延时模块;

USART:串口模块;

MS5611:MS5611模块配置。

四:代码

RCC

  #include "Rcc.h"      void RCC_Init(void)   {    ErrorStatus HSEStartUpStatus;    //定义枚举类型错误状态变量       RCC_DeInit();//复位系统时钟设置       RCC_HSEConfig(RCC_HSE_ON);    //打开外部高速时钟晶振,使能HSE    /*RCC_HSE_ON 开    _off 关 _bypass hse晶振被外部时钟旁路*/       HSEStartUpStatus = RCC_WaitForHSEStartUp();    /*RCC_WaitForHSEStartUp()返回一个ErrorStatus枚举值,    success好,error未好*/       if(HSEStartUpStatus == SUCCESS)//HES就绪    {    RCC_HCLKConfig(RCC_SYSCLK_Div1);    //AHB时钟(HCLK)=系统时钟       RCC_PCLK1Config(RCC_HCLK_Div2);    //设置低速AHB时钟(APB1)为HCLK的2分频       RCC_PCLK2Config(RCC_HCLK_Div1);    //设置高速AHB时钟(APB2)=HCLK时钟       FLASH_SetLatency(FLASH_Latency_2);    //设置FLASH延时周期数为2       //使能领取指缓存    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);       RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);    //设置PLL时钟源及倍频系数,为HSE的9倍频 8MHz * 9 = 72MHz    /*void RCC_PLLConfig(u32 RCC_PLLSource, u32 RCC_PLLMul)    RCC_PLLSource_HSI_Div2 pll输入时钟=hsi/2;    RCC_PLLSource_HSE_Div1 pll输入时钟 =hse    RCC_PLLSource_HSE_Div2 pll输入时钟=hse/2       RCC_PLLMul_2 ------_16 pll输入时钟*2---16    pll输出时钟不得超过72MHZ*/       RCC_PLLCmd(ENABLE);    //ENABLE / DISABLE       while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//等待PLL输出稳定    /*FlagStatus RCC_GetFlagStatus(u8 RCC_FLAG) 检查指定RCC标志位    返回SET OR RESET    RCC_FLAG_HSIRDY HSI晶振就绪    RCC_FLAG_HSERDY    RCC_FLAG_PLLRDY    RCC_FLAG_LSERDY    RCC_FLAG_LSIRDY.......*/       RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);    //设置PLL为系统时钟源    /*void RCC_SYSCLKConfig(u32 RCC_SYSCLKSource) 设置系统时钟    RCC_SYSCLKSource_HSI    RCC_SYSCLKSource_HSE    RCC_SYSCLKSource_PLLCLK 选HSI HSE PLL 作为系统时钟*/       while(RCC_GetSYSCLKSource() != 0x08);    //判断PLL是否是系统时钟    /*u8 RCC_GetSYSCLKSource(void) 返回用作系统时钟的时钟源    0x00:HSI 0x04:HSE 0x08:PLL */    }       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |    RCC_APB2Periph_AFIO |    RCC_APB2Periph_GPIOB , ENABLE);    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);    //U2 U3 时钟在APB1    //打开GPIO时钟,复用功能,串口1的时钟       RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟    //好奇怪,是因为官方的库函数更新?    //不是说F10X系列只有一个CAN,而F4有CAN1 CAN2 吗?    //怎么他的系统配置文件里面是can1?????       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能       /*void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState)    enable 或 disable apb2 外设时钟    RCC_APB2Periph_AFIO 功能复用IO 时钟    RCC_APB2Periph_GPIOA/B/C/D/E GPIOA/B/C/D/E 时钟    RCC_APB2Periph_ADC1/ADC2 ADC1/2 时钟    RCC_APB2Periph_TIM1    RCC_APB2Periph_SPI1    RCC_APB2Periph_USART1    RCC_APB2Periph_ALL 全部APB2外设时钟*/   }  

IIC

  #include "myIIC.h"         unsigned char I2C_ReadByte(unsigned char DeviceAddr,unsigned char address); //从24c02的地址address中读取一个字节数据   void I2C_WriteByte(unsigned char DeviceAddr,unsigned char address,unsigned char info);   void I2C_NoAddr_WriteByte(unsigned char DeviceAddr,unsigned char info);   void I2C_Read_MultiBytes(unsigned char DeviceAddr,unsigned char address,unsigned char BytesNum,unsigned char * OutDate );   uint16_t I2C_Read_2Bytes(unsigned char DeviceAddr,unsigned char address);   uint32_t I2C_Read_3Bytes(unsigned char DeviceAddr,unsigned char address);   void delay_nop(void);   void delay2(unsigned int x);   void iic_start(void);   void iic_stop(void);   void iic_writex(unsigned char j);   unsigned char iic_readx(void);   void iic_check_ACK(void);   void iic_SDA_Set_Dir(unsigned char io_set);   void I2C_GPIO_Configuration(void);   void delay2(unsigned int x)   {    unsigned int i;    for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3