当前位置: 首页 > news >正文

外管局网站做延期收汇报告wordpress文章末尾添加版权声明

外管局网站做延期收汇报告,wordpress文章末尾添加版权声明,wordpress生成分类目录,西安装修公司在我们的产品中#xff0c;经常需要检测温湿度数据。有很多检测温湿度的方法和模块#xff0c;其中SHT1x系列温湿度传感器就是一种成本较低使用方便的温湿度检测模块。下面我们就来说一说如何实现SHT1x系列温湿度传感器的驱动。 1、功能概述 SHT1x包括 SHT10#xff0c; S…在我们的产品中经常需要检测温湿度数据。有很多检测温湿度的方法和模块其中SHT1x系列温湿度传感器就是一种成本较低使用方便的温湿度检测模块。下面我们就来说一说如何实现SHT1x系列温湿度传感器的驱动。 1、功能概述 SHT1x包括 SHT10 SHT11 和 SHT15 属于Sensirion温湿度传感器家族中的贴片封装系列。传感器将传感元件和信号处理电路集成在一块微型电路板上输出完全标定的数字信号。 1.1、硬件描述 SHT1x传感器包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件并在同一芯片上与14 位的A/D 转换器以及串行接口电路实现无缝连接。其引脚定义如下 SHT1x温湿度传感器使用的2线通讯类似于I2C总线但并不相同使用普通的GPIO就可实现通讯。此次采用STM32F103VET6来操作SHT15具体的连接方式如下 SCK 用于微处理器与SHT1x 之间的通讯同步。由于接口包含了完全静态逻辑因而不存在最小SCK 频率。 DATA 引脚为三态结构用于读取传感器数据 . 当向传感器发送命令时 DATA 在 SCK 上升沿有效且在 SCK 高电平时必须保持稳定。 DATA 在 SCK 下降沿之后改变。为避免信号冲突微处理器应驱动DATA 在低电平。需要一个外部的上拉电阻例如10kΩ将信号提拉至高电平。上拉电阻通常已包含在微处理器的I/O 电路中。 1.2、数据通讯 选择供电电压后将传感器通电上电速率不能低于1V/ms。通电后传感器需要11ms 进入休眠状态在此之前不允许对传感器发送任何命令。 SHT1x温湿度传感器采用一组“启动传输”时序来完成数据传输的初始化。而后续命令包含三个地址位目前只支持000”和五个命令位。SHT1x 会以下述方式表示已正确地接收到指令在第8 个SCK 时钟的下降沿之后将DATA 下拉为低电平ACK 位。在第9 个SCK 时钟的下降沿之后释放DATA恢复高电平。SHT1x温湿度传感器的指令表如下 后续我们开发SHT1x温湿度传感器的驱动时就是通过这些操作命令来实现不同的操作。 1.3、数据计算 湿度的测量数据并不是一个线性变化的过程湿度的非线性为获得更为精确的测量数据我们一般要采用非线性补偿公式进行信号转换。湿度的非线性补偿公式及参数如下 一般来说传感器湿度的校准都是在一定的参考温度下进行的但在我们的使用过程中实际温度与测试参考温度25℃ (~77℉)明显是不同的所以我们需要对实际的湿度数据进行补偿。湿度的温度补偿公式及系数如下 SHT1x系列温湿度传感器的温度传感器采用的能隙材料PTAT。而能隙材料PTAT一般与绝对温度存在正比关系因而温度传感器具有极好的线性。可用如下公式将数字输出(SOT)转换为温度值温度转换系数如下 SHT1x 并不直接进行露点测量但露点可以通过温度和湿度读数计算得到.。由于温度和湿度在同一块集成电路上测量SHT1x可测量露点。露点的计算方法很多绝大多数都很复杂。 对于-40 – 50°C 温度范围的测量通过下面的的公式可得到较好的精度。 通过上述几个公式就可以计算出SHT1x监测的温度、湿度及露点数据。 2、驱动设计与实现 我们已经了解了SHT1x系列温湿度传感器基本技术特性接下来我们进一步考虑如何设计并实现SHT1x系列温湿度传感器的驱动。 2.1、对象定义 在使用一个对象之前我们需要获得一个对象。同样的我们想要SHT1x系列温湿度传感器就需要先定义SHT1x系列温湿度传感器的对象。 2.1.1、对象的抽象 我们要得到SHT1x系列温湿度传感器对象需要先分析其基本特性。一般来说一个对象至少包含两方面的特性属性与操作。接下来我们就来从这两个方面思考一下SHT1x系列温湿度传感器的对象。 先来考虑属性作为属性肯定是用于标识或记录对象特征的东西。我们来考虑SHT1x系列温湿度传感器对象属性。首先SHT1x系列温湿度传感器有一个状态寄存器用于表示状态和配置操作特性所以我们将读取的状态寄存器的数据作为标识SHT1x系列温湿度传感器对象的一个属性。我们根据前面SHT1x系列温湿度传感器的数据计算公式可知温度单位和工作电压对温度测量结果的计算有直接影响所以我们将温度单位和工作电压也作为SHT1x系列温湿度传感器对象的属性用于区别计算过程。此外温度、湿度、露点的数据我们将其作为属性用于记录当前状态。 接着我们还需要考虑SHT1x系列温湿度传感器对象的操作问题。我们是使用GPIO来模拟数字通讯所以SCK引脚和DATA引脚都需要控制输出而控制函数的实现与具体的硬件相关所以我们将控制这两个引脚输出的函数作为对象的操作。对于DATA引脚还有可能需要控制方向和读取输入同样的原因我们也将其作为对象的操作。此外我们在与SHT1X通讯时需要控制时钟以及操作等待都是与硬件有关系的时间操作所以我们也将其作为对象的操作。 根据上述我们对SHT1x温湿度传感器的分析我们可以定义SHT1x温湿度传感器的对象类型如下 /* 定义SHT1x对象类型 */ typedef struct Sht1xObject {uint8_t statusReg;                  //状态寄存器uint32_t period;                    //SCK时钟周期SHT1xTempUnitType tempUnit;         //温度单位float vdd;                          //工作电压float temperature;                  //温度float humidity;                     //湿度float dewPoint;                     //露点SHT1xSetBusPin *SetBusPin;          //总线操作函数uint8_t (*ReadSDABit)(void);       //读数据总线函数void (*SDADirection)(SHT1xIODirectionType direction);       //数据总线方向控制函数void (*Delayus)(volatile uint32_t period);    //微秒延时函数void (*Delayms)(volatile uint32_t nTime);     //毫秒秒延时函数 }Sht1xObjectType; 2.1.2、对象初始化 我们知道一个对象仅作声明是不能使用的我们需要先对其进行初始化所以这里我们来考虑SHT1x系列温湿度传感器对象的初始化函数。一般来说初始化函数需要处理几个方面的问题。一是检查输入参数是否合理二是为对象的属性赋初值三是对对象作必要的初始化配置。据此我们设计SHT1x系列温湿度传感器对象的初始化函数如下 /* 初始化SHT1x对象 */ void SHT1xInitialization(Sht1xObjectType *shtuint32_t sckfloat vddSHT1xTempUnitType uintSHT1xHeaterType heaterSHT1xOTPType otpSHT1xResolutionType resolutionSHT1xSetBusPin setSckPinHT1xSetBusPin setDataPinSHT1xReadSDABit readSDASHT1xSDADirection directionSHT1xDelay delayusSHT1xDelay delayms) {uint8_t regSetup0x00;uint8_t heaterSet[]{ONCHIPHEATERDISABLEONCHIPHEATERENABLE};       //是否启用片内加热配置集uint8_t otpSet[]{OTPENABLEOTPDISABLE};                                                                             //是否加载OTP配置集uint8_t dpiSet[]{HIGH_RESOLUTION_DATALOW_RESOLUTION_DATA};    //数据分辨率配置集if((shtNULL)||(setSckPinNULL)||(setDataPinNULL)||(readSDANULL)||(delayusNULL)||(delaymsNULL)){return;}setBusPin[0]setSckPin;setBusPin[1]setDataPin;sht-SetBusPinsetBusPin;sht-ReadSDABitreadSDA;sht-Delayusdelayus;sht-Delaymsdelayms;if(direction!NULL){sht-SDADirectiondirection;}else{sht-SDADirectionDefaultSDADirection;}/*初始化速度默认100K*/if((sck0)(sck500)){sht-period500/sck;}else{sht-period5;}sht-temperature0.0;sht-humidity0.0;sht-dewPoint0.0;sht-vddvdd;sht-tempUnituint;regSetupregSetup|heaterSet[heater]|otpSet[otp]|dpiSet[resolution];WriteStatusRegister(shtregSetup);sht-Delayms(10);ReadStatusRegister(sht); } 2.2、对象操作 我们已经完成了SHT1x系列温湿度传感器对象类型的定义和对象初始化函数的设计。但我们的主要目标是获取对象的信息接下来我们还要实现面向SHT1x温湿度传感器的各类操作。 2.2.1、启动通讯 每次发起与SHT1x温湿度传感器的通讯都需要用一组“启动传输”时序来完成数据传输的初始化。它包括当SCK时钟高电平时DATA翻转为低电平紧接着SCK变为低电平随后是在SCK时钟高电平时DATA翻转为高电平。启动通讯时序如下图 根据上述时序图我们可以实现启动通讯的操作函数如下 /*SHT1X启动时序操作*/ static void StartSHT1XOperation(Sht1xObjectType *sht) {/*将data线设置为输出模式*/sht-SDADirection(Out);sht-SetBusPin[DataPin](SHT1xSet);sht-SetBusPin[SckPin](SHT1xReset);sht-Delayus(sht-period);sht-SetBusPin[SckPin](SHT1xSet);sht-Delayus(sht-period);sht-SetBusPin[DataPin](SHT1xReset);sht-Delayus(sht-period);sht-SetBusPin[SckPin](SHT1xReset);sht-Delayus(sht-period);sht-SetBusPin[SckPin](SHT1xSet);sht-Delayus(sht-period);sht-SetBusPin[DataPin](SHT1xSet);sht-Delayus(sht-period);sht-SetBusPin[SckPin](SHT1xReset); } 2.2.2、复位通讯 如果与SHT1x通讯中断可通过下列信号时序复位当DATA保持高电平时触发SCK时钟9 次或更多。接着发送一个“传输启动”时序。这些时序只复位串口状态寄存器内容仍然保留。具体的时序图如下 根据上述的时序图我们设计通讯复位操作函数如下 /*SHT1X通讯复位*/ void ResetSHT1XCommunication(Sht1xObjectType *sht) {/*将data线设置为输出模式*/sht-SDADirection(Out);sht-Delayms(1);sht-SetBusPin[DataPin](SHT1xSet);sht-SetBusPin[SckPin](SHT1xReset);for(int i0;i9;i){sht-SetBusPin[SckPin](SHT1xSet);sht-Delayus(sht-period);sht-SetBusPin[SckPin](SHT1xReset);sht-Delayus(sht-period);}StartSHT1XOperation(sht); } 2.2.3、数据获取 在前面我们已经了解了SHT1x通讯命令根据命令定义我们发送命令“00000101”就表示相对湿度RH测量发送命令“00000011”就表示温度T的测量。测量过程需要大约20/80/320ms分别对应8/12/14bit分辨率。SHT1x通过下拉DATA至低电平并进入空闲模式表示测量的结束。控制器在再次触发SCK时钟前必须等待这个“数据备妥”信号来读出数据。检测数据可以先被存储这样控制器可以继续执行其它任务在需要时再读出数据。 接着传输2个字节的测量数据和1个字节的CRC奇偶校验可选择读取。控制器需要通过下拉DATA为低电平以确认每个字节。所有的数据从MSB 开右值有效例如对于12bit 数据从第5个SCK时钟起算作MSB而对于8bit 数据首字节则无意始义。 在收到CRC的确认位之后表明通讯结束。如果不使用CRC-8 校验控制器可以在测量值LSB后通过保持ACK高电平终止通讯。在测量和通讯完成后SHT1x自动转入休眠模式。数据测量时序图如下所示 根据上述描述和时序图我们可以实现温湿度数据的获取函数如下 /*获取SHT1X的湿度值*/ float GetSht1xHumidityValue(Sht1xObjectType *sht) {float humiValue0.0;uint16_t sorh0;uint8_t err0;uint8_t humiCode[2]{00};uint8_t checkSum0;StartSHT1XOperation(sht);WriteByteToSht1x(shtHUMI_MEAS_COMMAND);sht-SDADirection(In);if((sht-statusReg0x01)0x01){sht-Delayms(20);}else{sht-Delayms(80);}if(sht-ReadSDABit() 1){err 1;}humiCode[0]ReadByteFromSht1x(shtAck);humiCode[1]ReadByteFromSht1x(shtAck);checkSumReadByteFromSht1x(shtnoAck);if(CheckCRC8ForSHT1x(humiCode2checkSum)){sorh(humiCode[0]8)|humiCode[1];}else{err 1;}if(err ! 0){ResetSHT1XCommunication(sht);}else{humiValueConvertHumidityData(shtsorh);}return humiValue; } 2.2.4、状态寄存器操作 SHT1x的某些高级功能可以通过给状态寄存器发送指令来实现如选择测量分辨率电量不足提醒使用OTP加载或启动加热功能等。SHT1x的状态寄存器可以读或者写。其实写状态寄存器就是配置设备的一些特性一般情况下在初始化时完成即可。读写状态寄存器的格式如下 /*读状态寄存器*/ static uint8_t ReadStatusRegister(Sht1xObjectType *sht) {uint8_t err0;uint8_t status;uint8_t checkSum;StartSHT1XOperation(sht);errWriteByteToSht1x(shtREAD_STATUS_REGISTER);statusReadByteFromSht1x(shtAck);checkSumReadByteFromSht1x(shtnoAck);if(CheckCRC8ForSHT1x(status1checkSum)){sht-statusRegstatus;}else{err1;}return err; }/*写状态寄存器*/ static uint8_t WriteStatusRegister(Sht1xObjectType *shtuint8_t *pValue) {uint8_t err0;StartSHT1XOperation(sht);err WriteByteToSht1x(shtWRITE_STATUS_REGISTER);err WriteByteToSht1x(sht*pValue);err ReadStatusRegister(sht);return err; } 3、驱动的使用 我们已经设计并实现了SHT1x温湿度传感器驱动接下来我们还需要对这一驱动进行验证所以我们要基于此驱动设计一个简单的应用。 3.1、声明并初始化对象 使用基于对象的操作我们需要先得到这个对象所以我们先要使用前面定义的SHT1x温湿度传感器对象类型声明一个SHT1x温湿度传感器对象变量具体操作格式如下 Sht1xObjectType sht1x; 声明了这个对象变量并不能立即使用我们还需要使用驱动中定义的初始化函数对这个变量进行初始化。这个初始化函数所需要的输入参数如下 Sht1xObjectType *shtSHT1X对象变量 uint32_t sckSCK时钟频率 float vdd工作电压 SHT1xTempUnitType uint温度单位 SHT1xHeaterType heater是否启用加热器设置 SHT1xOTPType otp是否加在OTP设置 SHT1xResolutionType resolution测量分辨率设置 SHT1xSetBusPin setSckPinSCK引脚操作函数 SHT1xSetBusPin setDataPinDATA引脚操作函数 SHT1xReadSDABit readSDA读DATA引脚函数 SHT1xSDADirection directionDATA引脚方向配置函数 SHT1xDelay delayus微秒延时函数 SHT1xDelay delayms毫秒延时函数 对于这些参数对象变量我们已经定义了。时钟频率根据实际输入以k为单位默认为100k。工作电压根据实际情况输入。温度单位、加热设置、OTP配置、分辨率配置均为枚举根据实际情况选择就好了。主要的是我们需要定义几个函数并将函数指针作为参数。这几个函数的类型如下 /* 定义GPIO引脚输出操作的函数指针 */ typedef void(*SHT1xSetBusPin)(SHT1xPinValueType value);/* 读数据总线函数 */ typedef uint8_t (*SHT1xReadSDABit)(void);/* 数据总线方向控制函数 */ typedef void (*SHT1xSDADirection)(SHT1xIODirectionType direction);/* 微秒延时函数 */ typedef  void (*SHT1xDelay)(volatile uint32_t period); 对于这几个函数我们根据样式定义就可以了具体的操作可能与使用的硬件平台有关系。片选操作函数用于多设备需要软件操作时如采用硬件片选可以传入NULL即可。具体函数定义如下 /*操作SCK引脚设置高低操作*/ static void OperationSckPin(SHT1xPinValueType value) {HAL_GPIO_WritePin(GPIOBGPIO_PIN_8(GPIO_PinState)value); }/*操作DATA引脚设置高低操作*/ static void OperationDataPin(SHT1xPinValueType value) {HAL_GPIO_WritePin(GPIOBGPIO_PIN_9(GPIO_PinState)value); }/*读取DATA引脚位*/ uint8_t ReadDataPinBit(void) {return (uint8_t)HAL_GPIO_ReadPin(GPIOBGPIO_PIN_9); }/*将DATA线设置为输入输出方向模式*/ void SetDataPineDirection(SHT1xIODirectionType direction) {GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin GPIO_PIN_9;if(direction){ GPIO_InitStruct.Mode GPIO_MODE_INPUT;GPIO_InitStruct.Pull GPIO_NOPULL;}else{ GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH;} HAL_GPIO_Init(GPIOB GPIO_InitStruct); } 对于延时函数我们可以采用各种方法实现。我们采用的STM32平台和HAL库则可以直接使用HAL_Delay()函数。于是我们可以调用初始化函数如下 SHT1xInitialization(sht1x1003.3DegreeCentigradeSHT1xHeaterDisableSHT1xOTPEbableSHT1xHighResolutionOperationSckPinOperationDataPinReadDataPinBitSetDataPineDirectionDelayusHAL_Delay); 这里我们将SHT1x对象初始化为速度100k3.3伏工作电压采用摄氏温度单位禁用片上加热器加载OTP并使用高分辨率。 3.2、基于对象进行操作 我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经将获取数据并转换为转换值的比例值接下来我们使用这一驱动开发我们的应用实例。 这里我们设计一个简单应用使用SHT1X温湿度传感器获取温度、湿度及露点数据具体实现如下 /* 获取SHT1X数据 */ void GetSHT1xData(void) {float temperature0.0;float humidity0.0;float dewPoint0.0;GetSht1xMeasureValue(sht1x);temperaturesht1x.temperature;humiditysht1x.humidity;dewPointsht1x.dewPoint; } 4、应用总结 我们实现了SHT1X温湿度传感器的驱动并使用这一驱动开发了简单的验证应用。所得到的结果与我们预期的结果是一致的这说明我们的驱动开发没有问题。 在使用驱动程序时需要注意一点对象有一个控制DATA总线引脚输入输出方向的操作。对于一般情况下我们编写引脚的输入输出方向控制函数在初始化函数中将函数指针作为参数传入即可。如果硬件上可以配置为开漏输出则可以不用单独控制引脚的输入输出方向。在初始化函数中以NULL作为参数输入。 关于通讯速率问题需要注意。在不同工作电压时所支持的最大通讯速率是不同的但不论如何我都能支持到1MHz所以没有特殊要求电压的影响可以不用考虑。在我们的驱动中最多能支持到500kHz这主要是考虑到SHT1X的典型速度只有100k而且大多数应用中不会有高速要求。 完整的源代码可在GitHub下载https://github.com/foxclever/ExPeriphDriver 欢迎关注
http://www.yutouwan.com/news/155359/

