精华内容
下载资源
问答
  • 我们一般都会选择一些封装较小操作比较方便的压力传感器。BMP280就是满足这一要求的器件。在这一篇中我们将设计并实现BMP280的驱动。 1、功能概述 BMP280是一款绝对压力传感器产品。BMP280是一款绝对的气压传感器...

    压力和温度监测在嵌入式系统开发中是非常常见的需求,特别是对环境大气压力和温度的检测需求就更常见了。我们一般都会选择一些封装较小操作比较方便的压力传感器。BMP280就是满足这一要求的器件。在这一篇中我们将设计并实现BMP280的驱动。

    1、功能概述

    BMP280是一款绝对压力传感器产品。BMP280是一款绝对的气压传感器,专为移动应用而设计。传感器模块采用极其紧凑的封装。其小尺寸和低功耗允许在诸如移动电话,GPS模块或手表的电池供电设备中实现。

    1.1、硬件接口

    BMP280基于博世经过验证的压阻式压力传感器技术,具有高精度和线性度以及长期稳定性和高EMC稳健性。众多器件操作选项提供了最高的灵活性,可针对功耗,分辨率和滤波器性能优化器件。为开发人员提供了一组经过测试的默认设置(例如用例),以便尽可能简化设计。

    BMP280压力温度传感器采用了小巧的8引脚LGA封装形式。其引脚排布就功能如下图所示:

    BMP280压力温度传感器支持3种通讯接口方式:四线SPI、三线SPI以及I2C。在不同的接口模式下,各引脚的定义也是有差异的,关于这三种接口模式各引脚的定义如下:

    对应3种不同的接口方式,BMP280压力温度传感器存在三种与总线连接的方式。首先我们来看四线SPI接口方式,包括CSB片选、SCK时钟、SDI数字输入、SDO数字输出。其总线连接方式如下图:

     

    接下来我们来看三线SPI接口方式,包括CSB片选、SCK时钟、SDI数字输入/SDO数字输出。其与4线SPI的区别是数字输入输出使用同一引脚,第3脚就是输入也是输出,而第5脚浮空。其总线连接方式如下图:

    最后我们来看I2C接口方式,包括SCL时钟、SDA数字输入输出。在I2C接口模式下,第2CSB连接到高电平,以设置BMP280压力温度传感器使用I2C接口。而第5脚则可以通过连接高电平或低电平来设置设备地址的最后一位,不可以浮空。所以根据第5脚电频不同,BMP280压力温度传感器的I2C设备7位地址为:0x760x77。其总线连接方式如下图:

    BMP280压力温度传感器在使用SPI接口时,支持SPI模式0CPOL=CPHA=0)和模式3CPOL=CPHA=1)。而在使用I2C接口时,支持标准模式、快速模式以及高速模式。接口的选择实际上是通过CSB的电位实现的,低电平时就是SPI,高电平时就是I2C

    1.2、数据存储结构

    BMP280压力温度传感器的所有操作都是通过读写对应的寄存器来实现的。BMP280压力温度传感器中所有的寄存器都是8位的。这些寄存器在存储器中的地址分配如下图所示。

    在上图并未包括系统保留的寄存器,这些寄存器不可以进行写操作,读出来的值也是无意义的。接下来我们来详细描述上图中的这些寄存器。

    先来看看两个比较特殊的寄存器。首先是ID寄存器,这个寄存器是只读的,而且其存储的值也固定为0x58,用来代表设备为BMP280压力温度传感器。这个寄存器在系统上电后即可读取。还有复位寄存器,这个寄存器是只写的,固定向其写0xB6来实现BMP280压力温度传感器的复位。同样只要系统上电后即可以写复位寄存器。

    状态寄存器是只读的,其实只使用了其中的两位,这两位分别表示数据测量是否完成和影响寄存器是否更新。下图是状态寄存器的详细说明:

    测量控制寄存器是可读写的,用以配置BMP280压力温度传感器数据获取的方式。分别配置温度采样、压力采样和工作模式。工作模式有三种:休眠模式、强制模式、正常模式。系统上电后即为休眠模式,通过这一寄存器的配置可以使BMP280压力温度传感器进入强制模式或正常模式运行。测量控制寄存器的各位定义如下图:

    配置寄存器用于设置BMP280压力温度传感器的速率、过滤器以及接口模式。在休眠模式下写配置寄存器是允许的,但在正常模式下会被忽略,所以在系统复位后,进入正常模式前先写配置寄存器。配置寄存器各位的定义如下图所示:

    压力数据寄存器存储有压力测量数据输出的原始值。使用了三个寄存器中的20位来下存储压力数据。压力数据寄存器各位的定义如下图所示:

    温度数据寄存器存储有温度测量数据输出的原始值。使用了三个寄存器中的20位来下存储温度数据。温度数据寄存器各位的定义如下图所示:

    此外还有校准数据寄存器,总共是26个寄存器,存储了计算压力温度最终值的厂家校准数据。这些校准寄存器的定义及地址分配如下图所示:

    我们已经说过面向BMP280压力温度传感器的所有操作都是基于寄存器进行的,我们已经了解了BMP280压力温度传感器的各个寄存器,现在可以来实现它的操作了。

    2、驱动设计与实现

    我们已经比较详细的说明了BMP280的引脚定义、通讯接口、数据存储格式,在此基础上我们将设计并实现BMP280压力温度传感器的驱动程序。

    2.1、对象定义

    在使用一个对象之前我们需要获得一个对象。同样的我们想要BMP280压力温度传感器就需要先定义BMP280压力温度传感器的对象。

    2.1.1、对象类型抽象

    我们要得到BMP280压力温度传感器对象,需要先分析其基本特性。一般来说,一个对象至少包含两方面的特性:属性与操作。接下来我们就来从这两个方面思考一下BMP280压力温度传感器的对象。

    先来考虑属性,作为属性肯定是用于标识或记录对象特征的东西。我们来考虑BMP280压力温度传感器对象属性。BMP280压力温度传感器的ID寄存器用于标识设备是否为BMP280;配置寄存器和测量控制寄存器都用关于系统配置,指示了设备的工作状态,所以我们将这三个寄存器定义为对象的属性。而使用的通讯接口决定了访问BMP280压力温度传感器的行为,所以我们需要记住这一配置;而校准数据则在计算数据时所要使用的,我们也需要记住这些参数,所以我们将它们也都定义为属性。在I2C接口模式时,设备地址是区分总线上设备的唯一标志,所以我们将其定义为属性。同样测量数据指示了设备当前的工作状态,我们将器作为属性。

    接着我们还需要考虑BMP280压力温度传感器对象的操作问题。我们需要与BMP280压力温度传感器通讯就需要向其写数据并从其读数据,而不论是SPI接口还是I2C接口,读写操作都以来与具体的硬件平台,所以我们将他们作为对象的操作。此外,为控制时序,我们需要延时操作,而延时行为的实现亦依赖于具体的软硬件平台,所以我们将延时也作为对象的操作。

    根据上述我们对BMP280压力温度传感器的分析,我们可以定义BMP280压力温度传感器的对象类型如下:

    /*定义BMP280操作对象*/
    typedef struct BMP280Object{
           uint8_t bmpAddress; //I2C接口时设备地址
           uint8_t chipID;   //芯片ID
           uint8_t config;    //配置寄存器
           uint8_t ctrlMeas; //测量控制寄存器
           BMP280PortType port;    //接口选择
           Bmp280CalibParamType caliPara;       //校准参数
           float pressure;     //压力值
           float temperature;      //温度值
           void (*Read)(struct BMP280Object *bmp,uint8_t regAddress,uint8_t *rData,uint16_t rSize);  //读数据操作指针
           void (*Write)(struct BMP280Object *bmp,uint8_t regAddress,uint8_t command);   //写数据操作指针
           void (*Delayms)(volatile uint32_t nTime);    //延时操作指针
           void (*ChipSelect)(BMP280CSType en);   //使用SPI接口时,片选操作
    }BMP280ObjectType;

    2.1.2、对象初始化

    我们知道,一个对象仅作声明是不能使用的,我们需要先对其进行初始化,所以这里我们来考虑BMP280压力温度传感器对象的初始化函数。一般来说,初始化函数需要处理几个方面的问题。一是检查输入参数是否合理;二是为对象的属性赋初值;三是对对象作必要的初始化配置。据此我们设计BMP280压力温度传感器对象的初始化函数如下:

    /* 实现BMP280初始化配置 */
    
    void BMP280Initialization(BMP280ObjectType *bmp,       //BMP280对象
                              uint8_t bmpAddress,          //I2C接口是设备地址
                              BMP280PortType port,         //接口选择
                              TimeStandbyType t_sb,        //间隔周期
                              IIRFilterCoeffType filter,   //过滤器
                              UseSPI3wType spi3W_en,       //3线SPI控制
                              TemperatureSampleType osrs_t,//温度精度
                              PressureSampleType osrs_p,   //压力精度
                              PowerModeType mode,          //电源模式
                              BMP280Read Read,             //读数据操作指针
                              BMP280Write Write,           //写数据操作指针
                              BMP280Delayms Delayms,       //延时操作指针
                              BMP280ChipSelect ChipSelect   //片选操作指针
                             )
    {
           uint8_t try_count = 5;
           uint8_t regAddress=0;
           uint8_t command=0;
     
           bmp->chipID=0x00
           bmp->pressure=0.0;
           bmp->temperature=0.0;
           bmp->bmpAddress=0x00;
           bmp->port=port;
           if(bmp->port==I2C)
           {
                  if((bmpAddress==0xEC)||(bmpAddress==0xEE))
                  {
                         bmp->bmpAddress=bmpAddress;
                  }
                  bmp->ChipSelect=NULL;
           }
           else
           {
                  bmp->ChipSelect=ChipSelect;
           }
           bmp->Read=Read;
           bmp->Write=Write;
           bmp->Delayms=Delayms;
           bmp->caliPara.t_fine=0;
          
           if(!ObjectIsValid(bmp))
           {
                  return;
           }
     
           while(try_count--)
           {
                  bmp->chipID=ReadBMP280Register(bmp,REG_BMP280_ID);
                  if(0x58==bmp->chipID)
                  {
                         BMP280SoftReset(bmp);
         
                         break;
                  }
           }
     
           if(try_count)
           {
                  /*配置配置寄存器:间隔周期0.5ms、IIR滤波系数16、不使用SPI3线通讯*/
                  regAddress=REG_CONFIG;
                  command=t_sb|filter|spi3W_en;
                  WriteBMP280Register(bmp,regAddress,command);
     
                  /*配置测量控制寄存器:温度20位,压力20位,电源正常模式*/
                  regAddress=REG_CTRL_MEAS;
                  command=osrs_t|osrs_p|mode;
                  WriteBMP280Register(bmp,regAddress,command);
     
                  bmp->Delayms(10);
                  bmp->config=ReadBMP280Register(bmp,REG_CONFIG);
                  bmp->Delayms(10);
                  bmp->ctrlMeas=ReadBMP280Register(bmp,REG_CTRL_MEAS);
                  bmp->Delayms(10);
                  /*读取校准值*/
                  GetBMP280CalibrationData(bmp);
           }
    }

    2.2、对象操作

    我们已经完成了BMP280压力温度传感器对象类型的定义和对象初始化函数的设计。但我们的主要目标是获取对象的信息,接下来我们还要实现面向BMP280压力温度传感器的各类操作。

    2.2.1、写寄存器

    我们已经说过了,对BMP280的操作都是通过读写寄存器实现的。这里我们先来看写寄存器。在I2C接口方式下,写寄存器操作是在从站地址的最后一位来识别的,再加上要写的寄存器地址和数据来实现的,这也是I2C协议的标准做法。其时序图如下所示:

    而在SPI接口方式下,由于SPI并未有设备地址,也不存在用从还在那地址最后为来标记读写的模式。通常一些设备需要定义操作码来实现读写区分,但BMP280采取了将寄存器地址的最高位置零表示为写。之所以可以这样定义,是因为BMP280寄存器地址分配的特殊性决定的。改变寄存器地址的最高位也能区分不同的寄存器,绝不会重复。在SPI接口方式下,写寄存器的时序图如下所示:

    根据上述描述和时序图,我们可以实现写BMP280压力温度传感器寄存器的程序。

    /* 向BMP280寄存器写一个字节 */
    static void WriteBMP280Register(BMP280ObjectType *bmp,uint8_t regAddress,uint8_t command)
    {
           if(ObjectIsValid(bmp))
           {
                  if(bmp->port==BMP280_SPI)
                  {
                         regAddress&=0x7F;
                         bmp->ChipSelect(BMP280CS_Enable);
                         bmp->Delayms(1);
                         bmp->Write(bmp,regAddress,command);
                         bmp->Delayms(1);
                         bmp->ChipSelect(BMP280CS_Disable);
                  }
                  else
                  {
                         bmp->Write(bmp,regAddress,command);
                  }
           }
    }

    2.2.2、读寄存器

    读寄存器的处理方式与写寄存器是类似。在I2C接口方式下,将从站地址的最低位置1来表示读。在I2C接口方式下,读寄存器的时序图如下所示:

    而在SPI接口方式下,通过将寄存器地址的最高位1来标识为读操作。事实上,所有寄存器地址的最高位都是1,所以在读操作时实际不需要做处理。在SPI接口方式下,读寄存器的时序图如下所示:

    根据上述描述和时序图,我们可以实现读BMP280压力温度传感器寄存器的程序。

    /*从BMP280寄存器读取一个字节*/
    static uint8_t ReadBMP280Register(BMP280ObjectType *bmp,uint8_t regAddress)
    {
          uint8_t regValue=0xFF;
     
          if(ObjectIsValid(bmp))
          {
                  if(bmp->port==BMP280_SPI)
                  {
                         regAddress |= 0x80;
                         bmp->ChipSelect(BMP280CS_Enable);
                         bmp->Delayms(1);
                         bmp->Read(bmp,regAddress,&regValue,1);
                         bmp->Delayms(1);
                         bmp->ChipSelect(BMP280CS_Disable);
                  }
                  else
                  {
                         bmp->Read(bmp,regAddress,&regValue,1);
                  }
          }
    
          return regValue;
    }

    3、驱动的使用

    我们已经设计了BMP280压力温度传感器的驱动程序,接下来这一节我们将基于BMP280压力温度传感器的驱动程序设计一个简单的验证应用。

    3.1、声明并初始化对象

    使用基于对象的操作我们需要先得到这个对象,所以我们先要使用前面定义的BMP280压力温度传感器对象类型声明一个BMP280压力温度传感器对象变量,具体操作格式如下:

    BMP280ObjectType bmp280;

    声明了这个对象变量并不能立即使用,我们还需要使用驱动中定义的初始化函数对这个变量进行初始化。这个初始化函数所需要的输入参数如下:

    BMP280ObjectType *bmpBMP280对象

    uint8_t bmpAddressI2C接口是设备地址

    BMP280PortType port,接口选择

    BMP280TimeStandbyType t_sb,间隔周期

    BMP280IIRFilterCoeffType filter,过滤器

    BMP280UseSPI3wType spi3W_en3线SPI控制

    BMP280TemperatureSampleType osrs_t,温度精度

    BMP280PressureSampleType osrs_,压力精度

    BMP280PowerModeType mode,电源模式

    BMP280Read Read,读数据操作指针

    BMP280Write Write,写数据操作指针

    BMP280Delayms Delayms,延时操作指针

    BMP280ChipSelect ChipSelect,片选操作指针

    对于这些参数,对象变量我们已经定义了。接口选择、间隔周期、过滤器、3线SPI控制、温度精度、压力精度、电源模式等都是枚举量我们根据实际情况输入即可。而使用I2C接口时需要的设备地址,也按具体地址给入就好。主要的是我们需要定义几个函数,并将函数指针作为参数。这几个函数的类型如下:

    /* 定义读数据操作函数指针类型 */
    typedef void (*BMP280Read)(BMP280ObjectType *bmp,uint8_t regAddress,uint8_t *rData,uint16_t rSize);
    
    /* 定义写数据操作函数指针类型 */
    typedef void (*BMP280Write)(BMP280ObjectType *bmp,uint8_t regAddress,uint8_t command);
    
    /* 定义延时操作函数指针类型 */
    typedef  void (*BMP280Delayms)(volatile uint32_t nTime);
    
    /* 定义使用SPI接口时,片选操作函数指针类型 */
    typedef  void (*BMP280ChipSelect)(BMP280CSType cs);

    对于这几个函数我们根据样式定义就可以了,具体的操作可能与使用的硬件平台有关系。若采用的SPI接口则需注意片选操作,片选操作函数用于多设备需要软件操作时,如采用硬件片选可以传入NULL即可。同样如果采用的是I2C接口,则片选可以传入NULL即可。具体函数定义如下:

    /*读BMP280寄存器值*/
    static void ReadDataFromBMP280(BMP280ObjectType *bmp280,uint8_t regAddress,uint8_t *rData,uint16_t rSize)
    {
      HAL_I2C_Master_Transmit(&bmp280hi2c, bmp280->bmpAddress,&regAddress,1,1000);
     
      HAL_I2C_Master_Receive(&bmp280hi2c, bmp280->bmpAddress+1,rData, rSize, 1000);
    }
    
    /*写BMP280寄存器值*/
    static void WriteDataToBMP280(BMP280ObjectType *bmp280,uint8_t regAddress,uint8_t command)
    {
      uint8_t pData[2];
     
      pData[0]=regAddress;
      pData[1]=command;
     
      HAL_I2C_Master_Transmit(&bmp280hi2c,bmp280->bmpAddress, pData, 2,1000);
    }

    对于延时函数我们可以采用各种方法实现。我们采用的STM32平台和HAL库则可以直接使用HAL_Delay()函数。于是我们可以调用初始化函数如下:

    BMP280Initialization(&bmp280,  //BMP280对象
                         0xEC,           //I2C接口是设备地址
                         BMP280_I2C,     //接口选择
                         BMP280_T_SB_0P5,       //间隔周期
                         BMP280_IIR_FILTER_COEFF_X16,         //过滤器
                         BMP280_SPI3W_DISABLE,                //3线SPI控制
                         BMP280_TEMP_SAMPLE_X16,  //温度精度
                         BMP280_PRES_SAMPLE_X16,          //压力精度
                         BMP280_POWER_NORMAL_MODE,      //电源模式
                         ReadDataFromBMP280,  //读数据操作指针
                         WriteDataToBMP280,     //写数据操作指针
                         HAL_Delay,                     //延时操作指针
                         NULL                                //片选操作指针
                        );

    3.2、基于对象进行操作

    我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经将获取数据并转换为转换值的比例值,接下来我们使用这一驱动开发我们的应用实例。

    /*获取大气压力和温度*/
    void BMP280GetEnvironmentalData(void)
    {
           float pressure;                   //压力值
           float temperature;      //温度值
          
           GetBMP280Measure(&bmp280);
    
           pressure=bmp280.pressure;
           temperature=bmp280.temperature;
    }

    4、应用总结

    BMP280压力温度传感器的驱动已经实现并做了简单的应用。在我们测试时,得到的数据与其它方法获得的温度压力数据基本是一致的,这说明我们的驱动程序总体来说是正确的。

    BMP280压力温度传感器支持SPII2C两种接口,而且SPI也支持3线和4线模式,但我们在测试应用中只使用了I2C接口,SPI接口还有待测试。

    在使用驱动时需注意,采用SPI接口的器件需要考虑片选操作的问题。如果片选信号是通过硬件电路来实现的,我们在初始化时给其传递NULL值。如果是软件操作片选则传递我们编写的片选操作函数。而如果采用I2C接口,那么在初始化时也应传递NULL值。

    BMP280压力温度传感器在使用SPI接口时,支持SPI模式0CPOL=CPHA=0)和模式3CPOL=CPHA=1)。而在使用I2C接口时,支持标准模式、快速模式以及高速模式。而且在使用I2C接口时,SDO引脚必须接高电平或低电平,以确定设备地址。

    源码获取:https://github.com/foxclever/ExPeriphDriver

    欢迎关注:

     

    展开全文
  • 嵌入式产品开发中,我们常常会有...该装置结合了单个高线性度,高精度压力,湿度和温度传感器,采用8引脚金属盖2.5 x 2.5 x0.93mm³LGA封装,设计用于低电流消耗(3.6μA@ 1Hz),长期稳定性高EMC稳健性。 1.1、硬件

    嵌入式产品开发中,我们常常会有检测环境温度、压力、湿度的需求。如果有一个集成有这3个传感器的元件,无疑将是很方便的。博世的BME280就能实现这一要求。在这一篇中我们将讨论BME280的驱动设计与实现。

    1、功能概述

    BME280是一款专为移动应用而开发的集成环境传感器,其尺寸和低功耗是关键设计限制。该装置结合了单个高线性度,高精度压力,湿度和温度传感器,采用8引脚金属盖2.5 x 2.5 x0.93mm³LGA封装,设计用于低电流消耗(3.6μA@ 1Hz),长期稳定性高EMC稳健性。

    1.1、硬件描述

    BME280压力湿度温度传感器实现了高性能的温度压力湿度检测,包括有压力、温度、湿度3个传感器和一个高精度ADC及接口逻辑,其结构框图如下图所示:

     

    湿度传感器具有极快的响应时间,可满足新兴应用的性能要求,例如环境感知和宽温度范围内的高精度。压力传感器是绝对气压传感器,具有极高的精度和分辨率,噪音极低。集成的温度传感器经过优化,噪音极低,分辨率高。它主要用于压力和湿度传感器的温度补偿,也可用于估算环境温度。

    BME280压力温度传感器采用了小巧的8引脚LGA封装形式。其引脚排布就功能如下图所示:

    BME280支持全套操作模式,可灵活地优化器件的功耗,分辨率和滤波器性能。

    1.2、通讯接口

    BME280压力温度传感器支持3种通讯接口方式:四线SPI、三线SPI以及I2C。在不同的接口模式下,各引脚的定义也是有差异的,关于这三种接口模式各引脚的定义如下:

    对应3种不同的接口方式,BME280压力温度传感器存在三种与总线连接的方式。首先我们来看四线SPI接口方式,包括CSB片选、SCK时钟、SDI数字输入、SDO数字输出。其总线连接方式如下图:

    接下来我们来看三线SPI接口方式,包括CSB片选、SCK时钟、SDI数字输入/SDO数字输出。其与4线SPI的区别是数字输入输出使用同一引脚,第3脚就是输入也是输出,而第5脚浮空。其总线连接方式如下图:

    最后我们来看I2C接口方式,包括SCL时钟、SDA数字输入输出。在I2C接口模式下,第2CSB连接到高电平,以设置BME280压力温度传感器使用I2C接口。而第5脚则可以通过连接高电平或低电平来设置设备地址的最后一位,不可以浮空。所以根据第5脚电频不同,BMP280压力温度传感器的I2C设备7位地址为:0x760x77。其总线连接方式如下图:

    BME280压力温度传感器在使用SPI接口时,支持SPI模式0CPOL=CPHA=0)和模式3CPOL=CPHA=1)。而在使用I2C接口时,支持标准模式、快速模式以及高速模式。接口的选择实际上是通过CSB的电位实现的,低电平时就是SPI,高电平时就是I2C

    1.3、内部寄存器

    BME280压力温度传感器的所有操作都是通过读写对应的寄存器来实现的。BME280压力温度传感器中所有的寄存器都是8位的。这些寄存器在存储器中的地址分配如下图所示。

    在上图并未包括系统保留的寄存器,这些寄存器不可以进行写操作,读出来的值也是无意义的。接下来我们来详细描述上图中的这些寄存器。

    先来看看两个比较特殊的寄存器。首先是ID寄存器,这个寄存器是只读的,而且其存储的值也固定为0x60,用来代表设备为BME280压力温度传感器。这个寄存器在系统上电后即可读取。还有复位寄存器,这个寄存器是只写的,固定向其写0xB6来实现BME280压力温度传感器的复位。同样只要系统上电后即可以写复位寄存器。

    湿度控制寄存器用以配置湿度数据的测量精度。但是修改这个寄存器的值不会立即生效,必须对测量控制寄存器做了写操作之后才会有效。湿度控制寄存器的各位定义如下图:

    状态寄存器是只读的,其实只使用了其中的两位,这两位分别表示数据测量是否完成和影响寄存器是否更新。下图是状态寄存器的详细说明:

    测量控制寄存器是可读写的,用以配置BME280压力温度传感器数据获取的方式。分别配置温度采样、压力采样和工作模式。工作模式有三种:休眠模式、强制模式、正常模式。系统上电后即为休眠模式,通过这一寄存器的配置可以使BME280压力温度传感器进入强制模式或正常模式运行。湿度控制器修改后必须写这个寄存器才会生效。测量控制寄存器的各位定义如下图:

    配置寄存器用于设置BME280压力温度湿度传感器的速率、过滤器以及接口模式。在休眠模式下写配置寄存器是允许的,但在正常模式下会被忽略,所以在系统复位后,进入正常模式前先写配置寄存器。配置寄存器各位的定义如下图所示:

    压力数据寄存器存储有压力测量数据输出的原始值。使用了三个寄存器中的20位来下存储压力数据。压力数据寄存器各位的定义如下图所示:

    温度数据寄存器存储有温度测量数据输出的原始值。使用了三个寄存器中的20位来下存储温度数据。温度数据寄存器各位的定义如下图所示:

    湿度数据寄存器存储有湿度测量数据输出的原始值。使用了两个寄存器中的16位来下存储湿度数据。湿度数据寄存器各位的定义如下图所示:

    此外还有校准数据寄存器,总共是41个寄存器,存储了计算压力温度最终值的厂家校准数据。这些校准寄存器的定义及地址分配如下图所示:

    我们已经说过面向BME280压力温度湿度传感器的所有操作都是基于寄存器进行的,我们已经了解了BME280压力温度湿度传感器的各个寄存器,现在可以来实现它的操作了。

    2、驱动设计与实现

    上一节我们描述了BME280压力湿度温度传感器的引脚功能、数据存储格式以及通讯接口的基本内容。在这一节中我们将考虑如何设计并实现BME280压力湿度温度传感器的驱动程序。

    2.1、对象定义

    在使用一个对象之前我们需要获得一个对象。同样的我们想要BME280压力湿度温度传感器就需要先定义BME280压力湿度温度传感器的对象。

    2.1.1、对象的抽象

    我们要得到BME280压力湿度温度传感器对象,需要先分析其基本特性。一般来说,一个对象至少包含两方面的特性:属性与操作。接下来我们就来从这两个方面思考一下BME280压力湿度温度传感器的对象。

    先来考虑属性,作为属性肯定是用于标识或记录对象特征的东西。我们来考虑BME280压力湿度温度传感器对象属性。BME280压力湿度温度传感器的ID寄存器用于标识设备是否为BME280;配置寄存器和测量控制寄存器都用关于系统配置,指示了设备的工作状态,所以我们将这几个寄存器定义为对象的属性。而使用的通讯接口决定了访问BME280压力湿度温度传感器的行为,所以我们需要记住这一配置;而校准数据则在计算数据时所要使用的,我们也需要记住这些参数,所以我们将它们也都定义为属性。在I2C接口模式时,设备地址是区分总线上设备的唯一标志,所以我们将其定义为属性。同样测量数据指示了设备当前的工作状态,我们将器作为属性。

    接着我们还需要考虑BME280压力湿度温度传感器对象的操作问题。我们需要与BME280压力湿度温度传感器通讯就需要向其写数据并从其读数据,而不论是SPI接口还是I2C接口,读写操作都以来与具体的硬件平台,所以我们将他们作为对象的操作。此外,为控制时序,我们需要延时操作,而延时行为的实现亦依赖于具体的软硬件平台,所以我们将延时也作为对象的操作。

    根据上述我们对BME280压力湿度温度传感器的分析,我们可以定义BME280压力湿度温度传感器的对象类型如下:

    /*定义Bme280操作对象*/
    typedef struct BME280Object{
        uint8_t chipID;                                //芯片ID
        uint8_t bmeAddress;                              //I2C通讯时的设备地址
        uint8_t config;                                       //配置寄存器
        uint8_t ctrlMeas;                                   //测量控制寄存器
        uint8_t ctrlHumi;                                   //湿度测量控制寄存器
        BME280PortType port;                         //接口选择
        BME280CalibParamType caliPara;      //校准参数
        float temperature;                                  //温度值
        float pressure;                                 //压力值
        float humidity;                                //湿度值
        void (*Read)(struct BME280Object *bme,uint8_t regAddress,uint8_t *rData,uint16_t rSize);       //读数据操作指针
        void (*Write)(struct BME280Object *bme,uint8_t regAddress,uint8_t command);    //写数据操作指针
        void (*Delayms)(volatile uint32_t nTime);       //延时操作指针
        void (*ChipSelect)(BME280CSType cs);                  //使用SPI接口时,片选操作
    }BME280ObjectType;

    2.1.2、对象初始化

    我们知道,一个对象仅作声明是不能使用的,我们需要先对其进行初始化,所以这里我们来考虑BME280压力湿度温度传感器对象的初始化函数。一般来说,初始化函数需要处理几个方面的问题。一是检查输入参数是否合理;二是为对象的属性赋初值;三是对对象作必要的初始化配置。据此我们设计BME280压力湿度温度传感器对象的初始化函数如下:

    /*实现BME280初始化配置*/
    void BME280Initialization(BME280ObjectType *bme,         //BMP280对象
                              uint8_t bmeAddress,                       //I2C接口是设备地址
                              BME280PortType port,                  //接口选择
                              BME280TimeSBType t_sb,           //间隔周期
                              BME280IIRFilterType filter,         //过滤器
                              BME280SPI3wUseType spi3W_en,  //3线SPI控制
                              BME280TempSampleType osrs_t,       //温度精度
                              BME280PresSampleType osrs_p,         //压力精度
                              BME280PowerModeType mode,          //电源模式
                              BME280HumiSampleType osrs_h,       //湿度精度
                              BME280Read Read,                              //读数据操作指针
                              BME280Write Write,                            //写数据操作指针
                              BME280Delayms Delayms,                  //延时操作指针
                              BME280ChipSelect ChipSelect            //片选操作指针
                              )
    {
           uint8_t try_count = 5;
           uint8_t regAddress=0;
           uint8_t command=0;
     
           if((bme==NULL)||(Read==NULL)||(Write==NULL)||(Delayms==NULL))
           {
                  return;
           }
           bme->Read=Read;
           bme->Write=Write;
           bme->Delayms=Delayms;
          
           bme->chipID=0x00;
           bme->pressure=0.0;
           bme->temperature=0.0;
           bme->humidity=0.0;
           bme->bmeAddress=0x00;
           bme->port=port;
           if(bme->port==BME280_I2C)
           {
                  if((bmeAddress==0xEC)||(bmeAddress==0xEE))
                  {
                         bme->bmeAddress=bmeAddress;
                  }
                  bme->ChipSelect=NULL;
           }
           else
           {
                  if(ChipSelect!=NULL)
                  {
                         bme->ChipSelect=ChipSelect;
                  }
                  else
                  {
                         bme->ChipSelect=BME280ChipSelectDefault;
                  }
           }
          
           bme->caliPara.t_fine=0;
                 
          if(!ObjectIsValid(bme))
          {
                 return;
          }
        
          while(try_count--)
          {
                 bme->chipID=ReadBME280Register(bme,REG_BME280_ID);
                 if(0x60==bme->chipID)
                 {
                       BME280SoftReset(bme);
          
                       break;
                 }
          }
     
          if(try_count)
          {
                 /*配置配置寄存器:间隔周期0.5ms、IIR滤波系数16、不使用SPI3线通讯*/
                 regAddress=REG_CONFIG;
                 command=t_sb|filter|spi3W_en;
                 WriteBME280Register(bme,regAddress,command);
     
                 /*配置测量控制寄存器:温度20位,压力20位,电源正常模式*/
                 regAddress=REG_CTRL_MEAS;
                 command=osrs_t|osrs_p|mode;
                 WriteBME280Register(bme,regAddress,command);
     
                 /*配置湿度测量控制寄存器*/
                 regAddress=REG_CTRL_HUM;
                 command=osrs_h;
                 WriteBME280Register(bme,regAddress,command);
       
                 bme->Delayms(10);
                 bme->config=ReadBME280Register(bme,REG_CONFIG);
                 bme->Delayms(10);
                 bme->ctrlMeas=ReadBME280Register(bme,REG_CTRL_MEAS);
                 bme->Delayms(10);
                 bme->ctrlHumi=ReadBME280Register(bme,REG_CTRL_HUM);
                 bme->Delayms(10);
                 
                /*读取校准值*/
                GetBME280CalibrationData(bme);
          }
    }

    2.2、对象操作

    我们已经完成了BME280压力湿度温度传感器对象类型的定义和对象初始化函数的设计。但我们的主要目标是获取对象的信息,接下来我们还要实现面向BME280压力湿度温度传感器的各类操作。

    2.2.1、写寄存器

    我们已经说过了,对BME280的操作都是通过读写寄存器实现的。这里我们先来看写寄存器。在I2C接口方式下,写寄存器操作是在从站地址的最后一位来识别的,再加上要写的寄存器地址和数据来实现的,这也是I2C协议的标准做法。其时序图如下所示:

    而在SPI接口方式下,由于SPI并未有设备地址,也不存在用从还在那地址最后为来标记读写的模式。通常一些设备需要定义操作码来实现读写区分,但BME280采取了将寄存器地址的最高位置零表示为写。之所以可以这样定义,是因为BME280寄存器地址分配的特殊性决定的。改变寄存器地址的最高位也能区分不同的寄存器,绝不会重复。在SPI接口方式下,写寄存器的时序图如下所示:

    根据上述描述和时序图,我们可以实现写BME280压力湿度温度传感器寄存器的程序。

    /* 向BME280寄存器写一个字节 */
    static void WriteBME280Register(BME280ObjectType *bme,uint8_t regAddress,uint8_t command)
    {
           if(ObjectIsValid(bme))
           {
                  if(bme->port==BME280_SPI)
                  {
                         regAddress&=0x7F;
                         bme->ChipSelect(BME280CS_ENABLE);
                         bme->Delayms(1);
                         bme->Write(bme,regAddress,command);
                         bme->Delayms(1);
                         bme->ChipSelect(BME280CS_DISABLE);
                  }
                  else
                  {
                         bme->Write(bme,regAddress,command);
                  }
            }
    }

    2.2.2、读寄存器

    读寄存器的处理方式与写寄存器是类似。在I2C接口方式下,将从站地址的最低位置1来表示读。在I2C接口方式下,读寄存器的时序图如下所示:

    而在SPI接口方式下,通过将寄存器地址的最高位置1来标识为读操作。事实上,所有寄存器地址的最高为都是1,所以在读操作时实际不需要做处理。在SPI接口方式下,读寄存器的时序图如下所示:

    根据上述描述和时序图,我们可以实现读BME280压力温度湿度传感器寄存器的程序。

    /*从BMP280寄存器读取一个字节*/
    static uint8_t ReadBME280Register(BME280ObjectType *bme,uint8_t regAddress)
    {
           uint8_t regValue=0xFF;
     
           if(ObjectIsValid(bme))
           {
                  if(bme->port==BME280_SPI)
                  {
                         regAddress |= 0x80;
                         bme->ChipSelect(BME280CS_ENABLE);
                         bme->Delayms(1);
                         bme->Read(bme,regAddress,&regValue,1);
                         bme->Delayms(1);
                         bme->ChipSelect(BME280CS_DISABLE);
                  }
                  else
                  {
                         bme->Read(bme,regAddress,&regValue,1);
                  }
           }
    
           return regValue;
    }

    3、驱动的使用

    我们描述了BME280压力湿度温度传感器的基本原理并实现了驱动程序。我们还需要设计一个简单的应用来验证这一驱动设计是否合乎我们的要求,所以接下来我们就来设计一个简单的验证应用。

    3.1、声明并初始化对象

    使用基于对象的操作我们需要先得到这个对象,所以我们先要使用前面定义的BME280压力湿度温度传感器对象类型声明一个BME280压力湿度温度传感器对象变量,具体操作格式如下:

    BME280ObjectType bme280;

    声明了这个对象变量并不能立即使用,我们还需要使用驱动中定义的初始化函数对这个变量进行初始化。这个初始化函数所需要的输入参数如下:

    BME280ObjectType *bmeBMP280对象

    uint8_t bmeAddressI2C接口是设备地址

    BME280PortType port,接口选择

    BME280TimeSBType t_sb,间隔周期

    BME280IIRFilterType filter,过滤器

    BME280SPI3wUseType spi3W_en3线SPI控制

    BME280TempSampleType osrs_t,温度精度

    BME280PresSampleType osrs_p,压力精度

    BME280PowerModeType mode,电源模式

    BME280HumiSampleType osrs_h,湿度精度

    BME280Read Read,读数据操作指针

    BME280Write Write,写数据操作指针

    BME280Delayms Delayms,延时操作指针

    BME280ChipSelect ChipSelect,片选操作指针

    对于这些参数,对象变量我们已经定义了。接口选择、间隔周期、过滤器、3线SPI控制、温度精度、压力精度、湿度精度、电源模式等都是枚举量我们根据实际情况输入即可。而使用I2C接口时需要的设备地址,也按具体地址给入就好。主要的是我们需要定义几个函数,并将函数指针作为参数。这几个函数的类型如下:

    /* 定义读数据操作函数指针类型 */
    typedef void (*BME280Read)(struct BME280Object *bme,uint8_t regAddress,uint8_t *rData,uint16_t rSize);
    
    /* 定义写数据操作函数指针类型 */
    typedef void (*BME280Write)(struct BME280Object *bme,uint8_t regAddress,uint8_t command);
    
    /* 定义延时操作函数指针类型 */
    typedef  void (*BME280Delayms)(volatile uint32_t nTime);
    
    /* 定义使用SPI接口时,片选操作函数指针类型 */
    typedef  void (*BME280ChipSelect)(BME280CSType cs);

    对于这几个函数我们根据样式定义就可以了,具体的操作可能与使用的硬件平台有关系。若采用的SPI接口则需注意片选操作,片选操作函数用于多设备需要软件操作时,如采用硬件片选可以传入NULL即可。同样如果采用的是I2C接口,则片选可以传入NULL即可。具体函数定义如下:

    /*读BME280寄存器值*/
    static void ReadDataFromBME280(BME280ObjectType *bme280,uint8_t regAddress,uint8_t *rData,uint16_t rSize)
    {
      HAL_I2C_Master_Transmit(&bme280hi2c, bme280->bmeAddress,&regAddress,1,1000);
     
      HAL_I2C_Master_Receive(&bme280hi2c, bme280->bmeAddress+1,rData, rSize, 1000);
    }
    
    /*写BME280寄存器值*/
    static void WriteDataToBME280(BME280ObjectType *bme280,uint8_t regAddress,uint8_t command)
    {
      uint8_t pData[2];
     
      pData[0]=regAddress;
      pData[1]=command;
     
      HAL_I2C_Master_Transmit(&bme280hi2c,bme280->bmeAddress, pData, 2,1000);
    }

    对于延时函数我们可以采用各种方法实现。我们采用的STM32平台和HAL库则可以直接使用HAL_Delay()函数。于是我们可以调用初始化函数如下:

    BME280Initialization(&bme280,  //BME280对象
                         0xEC,           //I2C接口是设备地址
                         BME280_I2C,    //接口选择
                         BME280_T_SB_0P5,       //间隔周期
                         BME280_IIR_FILTER_COEFF_X16,        //过滤器
                         BME280_SPI3W_DISABLE,                      //3线SPI控制
                         BME280_TEMP_SAMPLE_X16, //温度精度
                         BME280_PRES_SAMPLE_X16,          //压力精度
                         BME280_POWER_NORMAL_MODE,                                  //电源模式
                         BME280_HUMI_SAMPLE_X16,                       //湿度精度
                         ReadDataFromBME280,                                   //读数据操作指针
                         WriteDataToBME280,            //写数据操作指针
                         HAL_Delay,                     //延时操作指针
                         NULL                                //片选操作指针
                         );

    3.2、基于对象进行操作

    我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经将获取数据并转换为转换值的比例值,接下来我们使用这一驱动开发我们的应用实例。

    /*获取大气压力和温度*/
    void BME280GetEnvironmentalData(void)
    {
           float pressure;                   //压力值
           float temperature;      //温度值
           float humidity;                  //湿度值
          
           GetBME280Measure(&bme280);
    
           pressure=bme280.pressure;
           temperature=bme280.temperature;
           humidity=bme280.humidity;
    }

    4、应用总结

    BME280压力湿度温度传感器的驱动已经实现并做了简单的应用。在我们测试时,得到的数据与其它方法获得的温度压力数据基本是一致的,这说明我们的驱动程序总体来说是正确的。

    BME280压力湿度温度传感器支持SPII2C两种接口,而且SPI也支持3线和4线模式,但我们在测试应用中只使用了I2C接口,SPI接口还有待测试。

    在使用驱动时需注意,采用SPI接口的器件需要考虑片选操作的问题。如果片选信号是通过硬件电路来实现的,我们在初始化时给其传递NULL值。如果是软件操作片选则传递我们编写的片选操作函数。而如果采用I2C接口,那么在初始化时也应传递NULL值。

    BME280压力湿度温度传感器在使用SPI接口时,支持SPI模式0CPOL=CPHA=0)和模式3CPOL=CPHA=1)。而在使用I2C接口时,支持标准模式、快速模式以及高速模式。而且在使用I2C接口时,SDO引脚必须接高电平或低电平,以确定设备地址。

    源码下载:https://github.com/foxclever/ExPeriphDriver

    欢迎关注:

     

    展开全文
  • 在工业现场,传感器距离控制器往往很长,所以导线电阻就不能忽略了,于是延伸出热敏电阻或远传压力表的二线、三线、四线制接法:

    在工业现场,传感器距离控制器往往很长,所以导线电阻就不能忽略了,于是延伸出热敏电阻或远传压力表的二线、三线、四线制接法:




    展开全文
  • 用倾角传感器做实例,说明了该方法的原理以及硬件、软件实现,分析了影响传送距离的因素并提出了对策。  0 引言  现场测量中,常遇到测点呈线状分布的情形,例如,输电线路,输油管道,河流沿线,城市管网等,这...
  • 用倾角传感器做实例,说明了该方法的原理以及硬件、软件实现,分析了影响传送距离的因素并提出了对策。  0 引言  现场测量中,常遇到测点呈线状分布的情形,例如,输电线路,输油管道,河流沿线,城市管网等,这...
  • 传感器技术简答题

    2021-03-26 09:43:18
    什么是传感器 传感器是能感受规定的被测量量并按照一定规律转换成可用输出信号的器件和装置,通常由敏感元件和转换元件组成。...传感器可按输出量、输入量、工作原理、基本效应、能量变换关系以及所蕴含

    什么是传感器

    传感器是能感受规定的被测量量并按照一定规律转换成可用输出信号的器件和装置,通常由敏感元件和转换元件组成。

    传感器的共性是什么?

    传感器的共性就是利用物理定律或物质的物理、化学或生物特性,将非电量(如位移、速度、加速度、力等)输入转换成电量输出。

    传感器一般由哪几部分组成?

    传感器的基本组成分为敏感元件和转换元件两部分,分别完成检测和转换两个基本功能。另外还需要信号调理与转换电路,辅助电源。

    传感器是如何分类的?

    传感器可按输出量、输入量、工作原理、基本效应、能量变换关系以及所蕴含的技术特征等分类,其中按输入量和工作原理的分类方式应用较为普遍。

    按传感器的输入量进行分类

    按输入量分类的传感器以被测物理量命名,如位移传感器、速度传感器、温度传感器、湿度传感器、压力传感器等。

    按传感器的工作原理进行分类

    根据传感器的工作原理(物理定理、物理效应、半导体理论、化学原理等),可以分为电阻式传感器、电感式传感器、电容式传感器、压电式传感器、磁敏式传感器、热电式传感器、光电式传感器等。

    按传感器的基本效应进行分类

    根据传感器敏感元件所蕴含的基本效应,可以将传感器分为物理传感器、化学传感器和生物传感器。

    改善传感器性能的技术途径有哪些?

    差动技术、平均技术、补偿与修正技术、屏蔽,隔离与干扰抑制、稳定性处理。

    什么是传感器的静态特性?描述传感器静态特性的主要指标有哪些?

    传感器的静态特性是它在稳态信号作用下的输入、输出关系。静态特性所描述的传感器的输入-输出关系中不含时间变量。

    衡量传感器静态特性的主要指标是线性度、灵敏度、分辨率、迟滞、重复性和漂移。

    电阻应变片的种类有哪些?各有什么特点?

    常用的电阻应变片有两种:金属电阻应变片和半导体电阻应变片。金属电阻应变片的工作原理是主要基于应变效应导致其材料几何尺寸的变化;半导体电阻应变片的工作原理是主要基于半导体材料的压阻效应。

    试分析差动测量电路在应变电阻式传感器测量中的好处。

    单臂电桥测量电路存在非线性误差,而半桥差动和全桥差动电路均无非线性误差。

    半桥差动电路的电压输出灵敏度比单臂电桥提高了一倍。全桥差动电路的电压输出灵敏度是单臂电桥的4倍。

    引起零点残余电压的原因是什么?如何消除零点残余电压?

    零点残余电压的产生原因:

    ①传感器的两个二次绕组的电气参数和几何尺寸不对称,导致他们产生的感生电动势幅值不等、相位不同,构成了零点残余电压的基波;

    ②由于磁性材料磁化曲线的非线性,产生了零点残余电压的高次谐波;

    ③励磁电压本身含高次谐波。

    零点残余电压的消除方法:①尽可能保证传感器的几何尺寸、线圈电气参数和磁路的对称;

    ②采用适当的测量电路,如差动整流电路。

    在使用螺线管电感式传感器时,如何根据输出电压来判断衔铁的位置?

    无论两个二次绕组的输出瞬时电压极性如何,流经电容C1的电流方向总是从2端到4端,流经电容C2的电流方向总是从6端到8端,所以整流电路的输出电压为U0=U24-U65.

    当衔铁位于中间位置时,U24=U68,故输出电压U0=0;当衔铁位于零位以上时,U24>U68,则U0>0;当衔铁位于零位以下时,则有U24<U68,U0<0.只能根据U0的符号判断衔铁的位置再零位处、零位以上或以下,但不能判断运动的方向。

    如何通过相敏检波电路实现对位移大小和方向的判定?

    相敏检测电路原理是通过鉴别相位来判别位移的方向,即差分变压器输出的调幅波经相敏检波后,便能输出既反映位移大小,又反映位移极性的测量信号。经过相敏检波电路,正位移输出正电压,负位移输出负电压,电压值的大小表示位移的大小,电压的正负表明位移的方向。

    什么是压电效应?什么是逆压电效应?

    ①正压电效应就是对某些电介质沿一定方向施加外力使其变形时,其内部将产生极化现象而使其出现电荷集聚的现象。

    ②当在片状压电材料的两个电极面上加上交流电压,那么压电片将产生机械振动,即压电片在电极方向上产生伸缩变形,压电材料的这种现象称为电致伸缩效应,也称为逆压效应。

    试分析石英晶体的压电效应原理

    石英晶体的化学成分是siO2,是单晶结构,理想形状六角锥体。石英晶体是各向异性材料,不同晶向具有各异的物理特性,用x、y、z轴来描述。

    z轴:是通过锥顶端的轴线,是纵向轴,称为光轴,沿该方向受力不会产生压电效应。

    x轴:经过六面体的楞线并垂直于z轴的轴为x轴,称为电轴,沿该方向受力产生的压电效应称为“纵向压电效应”。

    y轴:与x、z轴同时垂直的轴为y轴,称为机械轴。沿该方向受力产生的压电效应称为“横向压电效应”。

    石英晶体在沿一定的方向受到外力的作用变形时,由于内部电极化现象同时在两个表面上产生符号相反的电荷,当外力去掉后,恢复到不带电的状态;而当作用力方向改变时,电荷的极性随着改变。晶体受力所产生的电荷量的外力的大小成正比。这种现象称为正压电效应。反之,如对石英晶体施加一定变电场,晶体本身将产生机械变形,外电场撤离,变形也随之消失,称为逆压电效应。

    热电偶的工作原理是什么?

    热电偶的测温基本原理:热电偶测温是基于热电效应的基本原理。根据热电效应,任何两种不同的导体或半导体组成的闭合回路,如果将它们的两个节点分别置于温度不同的热源中,则在该回路中会产生热电动势,在一定条件下,产生的热电动势与被测温度成单值函数关系。因此,我们只需要测得热电动势值,就可间接获得被测温度。

    什么是中间导体定律、中间温度定律、标准导体定律、均质导体定律?

    ①中间导体定律

    热电偶测温时,若在回路中插入中间导体,只要中间导体两端的温度相同,则对热电偶回路总的热电势不产生影响。在用热电偶测温时,连接导线及显示仪表等均可看成中间导体。

    ②中间温度定律

    任何两种均匀材料组成的热电偶,热端为t,冷端为t0时的热电式等于该热电偶热端为t冷端为tc时的热电势与统一热电偶热端为tc,冷端为t0时热电势的代数和。

    应用:对热电偶冷端不为0°C时,可用中间温度定律加以修正。

    热电偶长度不够时,可根据中间温度定律选用适当的补偿线路。

    ③标准电极定律

    如果A、B两种导体分别于第三种导体C组成的热电偶所产生的热电动势已知,则由这两个导体A、B组成的热电偶产生的热电势为

    EAB(t,t0)=EAC(t,t0)-EBC(t,t0)

    实用价值:可大大简化热电偶的选配工作。在实际工作中,只要获得有关热电极与标准铂电极配对的热电势,那么由这两种热电极配对组成热电偶的热电势便可由上式求得,而不需逐个进行测定。

    ④均质导体定律

    如果组成热电偶的两个热电极的材料相同,无论两接点的温度是否相同,热电偶回路中的总热电势均为0.

    均质导体定律有助于检验两个热电极材料成分是否相同及热电极材料的均匀性。

    热电阻有什么特点?

    热电阻测温基本原理:热电阻测温是基于热效应的基本原理。所谓热效应,就是金属导体的阻值会随温度升高而增加或减少的现象。因此,我们只需测得金属导体电阻的变化就可间接获得被测温度。

    试分析三线制和四线制接法在热电阻测量中的原理及其不同特点。

    热电阻常用引线方式主要有:两线制、三线制和四线制。

    两线制的特点是结构简单、费用低,但是引线电阻及其变化会带来附加误差。主要适用于引线不长、测量精度要求较低的场合。

    三线制的特点可较好地减少引线电阻的影响。主要适用于大多数工业测量场合。

    四线制的特点是精度高,能完全消除引线电阻对测量的影响。主要适用于实验室等高精度测量场合。

    什么是光电效应、内光电效应。外光电效应?这些光电效应的典型光电器件各自有哪些?

    光照射到物体上使物体发射电子,或电导率发生变化,或产生光生电动势等,这些因光照引起物体电学特性改变的现象称为光电效应。

    当光照射到金属或金属氧化物的光电材料上时,光子的能量传给光电材料表面的电子,如果入射到表面的光能使电子获得足够的能量,电子会克服正离子对它的吸引力,脱离材料表面进入外界空间,这种现象称为外光电效应。根据外光电效应制作的光电器件有光电管和光电倍增管。

    内光电效应是指物体受到光照后所产生的光电子只在物体内部运动,而不会溢出物体的现象。内光电效应多发生在半导体内,可分为因光照引起半导体电阻率变化的光电导效应和因光照产生电动势的光生伏特效应两种。

    光电导效应是指物体在入射光能量的激发下,其内部产生光生载流子,使物体中载流子数量显著增加而电阻减少的现象。基于光电导效应的光电器件有光敏电阻。

    光生伏特效应是指光照在半导体中激发出的光电子和空穴在空间分开而产生电位差的现象,是将光能变为电能的一种效应。基于光生伏特效应的光电器件典型的有光电池;此外,光敏二极管、光敏晶体管也是基于光生伏特效应的光电器件。

    试分析微波传感器的主要组成及其各自的功能

    微波传感器的组成主要包括三个部分:微波发生器(或称微波振荡器)、微波天线及微波检测器。

    微波发生器

    微波发生器是产生微波的装置。由于微波波长很短、频率很高(300MHZ~300GHZ),要求震荡回路有非常小的电感与电容,故不能采用普通的晶体管构成微波振荡器,而是采用速调管、磁控管或某些固态元件构成。小型微波振荡器也可采用体效应管。

    微波发生器产生的震荡信号需要用波导管传输。

    微波天线

    微波天线是用于将经振荡器产生的微波信号发射出去的装置。为了保证发射出去的微波信号具有最大的能量输出和一致的方向性,要求微波天线有特殊的结构和形状,常用的天线包括喇叭形、抛物面性等。前者在波导管与敞开的空间之间起匹配作用,有利于获得最大能量输出;后者类似凹面镜产生平行光,有利于改善微波发射的方向性。

    微波检测器

    微波检测器是用于探测微波信号的装置。微波在传播过程中表现为空间电场的微小变化,因此使用电流-电压呈非线性的电子元件,根据工作频率的不同,有多种电子元件可供选择,但都要求他们在工作频率范围内有足够快的相应速度。

    电阻应变片温度误差产生的原因及补偿方法。

    电阻应变片产生温度误差的原因:当测量现场环境温度变化时,由于敏感栅温度系数及栅丝与试件膨胀系数之差异性而给测量带来了附加误差。

    电阻应变片的温度补偿方法:通常有线路补偿法和应变片自补偿两大类。

    1)电桥补偿是最常用的且效果较好的线路补偿法。电桥补偿法简单易行,而且能在较大的温度范围内补偿,但上面的四个条件不一定满足,尤其是两个应变片很难处于同一温度场。

    2)应变片的自补偿法是利用自身具有温度补偿作用的应变片。

    展开全文
  • 在工业现场,传感器距离控制器往往很长,所以导线电阻就不能忽略了,于是延伸出热敏电阻或远传压力表的二线、三线、四线制接法: ...
  •  可以作为过程控制应用的完整模拟前端,其独特的前端增益可编程功能允许AD7731直接接受来自传感器(如压力传感器或温度传感器)的各种范围的输入信号。AD7731采用三线模式串行接口,易于与微处理器或数字信号处理器...
  • 汽车传感器科普

    2019-12-28 17:00:42
    来源:湖杉资本先进驾驶辅助系统(Advanced Driver Assistant System),简称ADAS,是利用安装于车上的各式各样的传感器, 在第一时间收集车内外的环境数据, ...
  • 常用传感器信号测量汇总

    万次阅读 2016-02-24 23:29:06
    传感器的具体构成根据被测对象、转换原理,使用环境和性能要求的情况有很大 差异。 自源型是仅含有转换元件的传感器构成形式,它不需要外能源,可直接从外部被 测对象吸收能量转换为电效应,但输出的能量较弱。...
  • 随着自动驾驶等级 的提高,对传感器的数量和质量也提出了更高的要求,L2 级自动驾驶 传感器数量约为 6 个,L3 约为 13 个,未来 L5 要达到 30 个以上,相 应带动汽车传感器市场高速增长。2016 年,中国汽车传感器...
  • 传感器与检测技术基础 复习提纲 考试不挂科专用版 题型: 选择题 判断题 问答题 计算题 复习要点 1. 了解传感器定义、组成及分类。 定义:传感器是一中以一定精度把测量(主要是非电量)转换与之有确定...
  • 前言:AD转换就是模拟信号到数字信号的转换。顾名思义,就是把模拟信号转换成数字信号,其是数字信号处理等电路中经常用到的芯片,类似...(2)压力、温度、湿度、位移、声音等非电信号。但这些非电信号必须经各种...
  • 1.加速踏板位置传感器电路识读大众车系普遍采用电子节气门,取消了加速踏板和节气门之间的拉锁,转而采用加速踏板位置传感器。加速踏板位置传感器向发动机控制单元提供驾驶员操作加速踏板的信息,发动机控制单元根据...
  • 37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备逐一做做...
  • 变送器概念 ...原理 热电偶或热电阻传感器将被测温度转换成电信号,再将该信号送入变送器的输入网络,该网络包含调零和热电偶补偿等相关电路。经调零后的信号输入到运算放大器进行信号放大,放大的信号
  • 检测技术与原理

    2020-12-19 22:15:24
    传感器: 检测系统与被测对象直接发生联系的器件或装置 信号调理电路:为方便检测系统后续环节处理或显示,完成对检测系统组成框图 传感器输出的微弱信号进行检波、转换、滤波、放 大等处理的功能电路。 数据采集及...
  •   当然,电流输出可以与电源公用一根线公用VCC或者GND,可节省一根线,称之为三线制变送器。其实大家可能注意到, 4-20mA电流本身就可以为变送器供电。变送器在电路中相当于一个特殊的负载...
  • 也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器。(为什么特别提磁力计和压力传感器呢?因为在飞控方面,利用陀螺仪和加速计可以计算飞行器的倾角,从而调节飞行器平衡。但是只是调节平衡对方向没有...
  • S5PV210开发 -- SPI 你知道多少?

    千次阅读 2018-01-05 12:55:47
    传感器:温度,压力,ADC,触摸屏,视频游戏控制器 控制设备:音频编解码器,数字电位器,DAC 相机镜头:佳能EF镜头卡口 通讯:以太网,USB,USART,CAN,IEEE 802.15.4,IEEE 802.11,手持视频游戏 内存:闪存...
  • 控制装置与仪表随堂练习答案及知识点总结01

    千次阅读 多人点赞 2019-12-20 16:42:35
    文章目录第二章 计算机控制的理论基础§2.2.连续模型与离散模型间的转换向后差分变换法双线性变换法零...模拟量输入通道采样保持器AD转换器工作原理逐位逼近式AD转换原理(☆)双积分式AD转换原理(☆)Σ-Δ式AD转换原...
  • PT100恒流源测温电路

    万次阅读 多人点赞 2018-11-26 09:18:29
    在工业现场,传感器距离控制器往往很长,所以导线电阻就不能忽略了,于是延伸出热敏电阻或远传压力表的二线、三线、四线制接法:     出处:PT100恒流源测温电路&lt;一&gt;  自从想要做一个...
  • 2、作为IIC接口,配置为IIC接口后又分两种模式 1:IIC主机模式,来接其他的传感器(如罗盘或压力传感器),2: pass-through 模式,此模式使能后,该IIC接口就直接和主(UI)的IIC直接连接在了一起,这样处理器就...
  • 上海QY-QD10工业智能型液压综合实验装置整合开发测试分析系统,智能化数据采集液压实验系统,智能型液压综合实验系统,通过对流量、压力、功率、转速、位移、时间、温度、计算机人机画面–计算机智能数据采集、分析、...
  • 论文,污水流量检测系统

    千次阅读 2020-05-27 15:45:48
    3.1传感器模块的论证与选择 3 3.2定时器模块的论证与选择 4 3.3显示模块的论证与选择 4 4 系统理论分析 4 4.1 AT89C51原理分析 5 4.2 GSM通信原理 6 4.3 超声波传感器分析 7 4.4 液晶显示分析 7 5 系统设计 9 5.1...
  • 污水流量检测系统

    千次阅读 2020-05-27 15:47:44
    3.1传感器模块的论证与选择 3 3.2定时器模块的论证与选择 4 3.3显示模块的论证与选择 4 4 系统理论分析 4 4.1 AT89C51原理分析 5 4.2 GSM通信原理 6 4.3 超声波传感器分析 7 4.4 液晶显示分析 7 5 系统设计 9 5.1...
  • 电子力传感器有各种不同的格式和大小,从小型的单个应变计到精密工程的测压元件。了解操作原理和可能的误差来源可以帮助选择和安装,以确保准确的测量和长期可靠的应用,从实验室试验和结构监测到批量称重,车辆安全...

空空如也

空空如也

1 2 3 4 5 6
收藏数 104
精华内容 41
关键字:

三线压力传感器原理