外设驱动库开发笔记9:SHT1x系列温湿度传感器驱动

在我们的产品中,经常需要检测温湿度数据。有很多检测温湿度的方法和模块,其中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 *sht,uint32_t sck,float vdd,SHT1xTempUnitType uint,SHT1xHeaterType heater,SHT1xOTPType otp,SHT1xResolutionType resolution,SHT1xSetBusPin setSckPin,HT1xSetBusPin setDataPin,SHT1xReadSDABit readSDA,SHT1xSDADirection direction,SHT1xDelay delayus,SHT1xDelay delayms)
{uint8_t regSetup=0x00;uint8_t heaterSet[]={ONCHIPHEATERDISABLE,ONCHIPHEATERENABLE};       //是否启用片内加热配置集uint8_t otpSet[]={OTPENABLE,OTPDISABLE};                                                                             //是否加载OTP配置集uint8_t dpiSet[]={HIGH_RESOLUTION_DATA,LOW_RESOLUTION_DATA};    //数据分辨率配置集if((sht==NULL)||(setSckPin==NULL)||(setDataPin==NULL)||(readSDA==NULL)||(delayus==NULL)||(delayms==NULL)){return;}setBusPin[0]=setSckPin;setBusPin[1]=setDataPin;sht->SetBusPin=setBusPin;sht->ReadSDABit=readSDA;sht->Delayus=delayus;sht->Delayms=delayms;if(direction!=NULL){sht->SDADirection=direction;}else{sht->SDADirection=DefaultSDADirection;}/*初始化速度,默认100K*/if((sck>0)&&(sck<=500)){sht->period=500/sck;}else{sht->period=5;}sht->temperature=0.0;sht->humidity=0.0;sht->dewPoint=0.0;sht->vdd=vdd;sht->tempUnit=uint;regSetup=regSetup|heaterSet[heater]|otpSet[otp]|dpiSet[resolution];WriteStatusRegister(sht,&regSetup);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 i=0;i<9;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 数据,从第5SCK时钟起算作MSB;而对于8bit 数据,首字节则无意始义)。

在收到CRC的确认位之后,表明通讯结束。如果不使用CRC-8 校验,控制器可以在测量值LSB后,通过保持ACK高电平终止通讯。在测量和通讯完成后,SHT1x自动转入休眠模式。数据测量时序图如下所示:

根据上述描述和时序图,我们可以实现温湿度数据的获取函数如下:

/*获取SHT1X的湿度值*/
float GetSht1xHumidityValue(Sht1xObjectType *sht)
{float humiValue=0.0;uint16_t sorh=0;uint8_t err=0;uint8_t humiCode[2]={0,0};uint8_t checkSum=0;StartSHT1XOperation(sht);WriteByteToSht1x(sht,HUMI_MEAS_COMMAND);sht->SDADirection(In);if((sht->statusReg&0x01)==0x01){sht->Delayms(20);}else{sht->Delayms(80);}if(sht->ReadSDABit() == 1){err += 1;}humiCode[0]=ReadByteFromSht1x(sht,Ack);humiCode[1]=ReadByteFromSht1x(sht,Ack);checkSum=ReadByteFromSht1x(sht,noAck);if(CheckCRC8ForSHT1x(humiCode,2,checkSum)){sorh=(humiCode[0]<<8)|humiCode[1];}else{err += 1;}if(err != 0){ResetSHT1XCommunication(sht);}else{humiValue=ConvertHumidityData(sht,sorh);}return humiValue;
}

2.2.4、状态寄存器操作

SHT1x的某些高级功能可以通过给状态寄存器发送指令来实现,如选择测量分辨率,电量不足提醒,使用OTP加载或启动加热功能等。SHT1x的状态寄存器可以读或者写。其实写状态寄存器就是配置设备的一些特性,一般情况下在初始化时完成即可。读写状态寄存器的格式如下:

/*读状态寄存器*/
static uint8_t ReadStatusRegister(Sht1xObjectType *sht)
{uint8_t err=0;uint8_t status;uint8_t checkSum;StartSHT1XOperation(sht);err=WriteByteToSht1x(sht,READ_STATUS_REGISTER);status=ReadByteFromSht1x(sht,Ack);checkSum=ReadByteFromSht1x(sht,noAck);if(CheckCRC8ForSHT1x(&status,1,checkSum)){sht->statusReg=status;}else{err+=1;}return err;
}/*写状态寄存器*/
static uint8_t WriteStatusRegister(Sht1xObjectType *sht,uint8_t *pValue)
{uint8_t err=0;StartSHT1XOperation(sht);err +=WriteByteToSht1x(sht,WRITE_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(GPIOB,GPIO_PIN_8,(GPIO_PinState)value);
}/*操作DATA引脚,设置高低操作*/
static void OperationDataPin(SHT1xPinValueType value)
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,(GPIO_PinState)value);
}/*读取DATA引脚位*/
uint8_t ReadDataPinBit(void)
{return (uint8_t)HAL_GPIO_ReadPin(GPIOB,GPIO_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 temperature=0.0;float humidity=0.0;float dewPoint=0.0;GetSht1xMeasureValue(&sht1x);temperature=sht1x.temperature;humidity=sht1x.humidity;dewPoint=sht1x.dewPoint;
}

4、应用总结

我们实现了SHT1X温湿度传感器的驱动,并使用这一驱动开发了简单的验证应用。所得到的结果与我们预期的结果是一致的,这说明我们的驱动开发没有问题。

在使用驱动程序时需要注意一点,对象有一个控制DATA总线引脚输入输出方向的操作。对于一般情况下我们编写引脚的输入输出方向控制函数,在初始化函数中将函数指针作为参数传入即可。如果硬件上可以配置为开漏输出,则可以不用单独控制引脚的输入输出方向。在初始化函数中以NULL作为参数输入。

关于通讯速率问题需要注意。在不同工作电压时所支持的最大通讯速率是不同的,但不论如何我都能支持到1MHz,所以没有特殊要求,电压的影响可以不用考虑。在我们的驱动中,最多能支持到500kHz,这主要是考虑到SHT1X的典型速度只有100k,而且大多数应用中不会有高速要求。

完整的源代码可在GitHub下载:https://github.com/foxclever/ExPeriphDriver

欢迎关注:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Modbus协议栈应用实例之一:Modbus RTU主站应用

自从开源了我们自己开发的Modbus协议栈之后&#xff0c;有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例&#xff0c;在这一篇中我们先来使用协议栈实现Modbus RTU主站的示例。 1、何为RTU主站 Modbus协议是…

uCOS-III应用开发笔记之一:uCOS-III在STM32的移植

uCOS-III实时操作系统在MCU平台被广泛使用&#xff0c;在这里我们将简单的记录如何将uCOS-III实时操作系统移植到目标平台上并运行。 1、必要的准备 在开始uCOS-III实时操作系统的移植前&#xff0c;我们还需要做一些必要的准备&#xff0c;如确定目标板、准备目标工程及uCOS…

外设驱动库开发笔记10:SHT2x系列温湿度传感器驱动

温湿度检测是嵌入式编程中经常应用到的一项功能。在我们的产品中亦经常使用。SHT2x系列温湿度传感器作为一种高精度低成本的集成模块&#xff0c;一直应用于我们的产品中。在这里我们讨论如何封装SHT2x系列温湿度传感器的驱动。 1、功能概述 SHT20配有一个全新设计的CMOSens芯…

Modbus协议栈应用实例之二:Modbus RTU从站应用

自从开源了我们自己开发的Modbus协议栈之后&#xff0c;有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例&#xff0c;这一篇中我们将使用协议栈实现一个Modbus RTU从站应用。 1、何为RTU从站 Modbus协议是一…

外设驱动库开发笔记11:SHT3x系列温湿度传感器驱动

在我们的产品中经常会遇到温湿度检测的需求。可以用于检测温湿度的传感器元件也有很多。我们经常使用的SHT各系列数字温湿度传感器来实现应用需求。在这里我们将设计并实现SHT3x系列温湿度传感器的驱动。 1、功能概述 SHT3x系列温湿度传感器是适用于各种应用的高品质湿度传感…

LwIP应用开发笔记之十:LwIP带操作系统基本移植

现在&#xff0c;TCP/IP协议的应用无处不在。随着物联网的火爆&#xff0c;嵌入式领域使用TCP/IP协议进行通讯也越来越广泛。在我们的相关产品中&#xff0c;也都有应用&#xff0c;所以我们结合应用实际对相关应用作相应的总结。 1、技术准备 我们采用的开发平台是STM32F407…

ThreadX应用开发笔记之一:移植ThreadX到STM32平台

现在一些小型系统中也往往有多任务处理的需求&#xff0c;这就为实时操作系统提供了用武之地。事实上国内外各种各样的RTOS有很多&#xff0c;而且基本都在走开源的路线&#xff0c;ThreadX也不例外&#xff0c;在这一篇中我们就来学习ThreadX初步应用并将其移植到STM32平台中。…

外设驱动库开发笔记12:TSEV01CL55红外温度传感器驱动

有时候我们需要检测一些无法直接接触的器件的温度。为了实现这一需求&#xff0c;我们通常会选择红外温度传感器来实现这一功能。考虑到复用的问题&#xff0c;我们一般会将操作元器件的代码抽象为驱动函数以备调用。这里我们就来设计并实现TSEV01CL55红外温度传感器的驱动。 …

FreeRTOS应用开发笔记之一:FreeRTOS在STM32的移植

FreeRTOS是如今在小型嵌入式领域应用比较广泛的一种实时操作系统。它是一种开源且免费的操作系统&#xff0c;而且移植和使用都非常的简单。在这里我们将学习并移植FreeRTOS。 1、必要的准备 工欲善其事&#xff0c;必先利其器&#xff0c;在开始学习和移植之前&#xff0c;相…

外设驱动库开发笔记13:MLX90614红外温度传感器驱动

红外温度传感器一般用于非接触式的温度检测。在我们的系统中经常会有这样的需求。所以我们将其设计为通用的驱动库以备复用。这一篇我们将讲述MLX90614红外温度传感器驱动的设计与实现。 1、功能概述 MLX90614是一种红外温度计&#xff0c;用于非接触式温度测量。红外测温是根…

Modbus协议栈应用实例之三:Modbus TCP客户端应用

自从开源了我们自己开发的Modbus协议栈之后&#xff0c;有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例&#xff0c;这一篇中我们将解说如何使用协议栈实现一个Modbus TCP客户端。 1、何为TCP客户端 Modbus…

Modbus协议栈应用实例之四:ModbusTCP服务器应用

自从开源了我们自己开发的Modbus协议栈之后&#xff0c;有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例&#xff0c;这一篇中我们来简述如何使用协议栈实现一个Modbus TCP服务器应用。 1、何为TCP服务器 Mo…

外设驱动库开发笔记14:DS18B20温度变送器驱动

在一时候我们需要相对简单的检测温度信号&#xff0c;而DS18B20就是一款功能和应用都相对简单的温度传感器&#xff0c;通过单线就可以实现检测温度信号的需求。这一篇我们就来实现操作DS18B20获取温度数据的驱动。 1、功能概述 DS18B20是常用的数字温度传感器&#xff0c;其…

Modbus协议栈应用实例之五:Modbus ASCII主站应用

自从开源了我们自己开发的Modbus协议栈之后&#xff0c;有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例&#xff0c;这一篇中我们来使用协议栈实现Modbus ASCII主站应用。 1、何为ASCII主站 我们知道Modbus…

Modbus协议栈应用实例之六:Modbus ASCII从站应用

自从开源了我们自己开发的Modbus协议栈之后&#xff0c;有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例&#xff0c;这一篇中我们来使用协议栈实现Modbus ASCII从站应用。 1、何为ASCII从站 我们知道Modbus…

外设驱动库开发笔记15:DHT11温湿度传感器驱动

与DS18B20一样DHT11也是采用单总线&#xff0c;但所不同的是DHT11可同时实现温度和湿度的检测。在我们的产品中经常使用它来检测环境的温湿度信息。这一篇我们将设计并封装DHT11的驱动程序&#xff0c;以方便重复使用。 1、功能概述 DHT11数字温湿度传感器是一款含有已校准数…

外设驱动库开发笔记16:MS5536C压力变送器驱动

压力检测也是经常会遇到的需求&#xff0c;比如环境压力或者低压气体等都会用到压力检测。这类检测压力都比较低&#xff0c;一般不会超过大气压&#xff0c;有时甚至是负压。这一篇我们要讨论的MS5536C就属于这类器件。接下来我们将设计并实现MS5536C的驱动。 1、功能概述 M…

外设驱动库开发笔记17:MS5803压力变送器驱动

很多时候我们需要检测被控对象的绝对压力&#xff0c;而且在我们的多款产品中也有这样的需求。当然检测绝对压力的传感器有很多&#xff0c;我们经常使用MS5803来实现压力检测。本篇中我们将设计并实现MS5803系列压力传感器的驱动。 1、功能概述 MS5803系列产品包含压阻传感器…

通讯接口应用笔记1:RS485通讯上下拉电阻的选择

RS485是一种常见的通讯接口方式&#xff0c;在我们的实际产品中也是多次使用。但我们平常并不会去过多考虑某一实现的细节问题&#xff0c;不过最近我们遇到了一个因如上下拉电阻的选择问题而造成的通讯故障&#xff0c;所以在这一片中我们来讨论一下RS485总线上下拉电阻的选择…

外设驱动库开发笔记18:MS5837压力变送器驱动

绝对压力的检测是常见的需求。在我们的系统中也常常会遇到。而MS5837压力传感器也是我们进场会采用的方案。在这篇里我们将讨论并实现MS5837压力传感器的驱动。 1、功能概述 MS5837压力传感器是一种可用于电路板上&#xff0c;适用于检测10-1200mbar压力范围的传感器&#xf…