精华内容
下载资源
问答
  • stm32压力传感器程序
    2022-05-10 13:42:29

    本设计:
    基于STM32的BMP180气压传感器(仿真+程序)
    Proteus仿真版本:proteus 8.9
    程序编译器:keil 5
    编程语言:C语言
    编号C0026

    设计说明:
    通过STM32读取BMP180输出的数据通过串口及LCD显示屏,将高度,温度大气压强信息显示出来。
    注:仿真效果有些许误差,不能100%还原传感器,误差大概1%

    仿真图(提供源文件):
    在这里插入图片描述

    源程序(提供源文件):
    在这里插入图片描述

    /* 
    资料链接:https://pan.baidu.com/s/1Hw01NwP6xwg9ahjPWS4q9w?pwd=z5fg 
    */
    #include "main.h"
    #include "stm32f1xx.h"
    #include "./usart/bsp_debug_usart.h"
    #include "./led/bsp_led.h"
    #include "./i2c/bsp_i2c_ee.h"
    #include "BMP180.h"
    #include "LCD.h"
    #include "math.h"
    uint8_t cal_flag = 0;
    uint8_t k;
    typedef uint32_t  u32;
    typedef uint16_t u16;
    typedef uint8_t  u8;
    /*存储小数和整数的数组,各7个*/
    long double double_buffer[7] = {0};
    int int_bufffer[7] = {0};
    
    #define DOUBLE_ADDR       10
    #define LONGINT_ADDR      70
    
    /**
      * @brief  主函数
      * @param  无
      * @retval 无
      */
    int main(void)
    {
        char str[80];
        extern long   result_UT;
        extern long  result_UP;	
        u32 result_UPP,temp;
        float altitude;	  
      HAL_Init();        
      /* 配置系统时钟为72 MHz */ 
      SystemClock_Config();
    
      /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
      DEBUG_USART_Config();
      
    	printf("\r\n 这是一个EEPROM 读写小数和长整数实验 \r\n");
    //LCD1602_GPIO_Config();   //开启GPIO口
      HAL_Delay(10);  //延时一段时间	
      /* I2C 外设初(AT24C02)始化 */
      i2c_CfgGpio();
    	Init_BMP180();        //初始化bmp180	
    	LCD_init();
    	HAL_Delay(10);          
      while (1)
      {  
          
      /*读取数据标志位*/
        bmp180Convert();//添加报警 气压过低时候 高原地区气压低于600mmhg,而1mmhg=133.3p。所以为80000p
    		altitude=44330.0*(1-pow((float)result_UP/101325,1/5.255));            //计算高度
    //		OLED_ShowNum(77,32,altitude,4,12);  
        result_UPP=result_UP/100;
    		printf("大气压强 %d.%d 帕\r\n",result_UPP,result_UP%100);
        result_UPP=altitude;
        printf(" 高度%d m\r\n",result_UPP);
        sprintf(str, "%dM %d.%dPa",result_UPP ,result_UP/100,result_UP%100);
        LCD_write_string(1, 0, (char *)str);
    //		OLED_ShowNum(77,52,(u8)(result_UT*0.1),4,12);     //显示温度整数部分 因为测量值例如为245没有小数点.....                                         //可以加一个判断 报警
    		temp=result_UT;                         //计算小数部分
        printf("温度  %d.%d 摄氏度\r\n",temp/10,temp%10);
        sprintf(str, " %d.%d C",temp/10 ,temp%10);
        LCD_write_string(1, 1, (char *)str);
        HAL_Delay(1000);
    
          
      }
    }
    void SystemClock_Config(void)
    {
       RCC_OscInitTypeDef RCC_OscInitStruct;
      RCC_ClkInitTypeDef RCC_ClkInitStruct;
      RCC_PeriphCLKInitTypeDef PeriphClkInit;
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.HSICalibrationValue = 16;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
    //    Error_Handler();
      }
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    
      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
      {
    //    Error_Handler();
      }
    
      PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
      PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
      if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
      {
    //    Error_Handler();
      }
    
        /**Configure the Systick interrupt time 
        */
      HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
    
        /**Configure the Systick 
        */
      HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
    
      /* SysTick_IRQn interrupt configuration */
      HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
    }
    

    内容如下:
    在这里插入图片描述

    更多相关内容
  • 基于stm32压力传感器.rar
  • MPX4250是一种线性度极强的一种压力传感器,它的线性范围为20-250kpa,测量范围也比较广泛,适用于大多数场合的压力检测。 废话不多说,先看mpx4250的接线图: 可以看到mpx4250的外接电路还是很方便的,再附上一张...
  • FSR薄膜压力传感器STM32源代码,读取DO数据
  • STM32f1系列压力传感器MPX4250压力检测 MPX4250是一种线性度极强的一种压力传感器,它的线性范围为20-250kpa,测量范围也比较广泛,适用于大多数场合的压力检测。
  • BMP180是一款由BOSCH开发的数字压力传感器,IIC接口,压力测量范围可以从300hPa至1100hPa,测量海拔高度大约从9000m至-500m。 工作电压范围在1.8V~3.6V,满足大部分单片机电平要求。 功耗低,标准模式下单次采样功耗...

    老规矩,话不多说,先送上代码 https://github.com/Tuya-Community/tuya-iotos-embeded-mcu-demo-wifi-ble-air-pressure-sensor

    BMP180 简介


    BMP180是一款由BOSCH开发的数字压力传感器,IIC接口,压力测量范围可以从300hPa至1100hPa,测量海拔高度大约从9000m至-500m。
    工作电压范围在1.8V~3.6V,满足大部分单片机电平要求。
    功耗低,标准模式下单次采样功耗大约5uA。
    低噪声,在低功耗模式下,大约只有0.06hPa,超高分辨模式下只有0.02hPa。
    内置温度传感器,加上一些算法可以进行温度补偿。
    其他性能可以查看数据手册

    各模式的配置参数和电气特性如下

    校准参数和读取

    BMP180传感器有大量的出厂校准参数,利用这些参数和特点算法,可以很精准的得到我们想要的气压值。
    参数寄存器表如下

    具体读取函数在void bmp180_get_calib_param(void)中
    获取好参数后,我们就可以读取温度和压力寄存器,获取当前未补偿的温度和压力值

    具体方法请查看
    uint16_t bmp180_get_uncomp_temperature(void)和
    uint32_t bmp180_get_uncomp_pressure(uint8_t oss_mode)函数

    数据补偿


    有了校准参数和原始温度压力数据后,接下来就是要进行数据补偿了,
    具体算法我已经整理出来给大家。
    温度校准

    压力校准:

    完整补偿算法请查看
    ** bmp180_get_temperature(uint32_t v_uncomp_temperature_u32)

    bmp180_get_pressure(uint32_t v_uncomp_pressure_u32)**
    这两个函数。
    这样,经过上面一系列处理,我们终于获得了我们想要的温度值和压力值。

    最后再给大家附上整体流程图

    海拔换算

    大家都知道,气压和高度存在一定的关系,但是这个关系是怎么样的呢,哈哈,我有答案。

    根据上面式子,我们就能很轻易写出算法公式
    Altitude =(44330.0 * (1.0-pow((float)(gas_pressure.now) / 101325, 1.0/5.255)));

    好啦,至此,大家肯定对BMP180有了比较深刻的认识,快去测试自己的程序吧,有问题,欢迎在评论区留言。
     

     

    展开全文
  • #include "sys.h" #include "delay.h" #include "usart.h" #include "HX711.h" int main(void) { Init_HX711pin();... NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2...
  • 涂鸦模组开发(压力传感器HX711)——1. 模块准备 https://blog.csdn.net/qq_24312945/article/details/123136749 涂鸦模组开发(压力传感器HX711)——2. 压力传感器HX711 ...涂鸦模组开发(压力传感器HX711)——3....
  • STM32采集DHT11、压力传感器、MPU6050通过wifi魔铠ESP8266发送
  • BMP390是BOSCH公司的一款高精度压力传感器(参考网址:https://www.bosch-sensortec.com/products/environmental-sensors/pressure-sensors/pressure-sensors-bmp390.html),其主要参数如下图所示,通信方式为I2C与...

            BMP390是BOSCH公司的一款高精度压力传感器(参考网址:https://www.bosch-sensortec.com/products/environmental-sensors/pressure-sensors/pressure-sensors-bmp390.html),其主要参数如下图所示,通信方式为I2C与SPI方式,最大供电电压为3.6V,相对精度为±3Pa(700hPa~1100hPa),绝对精度为±50Pa(300hPa~1100hPa)

             我们主要通过I2C进行通信,其硬件参考电路如下图所示,其中R1,R2为上拉电阻,阻值为4.7kΩ,C1,C2为旁路电容,容值为100 nF,CSB引脚拉高,SDO引脚为从机地址的选取引脚,接地时地址为0x76(01110110),当接高时地址为0x77(01110111)

            I2C的通信方式,大家可以自行查阅,或者参考我以前的博客SPL06的底层代码,https://blog.csdn.net/qq_40598185/article/details/119347845。大同小异。为了大家方便复制,这里给出I2C的底层驱动代码,使用的是正点原子的底层驱动代码。(myiic.c)

    #include "myiic.h"
    #include "delay.h"
     
    //初始化I2C
    void IIC_Init(void)
    {					     
    	GPIO_InitTypeDef GPIO_InitStructure;
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    	   
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_15;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    	GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_15); 	//SET the Pins to high level
    }
    //产生I2C起始信号(即START信号)
    void IIC_Start(void)
    {
    	SDA_OUT();   
    	IIC_SDA=1;	  	  
    	IIC_SCL=1;
    	delay_us(4);
     	IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
    	delay_us(4);
    	IIC_SCL=0;
    }	  
    //产生I2C停止信号(即STOP信号)
    void IIC_Stop(void)
    {
    	SDA_OUT();
    	IIC_SCL=0;
    	IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
     	delay_us(4);
    	IIC_SCL=1; 
    	IIC_SDA=1;
    	delay_us(4);							   	
    }
    //等待应答信号
    //返回值:1,接收应答失败
    //        0,接收应答成功
    u8 IIC_Wait_Ack(void)
    {
    	u8 ucErrTime=0;
    	SDA_IN();      
    	IIC_SDA=1;delay_us(1);	   
    	IIC_SCL=1;delay_us(1);	 
    	while(READ_SDA)
    	{
    		ucErrTime++;
    		if(ucErrTime>250)
    		{
    			IIC_Stop();
    			return 1;
    		}
    	}
    	IIC_SCL=0;	   
    	return 0;  
    } 
    //产生ACK应答信号
    void IIC_Ack(void)
    {
    	IIC_SCL=0;
    	SDA_OUT();
    	IIC_SDA=0;
    	delay_us(2);
    	IIC_SCL=1;
    	delay_us(2);
    	IIC_SCL=0;
    }
    //不产生ACK应答信号	    
    void IIC_NAck(void)
    {
    	IIC_SCL=0;
    	SDA_OUT();
    	IIC_SDA=1;
    	delay_us(2);
    	IIC_SCL=1;
    	delay_us(2);
    	IIC_SCL=0;
    }					 				     
    //I2C发送一个字节
    //返回从机有无应答
    //1,有应答
    //0,无应答		  
    void IIC_Send_Byte(u8 txd)
    {                        
        u8 t;   
    	SDA_OUT(); 	    
        IIC_SCL=0;
        for(t=0;t<8;t++)
        {              
    			IIC_SDA=(txd&0x80)>>7;
    			txd<<=1; 	  
    			delay_us(2);
    			IIC_SCL=1;
    			delay_us(2); 
    			IIC_SCL=0;	
    			delay_us(2);
        }	 
    } 	    
    //读1个字节,ack=1时,发送ACK,ack=0时,发送nACK 
    u8 IIC_Read_Byte(unsigned char ack)
    {
    	unsigned char i,receive=0;
    	SDA_IN();
        for(i=0;i<8;i++ )
    	{
    		IIC_SCL=0; 
    		delay_us(2);
    		IIC_SCL=1;
    		receive<<=1;
    		if(READ_SDA)receive++;   
    		delay_us(1); 
      }					 
    	if (!ack)
    			IIC_NAck();
    	else
    			IIC_Ack();  
    	return receive;
    }
    

            其头文件如下(myiic.h):

    
    #ifndef __MYIIC_H
    #define __MYIIC_H
    #include "sys.h"
     
    //IO方向设置
     
    #define SDA_IN()  {GPIOB->CRH&=0X0FFFFFFF;GPIOB->CRH|=(u32)8<<28;}
    #define SDA_OUT() {GPIOB->CRH&=0X0FFFFFFF;GPIOB->CRH|=(u32)3<<28;}
     
    //IO口操作函数	 
    #define IIC_SCL    PBout(13) //SCL
    #define IIC_SDA    PBout(15) //输出SDA	 
    #define READ_SDA   PBin(15)  //输入SDA 
     
    //I2C所有操作函数
    void IIC_Init(void);                //初始化I2C的IO口				 
    void IIC_Start(void);				//发送IIC开始信号
    void IIC_Stop(void);	  			//发送IIC停止信号
    void IIC_Send_Byte(u8 txd);			//I2C发送一个字节
    u8 IIC_Read_Byte(unsigned char ack);//I2C读取一个字节
    u8 IIC_Wait_Ack(void); 				//I2C等待ACK信号
    void IIC_Ack(void);					//I2C发送ACK信号
    void IIC_NAck(void);				//I2C不发送ACK信号
     
    void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
    u8 IIC_Read_One_Byte(u8 daddr,u8 addr);	  
    #endif

             寄存器地址分布如下图所示,由于我们没有用到FIFO,所以关于FIFO的寄存器配置都不需要关注(只列出我们需要关注的寄存器)。

            寄存器的配置如下所示,相关寄存器的详细说明请查看手册,这里压强测量使用的是最高精度测量,没有使用IIR滤波器。

    u8 BMP390_Init(void)
    {
    	u8 BMP390_ID;
    	BMP390_Write_Byte(CMD_Addr,0xB6);//RESET
    	delay_ms(100);
    	BMP390_ID = BMP390_Read_Byte(CHIP_ID_Addr);//Read the CHIP_ID-0x60
    	BMP390_Write_Byte(PWR_CTRL_Addr,0x33);//Set Working mode and state of sensor
    	BMP390_Write_Byte(IF_CONF_Addr,0x00);//Serial interface settings
    	BMP390_Write_Byte(INT_CTRL_Addr,0x02);//Set interrupt config
    	BMP390_Write_Byte(OSR_Addr,0x15);//Set the PM-RATE and PM-PRC,Set the TMPI-RATE and TMP-PRC
    	BMP390_Write_Byte(ODR_Addr,0x04);//Set the configuration of the output data rates by means of setting the subdivision/subsampling.
    	BMP390_Write_Byte(CONFIG_Addr,0x00);//IIR filter coeffcients
    	return BMP390_ID;
    }

             同样的,BMP390有校正参数需要读取与相应的计算,BMP390的校准参数表如下所示,最后标注出了是否有符号以及校准参数相应的位数。一共有11个压强校准参数与3个温度校准参数。

           在参数读取之后,需要对其进行一定的处理,处理方法如下图所示:

              其最后的参数计算如下图所示(温度计算流程):

       其最后的参数计算如下图所示(压强计算流程):

             最后BMP390的相关程序如下所示(BMP390.c):

    #include "BMP390.h"
    
    void BMP390_Write_Byte(u8 addr,u8 data)
    {
      IIC_Start();
    	IIC_Send_Byte(BMP390_Write);
    	IIC_Wait_Ack();
    	IIC_Send_Byte(addr);
    	IIC_Wait_Ack();
    	IIC_Send_Byte(data);
    	IIC_Wait_Ack();
    	IIC_Stop();
    }
    
    u8 BMP390_Read_Byte(u8 addr)
    {
    	u8 BMP390_Data;
    	
    	IIC_Start();
    	IIC_Send_Byte(BMP390_Write);
    	IIC_Wait_Ack();
    	IIC_Send_Byte(addr);
    	IIC_Wait_Ack();
    
    	IIC_Start();// start again
    	IIC_Send_Byte(BMP390_Read);
    	IIC_Wait_Ack();
    	BMP390_Data = IIC_Read_Byte(0);
    	IIC_Stop();
    	return BMP390_Data;
    }
    u8 BMP390_Init(void)
    {
    	u8 BMP390_ID;
    	BMP390_Write_Byte(CMD_Addr,0xB6);//RESET
    	delay_ms(100);
    	BMP390_ID = BMP390_Read_Byte(CHIP_ID_Addr);//Read the CHIP_ID-0x60
    	BMP390_Write_Byte(PWR_CTRL_Addr,0x33);//Set Working mode and state of sensor
    	BMP390_Write_Byte(IF_CONF_Addr,0x00);//Serial interface settings
    	BMP390_Write_Byte(INT_CTRL_Addr,0x02);//Set interrupt config
    	BMP390_Write_Byte(OSR_Addr,0x15);//Set the PM-RATE and PM-PRC,Set the TMPI-RATE and TMP-PRC
    	BMP390_Write_Byte(ODR_Addr,0x04);//Set the configuration of the output data rates by means of setting the subdivision/subsampling.
    	BMP390_Write_Byte(CONFIG_Addr,0x00);//IIR filter coeffcients
    	return BMP390_ID;
    }
    
    u32 Temperature_Read(void)
    {
    	u8 Temp_MSB,Temp_CSB,Temp_LSB;
    	u32 Temperature;
    	Temp_MSB = BMP390_Read_Byte(TMP_B2_Addr);
    	Temp_CSB = BMP390_Read_Byte(TMP_B1_Addr);
    	Temp_LSB = BMP390_Read_Byte(TMP_B0_Addr);
        Temperature = (Temp_MSB<<16)+(Temp_CSB<<8)+Temp_LSB;
    	return Temperature;
    }
    
    u32 Pressure_Read(void)
    {
    	u8 Pressure_MSB,Pressure_CSB,Pressure_LSB;
    	u32 Pressure;
        Pressure_MSB = BMP390_Read_Byte(PSR_B2_Addr);
    	Pressure_CSB = BMP390_Read_Byte(PSR_B1_Addr);
    	Pressure_LSB = BMP390_Read_Byte(PSR_B0_Addr);
    	Pressure = (Pressure_MSB<<16)+(Pressure_CSB<<8)+Pressure_LSB;
    	return Pressure;
    }
    
    void Parameter_Reading(int *Pressure_Para,int *Temperature_Para)
    {
    	u8 Temp_Config0,Temp_Config1,Temp_Config2,Temp_Config3,Temp_Config4;
    	u8 Press_Config0,Press_Config1,Press_Config2,Press_Config3,Press_Config4;
    	u8 Press_Config5,Press_Config6,Press_Config7,Press_Config8,Press_Config9;
    	u8 Press_Config10,Press_Config11,Press_Config12,Press_Config13,Press_Config14;
      u8 Press_Config15;	
    	//Temperature coefficients
    	Temp_Config0 = BMP390_Read_Byte(NVM_PAR_T1_L_Addr);
    	Temp_Config1 = BMP390_Read_Byte(NVM_PAR_T1_H_Addr);
    	Temp_Config2 = BMP390_Read_Byte(NVM_PAR_T2_L_Addr);
    	Temp_Config3 = BMP390_Read_Byte(NVM_PAR_T2_H_Addr);
    	Temp_Config4 = BMP390_Read_Byte(NVM_PAR_T3_Addr);
    	Temperature_Para[0] = (Temp_Config1<<8)+Temp_Config0;//T1
    	Temperature_Para[1] = (Temp_Config3<<8)+Temp_Config2;//T2
    	Temperature_Para[2] = Temp_Config4;//T3
    	if(Temperature_Para[2]&0x80) Temperature_Para[2] = Temperature_Para[2]-Total_Number_8;
    	//Pressure coefficients
    	Press_Config0 = BMP390_Read_Byte(NVM_PAR_P1_L_Addr);
    	Press_Config1 = BMP390_Read_Byte(NVM_PAR_P1_H_Addr);
    	Press_Config2 = BMP390_Read_Byte(NVM_PAR_P2_L_Addr);
    	Press_Config3 = BMP390_Read_Byte(NVM_PAR_P2_H_Addr);
    	Press_Config4 = BMP390_Read_Byte(NVM_PAR_P3_Addr);
    	Press_Config5 = BMP390_Read_Byte(NVM_PAR_P4_Addr);
    	Press_Config6 = BMP390_Read_Byte(NVM_PAR_P5_L_Addr);
    	Press_Config7 = BMP390_Read_Byte(NVM_PAR_P5_H_Addr);
    	Press_Config8 = BMP390_Read_Byte(NVM_PAR_P6_L_Addr);
    	Press_Config9 = BMP390_Read_Byte(NVM_PAR_P6_H_Addr);
    	Press_Config10 = BMP390_Read_Byte(NVM_PAR_P7_Addr);
    	Press_Config11 = BMP390_Read_Byte(NVM_PAR_P8_Addr);
    	Press_Config12 = BMP390_Read_Byte(NVM_PAR_P9_L_Addr);
    	Press_Config13 = BMP390_Read_Byte(NVM_PAR_P9_H_Addr);
    	Press_Config14 = BMP390_Read_Byte(NVM_PAR_P10_Addr);
    	Press_Config15 = BMP390_Read_Byte(NVM_PAR_P11_Addr);
    	//Coefficient P1
    	Pressure_Para[0] = (Press_Config1<<8)+Press_Config0;//P1
    	if(Pressure_Para[0]&0x8000) Pressure_Para[0] = Pressure_Para[0] - Total_Number_16;//P1
    	//Coefficient P2
    	Pressure_Para[1] = (Press_Config3<<8)+Press_Config2;//P2
    	if(Pressure_Para[1]&0x8000) Pressure_Para[1] = Pressure_Para[1] - Total_Number_16;//P2
    	//Coefficient P3
    	Pressure_Para[2] = Press_Config4;//P3
    	if(Pressure_Para[2]&0x80) Pressure_Para[2] = Pressure_Para[2] - Total_Number_8;//P3
    	//Coefficient P4
    	Pressure_Para[3] = Press_Config5;//P4
    	if(Pressure_Para[3]&0x80) Pressure_Para[3] = Pressure_Para[3] - Total_Number_8;//P4
    	//Coefficient P5
    	Pressure_Para[4] = (Press_Config7<<8)+Press_Config6;//P5
    	//Coefficient P6
    	Pressure_Para[5] = (Press_Config9<<8)+Press_Config8;//P6
    	//Coefficient P7
    	Pressure_Para[6] = Press_Config10;//P7
    	if(Pressure_Para[6]&0x80) Pressure_Para[6] = Pressure_Para[6] - Total_Number_8;//P7
    	//Coefficient P8
    	Pressure_Para[7] = Press_Config11;//P8
    	if(Pressure_Para[7]&0x80) Pressure_Para[7] = Pressure_Para[7] - Total_Number_8;//P8
    	//Coefficient P9
    	Pressure_Para[8] = (Press_Config13<<8)+Press_Config12;//P9
    	if(Pressure_Para[8]&0x8000) Pressure_Para[8] = Pressure_Para[8] - Total_Number_16;//P9
    	//Coefficient P10
    	Pressure_Para[9] = Press_Config14;//P10
    	if(Pressure_Para[9]&0x80) Pressure_Para[9] = Pressure_Para[9] - Total_Number_8;//P10
    	//Coefficient P11
    	Pressure_Para[10] = Press_Config15;//P11
    	if(Pressure_Para[10]&0x80) Pressure_Para[10] = Pressure_Para[10] - Total_Number_8;//P11
    }
    double Correcting_Pressure(u32 Pressure,int *Pressure_Para,double Corr_Temperature)
    {
    	  double PAR_P1,PAR_P2,PAR_P3,PAR_P4,PAR_P5;
    	  double PAR_P6,PAR_P7,PAR_P8,PAR_P9,PAR_P10,PAR_P11;
    	  double Corr_Pressure,partial_data1,partial_data2,partial_data3,partial_data4;
    	  double partial_out1,partial_out2;
    	  PAR_P1 = (Pressure_Para[0]-Total_Number_14)/Total_Number_20;
    	  PAR_P2 = (Pressure_Para[1]-Total_Number_14)/Total_Number_29;
    	  PAR_P3 = Pressure_Para[2]/Total_Number_32;
    	  PAR_P4 = Pressure_Para[3]/Total_Number_32/Total_Number_5;
    	  PAR_P5 = Pressure_Para[4]/Total_Number_Neg_3;
    	  PAR_P6 = Pressure_Para[5]/Total_Number_6;
    	  PAR_P7 = Pressure_Para[6]/Total_Number_8;
    	  PAR_P8 = Pressure_Para[7]/Total_Number_15;
    	  PAR_P9 =  Pressure_Para[8]/Total_Number_32/Total_Number_16;
    	  PAR_P10 =  Pressure_Para[9]/Total_Number_32/Total_Number_16;
    	  PAR_P11 =  Pressure_Para[10]/Total_Number_32/Total_Number_32/Total_Number_1;
    	  //Calculation
    	  partial_data1 = PAR_P6*Corr_Temperature;
    	  partial_data2 = PAR_P7*Corr_Temperature*Corr_Temperature;
    	  partial_data3 = PAR_P8*Corr_Temperature*Corr_Temperature*Corr_Temperature;
    	  partial_out1 = PAR_P5+partial_data1+partial_data2+partial_data3;
    	
    	  partial_data1 = PAR_P2*Corr_Temperature;
    	  partial_data2 = PAR_P3*Corr_Temperature*Corr_Temperature;
    	  partial_data3 = PAR_P4*Corr_Temperature*Corr_Temperature*Corr_Temperature;
    	  partial_out2 = (double)(Pressure)*(PAR_P1+partial_data1+partial_data2+partial_data3);
    		
    	  partial_data1 = (double)(Pressure)*(double)(Pressure);
    	  partial_data2 = PAR_P9+PAR_P10*Corr_Temperature;
    	  partial_data3 = partial_data1*partial_data2;
    	  partial_data4 = partial_data3+(double)(Pressure)*(double)(Pressure)*(double)(Pressure)*PAR_P11;
    	  Corr_Pressure = partial_out1+partial_out2+partial_data4;
    		return Corr_Pressure;
    }
    
    double Correcting_Temperature(u32 Temperature,int *Temperature_Para)
    {	
    	double Corr_Temperature,PAR_T1,PAR_T2,PAR_T3;
    	double	partial_data1,parital_data2;
    	
    	
    	PAR_T1 = Temperature_Para[0]/Total_Number_Neg_8;
    	PAR_T2 = Temperature_Para[1]/Total_Number_30;
    	PAR_T3 = Temperature_Para[2]/Total_Number_32/Total_Number_16;
    	//Calculation
    	partial_data1 = (double)(Temperature)-PAR_T1;
    	parital_data2 = partial_data1*PAR_T2;
    	Corr_Temperature = parital_data2+partial_data1*partial_data1*PAR_T3;
    	return Corr_Temperature;
    }

             其头文件如下所示(BM390.h):

    #ifndef __BMP390_H
    #define __BMP390_H
    #include "myiic.h"
    #include "sys.h"
    #include "LCD.h"
    #include "delay.h"
    #include "stdio.h"
    #include "math.h"
    
    #define BMP390_Write 0XEE
    #define BMP390_Read 0xEF
    
    #define CHIP_ID_Addr 0x00
    #define REV_ID_Addr 0x01
    #define ERR_REG_Addr 0x02
    #define STATUS_Addr 0x03
    
    #define PSR_B2_Addr 0x06
    #define PSR_B1_Addr 0x05
    #define PSR_B0_Addr 0x04
    
    #define TMP_B2_Addr 0x09
    #define TMP_B1_Addr 0x08
    #define TMP_B0_Addr 0x07
    
    #define SENSORTIME_0_Addr 0x0C
    #define SENSORTIME_1_Addr 0x0D
    #define SENSORTIME_2_Addr 0x0E
    
    #define EVENT_Addr 0x10
    #define INT_CTRL_Addr 0x19
    #define IF_CONF_Addr 0x1A
    #define PWR_CTRL_Addr 0x1B
    #define OSR_Addr 0x1C
    #define ODR_Addr 0x1D
    #define CONFIG_Addr 0x1F
    #define CMD_Addr 0x7E
    
    #define NVM_PAR_P11_Addr  0x45
    #define NVM_PAR_P10_Addr  0x44
    #define NVM_PAR_P9_H_Addr  0x43
    #define NVM_PAR_P9_L_Addr  0x42
    #define NVM_PAR_P8_Addr  0x41
    #define NVM_PAR_P7_Addr  0x40
    #define NVM_PAR_P6_H_Addr  0x3F
    #define NVM_PAR_P6_L_Addr  0x3E
    #define NVM_PAR_P5_H_Addr  0x3D
    #define NVM_PAR_P5_L_Addr  0x3C
    #define NVM_PAR_P4_Addr  0x3B
    #define NVM_PAR_P3_Addr  0x3A
    #define NVM_PAR_P2_H_Addr  0x39
    #define NVM_PAR_P2_L_Addr  0x38
    #define NVM_PAR_P1_H_Addr  0x37
    #define NVM_PAR_P1_L_Addr  0x36
    
    #define NVM_PAR_T3_Addr  0x35
    #define NVM_PAR_T2_H_Addr  0x34
    #define NVM_PAR_T2_L_Addr  0x33
    #define NVM_PAR_T1_H_Addr  0x32
    #define NVM_PAR_T1_L_Addr  0x31
    
    #define Total_Number_32 4294967296.0
    #define Total_Number_30 1073741824.0
    #define Total_Number_29 536870912.0
    #define Total_Number_24 16777216.0
    #define Total_Number_20 1048576.0
    #define Total_Number_16 65536.0
    #define Total_Number_15 32768.0
    #define Total_Number_14 16384.0
    #define Total_Number_12 4096.0
    #define Total_Number_8 256.0
    #define Total_Number_6 64.0
    #define Total_Number_5 32.0
    #define Total_Number_1 2.0
    
    #define Total_Number_Neg_8 0.00390625
    #define Total_Number_Neg_3 0.125
    
    u8 BMP390_Init(void);
    u8 BMP390_Read_Byte(u8 addr);
    u32 Temperature_Read(void);
    u32 Pressure_Read(void);
    void BMP390_Write_Byte(u8 addr,u8 data);
    void Parameter_Reading(int *Pressure_Para,int *Temperature_Para);
    double Correcting_Temperature(u32 Temperature,int *Temperature_Para);
    double Correcting_Pressure(u32 Pressure,int *Pressure_Para,double Corr_Temperature);
    
    #endif
    

            主函数如下,这里LCD的相关函数是正点原子的LCD函数,用于显示,需要的请自行去正点原子论坛下载。

    #include "delay.h"
    #include "sys.h"
    #include "lcd.h"
    #include "usart.h"
    #include "myiic.h"
    #include "BMP390.h"
    #include "math.h"
    
    #define Average_Times 6
    #define Standard_atmospheric_pressure 101325.0
    #define Offest_Pressure 0
     int main(void)
     {	 
    	u8 t=0;
    	u8 i;
    	u8 Config;
    	u8 lcd_id[12];			
    	u8 BMP390_ID;
    	u32 Altitude_Temp,Alti_temp;
    	u32 Temperature,Temperature_Temp,Temp_temp;
    	u32 Pressure,Pressure_Temp,Pres_temp;
    	int Pressure_Para[11],Temperature_Para[3];
    	float Altitude;
    	double Correcting_Temp,Correcting_Press;
    	//Delay initialization	  
    	delay_init();	    	 
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	
    	// USART->115200
    	uart_init(115200);	 	
    	//IIC initialization
    	IIC_Init();
    	//LCD initialization
    	LCD_Init();
    	LCD_Clear(WHITE); 
    	sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//½«LCD ID´òÓ¡µ½lcd_idÊý×é¡\
    	//show initialization
        POINT_COLOR=BLUE;	 
    	LCD_ShowString(30,20,240,24,16,"Pressure Measurement");
    	POINT_COLOR=RED;
        LCD_ShowString(30,44,240,24,12,"Device ID:");
    	LCD_ShowString(30,56,240,24,12,"Mode:Temperature and Pressure");	
    	LCD_ShowString(30,68,240,24,16,"Pressure:");
    	LCD_ShowString(30,84,240,24,12,"Temperature:");
    	LCD_ShowString(30,96,240,24,12,"Altitude:");
    	LCD_ShowString(30,108,240,24,12,"Sensor:");
    	LCD_ShowString(30,120,240,24,12,"Sensor Config Status:");
    	LCD_ShowString(30,132,240,24,12,"Number of Reads:");
    	//SPL06_Init
    	BMP390_ID = BMP390_Init();
    	Parameter_Reading(Pressure_Para,Temperature_Para);
    	LCD_ShowxNum(91,44,BMP390_ID,3,12,0);
    	//Judge the relevant state of the sensor
    	Config = BMP390_Read_Byte(ERR_REG_Addr);
    	if(Config&0x01) LCD_ShowString(73,108,240,24,12,"Fatal Error");
    	else LCD_ShowString(73,108,240,24,12,"No errors.");
    	if((Config>>1)&0x01) LCD_ShowString(157,120,240,24,12,"Failed.");
    	else LCD_ShowString(157,120,240,24,12,"Successful.");
      while(1) 
    	{	
    		Pressure = 0;
    		Temperature = 0;
    		for (i=0;i<Average_Times;i++)
    		{
    			Config = BMP390_Read_Byte(STATUS_Addr);
    			while(1)
    			{
    				if(((Config>>5)&0x01) && ((Config>>6)&0x01) && i == 0)
    				{
    					Pressure = Pressure_Read();
    					Temperature = Temperature_Read();
                        LCD_ShowString(30,144,240,24,12,"                  ");					
    					LCD_ShowString(30,144,240,24,12,"Data is ready!");
    					break;
    				}
    				else if(((Config>>5)&0x01) && ((Config>>6)&0x01) && i > 0)
    				{
    					Pressure = Pressure + Pressure_Read();
    					Temperature = Temperature + Temperature_Read();
    					LCD_ShowString(30,144,240,24,12,"                  ");
    					LCD_ShowString(30,144,240,24,12,"Data is ready!");
    					break;				
    				}
    				else
    				{
    					LCD_ShowString(30,144,240,24,12,"                  ");
    					LCD_ShowString(30,144,240,24,12,"Data is not ready!");
    					break;
    				}
    			}
    			delay_ms(100);
    	  }
    		Pressure = Pressure/Average_Times;
    		Temperature = Temperature/Average_Times;
    		Correcting_Temp = Correcting_Temperature(Temperature,Temperature_Para);	
    		Correcting_Press = Correcting_Pressure(Pressure,Pressure_Para,Correcting_Temp)+Offest_Pressure;	
    		Altitude = 44330*(1-pow(Correcting_Press/Standard_atmospheric_pressure,1.0/5.255));	
    		//show the Correcting Pressure
    		Pressure_Temp = Correcting_Press*10;
    		Pres_temp = Pressure_Temp/10;
    		LCD_ShowxNum(102,68,Pres_temp,7,16,0);
    		LCD_ShowString(159,68,240,24,16,".");
    		Pres_temp = Pressure_Temp%10;
    		LCD_ShowxNum(168,68,Pres_temp,1,16,0);
    		LCD_ShowString(177,68,240,24,16,"Pa");
    		//show the Correcting Temperature
    		Temperature_Temp = Correcting_Temp*10;
    		Temp_temp = Temperature_Temp/10;
    		LCD_ShowxNum(103,84,Temp_temp,4,12,0);
    		LCD_ShowString(128,84,240,24,12,".");
    		Temp_temp = Temperature_Temp%10;
    		LCD_ShowxNum(135,84,Temp_temp,1,12,0);
    		LCD_ShowString(143,84,240,24,12,"Centigrade");
    		//show the altitude
    		Altitude_Temp = Altitude*10;
    		Alti_temp = Altitude_Temp/10;
    		LCD_ShowxNum(85,96,Alti_temp,4,12,0);
    		LCD_ShowString(110,96,240,24,12,".");
    		Alti_temp = Altitude_Temp%10;
    		LCD_ShowxNum(117,96,Alti_temp,1,12,0);
    		LCD_ShowString(130,96,240,24,12,"m");
    		// count the reading times
    		t++;
    		LCD_ShowxNum(127,132,t,3,12,0);				
     } 
    }
    
    

            测试结果如下表所示:

    压强测试结果
    标准压强(Pa)测试压强(Pa)
    3000030029
    5000050042
    7000070060
    8000080071
    9000090081
    100000100088

    展开全文
  • STM32F103 串口、步进电机、压力传感器、温湿度传感器驱动程序,附上HX711、ULN2003和步进电机使用手册
  • 本次使用 STM32CubeMX配置HX711压力传感器模块,此次使用的为量程为5Kg的压力传感器,通过串口输出可用电脑串口助手实时查看重量数据,数据可通过8针1.3带字库的OLED屏幕实时重量显示。 HX711是一款专为高精度称重...
  • 基于stm32的hx711压力传感器。电子秤主要以单片机STC90C52RC控制核心,实现电子秤的基本控制功能。系统扩展了电子日历时钟,系统可以分为最小系统、数据采集、人机交互界面和系统电源、时钟和语音报数六大部分。最小...
  • 我做过很多工业用压力采集产品,用过很多高分辨率的ad芯片,其中有两款值得推荐。一个是海芯科技出的HX711等24位AD,一个是塞普拉斯出的CS5532等24位AD。国产芯片和进口芯片有差距,但是国产芯片也解决了很多应用的...

    我做过很多工业用压力采集产品,用过很多高分辨率的ad芯片,其中有两款值得推荐。一个是海芯科技出的HX711等24位AD,一个是塞普拉斯出的CS5532等24位AD。国产芯片和进口芯片有差距,但是国产芯片也解决了很多应用的问题,替代了很多进口产品。

    最近在用海芯科技出的HX720,芯片内部集成了低噪声稳压管,这样降低成本,也省去选参考源的麻烦。给24位AD选参考源是很头疼的事,参考源选的指标过高,AD新能不一定能达到,参考源选的指标低了不能实现想要的精度。

    HX720内部带有128倍放大器,这也是专为压力传感器输出小信号设计的,降低了成本,提高了性能和可靠性。芯片内部带有振荡器,内部带有50Hz、60Hz滤波器,宽温度范围 -40~+85℃,8脚封装。缺点是输出速率比较低,10Hz、40Hz,对于很多应用也是可以的。精度和进口芯片也小有差距。

    实现单片机数据采集/传输/显示,使用C#编写上位机显示压力功能。

    原理图
     
    PCB
     


    实物
     
    上位机
     

    201933yk8y7kg53q8277iu.png.thumb.jpg(121.81 KB, 下载次数: 0)

    下载附件  保存到相册

    2019-11-27 20:23 上传

     


    上位机程序

     上位机程序.rar (6.19 KB, 下载次数: 0) 

    展开全文
  • 我做过很多工业用压力采集产品,用过很多高分辨率的AD芯片,其中有两款值得推荐。一个是海芯科技出的HX711等24位AD,一个是塞普拉斯出的CS5532等24位AD。国产芯片和进口芯片有差距,但是国产芯片也解决了很多应用的...
  • 程序基于STM32F103ZET6进行开发,用到的CO2传感器型号为MH-Z14,通讯方式为UART,可以在LCD屏幕上简单的显示读取到的CO2浓度。
  • 基于单片机的压力传感器实验.doc
  • STM32F103三合一程序步进电机、压力传感器、温湿度传感器.
  •  MPX2100是一种压阻式压力传感器,在硅基片上用扩散工艺制成4个电阻阻值相等的应变元件构成惠斯顿电桥。电桥有恒压源供电和恒流源供电两种供电方式。采用恒压源供电的原理图如图1所示。  当压力传感器受到压力作用...
  • STM32与多台MS5803压力传感器I2C通讯

    千次阅读 2019-03-11 09:33:14
    MS5803压力传感器支持SPI和I2C总线通讯,拥有24位AD转换。能够同时获得压力值和温度值,其中压力测量范围为10-1100mbar,温度的测量范围是-40-85摄氏度。各引脚功能及参数如下: 传感器内部结构图如下: 通讯...
  • 水流量传感器的应用

    2021-01-19 16:56:47
     水流量传感器是利用霍尔元件的霍尔效应来测量磁性物理量。在霍尔元件的正极串入负载电阻,同时通上5V的直流电压并使电流方向与磁场方向正交。当水通过涡轮开关壳推动磁性转子转动时,产生不同磁极的旋转磁场,...
  • 一、MPX4115型压力传感器介绍 1.1 引脚说明 即:1引脚为模拟量输出,2引脚接地,三引脚接电源,4、5、6引脚空   1.2 输出特性图 选择典型曲线,我们可以得知转换公式:压力值=(电压值/5.1+0.095)/0.009。   二、...
  • 1.首先是超声波模块部分 超声波模块的hc-sr04.h文件 #ifndef __HC__SR04_H #define __HC__SR04_H #include "sys.h" ...void TIM9_CH1_Cap_Init(u32 arr,u16 psc); void Trig_Init(void); #endif
  • 视频链接:https://www.bilibili.com/video/BV1Ay4y1t7vU/ 本设计是基于stm32单片机语音控制智能座椅 通过LD3320语音模块控制直流电机座椅抬高降低操作,通过1602液晶显示薄膜压力传感器检测到的人体重量
  • 基于STM32F030驱动BMP180气压传感器

    千次阅读 2022-04-11 10:40:58
    了解气压传感器 BMP180 的驱动原理,通过配置 STM32F030 的GPIO及 IIC通信时序,采集气压传感器 BMP180的值。
  • 压力传感器hx711详细资料,电路图 51的源程序 原理图 驱动代码 包括仿真(protel) 设计开发原理图
  • MS5837-30BA压力传感器的英文手册与本人翻译的中文版本。中文翻译里面加上了我的解读,附上了关键部分的代码,写的非常详细。同时提供了stm32解析水深数据的例程。想学习MS5837的看着一份资料绝对够了。 如果本资源...
  • STM32读取HX711(AD)模块数据——压力传感器

    万次阅读 多人点赞 2019-10-28 23:41:15
    背景:在无人机动力系统的选型时,...压力传感器tb链接: HX711模块是一个24位精度的AD模块。 (1)https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-21223910208.20.6c496a4bdA2Bew&id=522572281513...
  • 根据数据手册写的MS5803压力传感器程序,因为我是看原子的资料学的STM32,所以有他的system文件夹

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 760
精华内容 304
关键字:

stm32压力传感器程序