相关文章:

  • 免费网站代理怎么做网店
  • 网站框架设计wordpress4.7.1漏洞
  • 运城网站推广哪家好宣传片制作公司资质
  • 做平行进口的汽车网站西安营销网站
  • 做电脑网站用什么软件好用吗网站建设源码开发
  • h5网站模板下载百度公司的业务范围
  • 网盘做网站服务器个人域名可以做公司网站么
  • 广东手机网站建设app制作平台大全
  • 新做好的网站如何做seo做网站的广告语
  • 网站备案号查询企业网站推广属于付费
  • 网站建设跳转页面怎么弄小米新手机发布
  • 亚马逊外贸网站如何做移动端wordpress主题
  • 桂林微信网站设计做网站公司大连
  • 免费做调查问卷的网站做网站建设找哪家好
  • php能自己做网站吗优秀的网站设计分析
  • html手机网站开发后端如何制作wordpress模板下载
  • saas建站 cmswordpress用户名钩子
  • 网站的登记表是怎么做的嘉兴优化网站公司哪家好
  • 建设网站需要花费多少钱企业所得税政策最新2023
  • 北京做网站推广多少钱建设银行手机行网站
  • 网站建设的隐私条款网站模板上传打不开
  • 网站哪个公司做的比较好的国外网站设计师
  • 东莞市网络营销推广多少钱标题关键词优化报价
  • 徐州关键词排名优化上海seo博客
  • 商城网站备案流程电脑网站建设
  • 建设网站好难安防公司网站建设
  • 山东网站搭建有限公司传奇大气网站模板免费下载
  • 杭州网站建设哪个好免费个人网站怎么建立
  • 手机网站如何开发人与马做的网站
  • 公司网站修改 优帮云毕业设计代做网站 知乎