因科研中需要测量温度和湿度,自制了一个温湿度传感器。传感芯片采用的是SHT35,单片机为STM32F103ZET6。工作原理很简单,通过I2C接口向芯片发送指令和采集数据,然后通过USART发送到上位机。先来了解一下传感器。
图1. 传感器内部功能模块框图
传感器的功能框图如图1所示。内部有一个16位的ADC负责采集温度和湿度传感器的数据,然后通过校准和线性化处理,通过I2C接口与外部通信。整个模块有7个功能引脚:
引脚名称 | 功能说明 |
nRESET | 硬件复位。输入低电平复位;不用时可浮空或通过>2KΩ电阻接到VDD。 |
VDD | 电源正极。接2.15-5.5V,通常接3.3V。 |
VSS | 电源负极。接地。 |
Alert | 报警引脚。温湿度超过限定值时可输出报警信号。不用时必须浮空。 |
SCL | 时钟引脚。接主I2C模块同名引脚。 |
SDA | 数据引脚。接主I2C模块同名引脚。 |
ADDR | 地址引脚。通过该引脚电平高/低,选择模块的通信地址。不能浮空。 |
图2. 传感器芯片典型接线图。
典型接线图如图2所示。R引脚是个空引脚,无电气功能。VDD必须通过一个100nF的电容接地。SCL和SDA需要通过上拉电阻接到VDD。从网上买的焊接好的模块(右下角所示),只引出了6个引脚,nRESET被直接连到了VDD,SCL和SDA的两个上拉电阻均为10kΩ的贴片电阻。另外,Alert引脚也通过一个贴片电容接地,ADDR引脚接了一个10k欧的下拉电阻。模块到手价53,还是比价厚道的价格,SHT35价格还是比较高,零售价在30元上下。
SHT35是I2C接口。工作原理很简单:MCU的I2C设为Master,芯片的I2C作为Slave,每次读写前,Master首先向Slave发送地址,收到确认信号后再发送(设置、测量、读取等)指令。对读取指令返回的原始数据进行处理、显示或发送到上位机。
根据芯片手册,SHT35有两个地址:ADDR引脚接低电平时,默认地址是0x44;ADDR接高电平时,地址是0x45。这种设计使得多个芯片可以连接到同一条总线上工作,通过ADDR引脚(接GPIO)进行片选。这款芯片采用的是I2C的7-bit地址标准,以ADDR接地为例:写入请求时须将地址左移1位,末位为0,即0x44<<1U;读取请求时,须左移1位然后将末位置1,即(0x44<<1U) | 0x1。这个细节极其重要,否则会因地址错误,传感器无应答。
SHT35带CRC校验,所有指令都自带CRC。从机发送数据时,都会计算CRC。完整的读取温度和湿度信息需要6个字节:前2个字节为温度原始数据,第3个为温度数据的CRC,第4-5个字节为湿度原始数据,第6个字节为湿度数据的CRC。如果不需要CRC,软件中可以不进行CRC校验,但发送端是一定会计算CRC的。
所谓的读写指令,就是芯片厂商设计好的一组16位代码。常用指令代码及功能如下:
图3. 单次测量指令
所谓单次测量(Single shot)模式,就是发一次指令,读一次数据。根据主I2C是否开启时钟延长,和测量可靠性高、中、低(平均次数)不同,共有6组指令。如图3所示。
图4. 周期性测量指令
所谓周期性测量(Periodic data acquisition)模式,就是发一次测量指令,可以周期性地读取数据。根据可靠性和测量频率不同,共有15组指令。如图四所示。
周期性测量模式下,发送测量指令后,每次读取数据前必须发送0xE000指令。周期测量模式下,可以发送ART指令0x2B32进行加速,该指令会强制芯片以4Hz的速度获取数据。
退出周期模式,需发送Break指令0x3093。退出后会芯片回到单次测量模式。
软件复位指令:0x30A2。该指令使芯片控制器复位并重新加载校准数据。
加热器开/关指令:0x306D/0x3066。内部加热器,仅供芯片测试使用。
状态读取指令:0xF32D。SHT35内置了一个16bit状态寄存器。该指令用来读取状态寄存器查询工作状态。
状态寄存器复位指令:0x3041。清除所有状态位(置0)。
另外,还有预警阈值设置等。详见手册或官方例程(shx.h),不再赘述。
搞懂了硬件的工作原理,接下来基于HAL库编写驱程。详见:
留言与评论(共有 0 条评论) “” |