传感器时序:关于MS8067传感器数据手册时序错误说明

2021/10/30 22:05 · 传感器知识资讯 ·  · 传感器时序:关于MS8067传感器数据手册时序错误说明已关闭评论
摘要:

传感器时序:关于MS8067传感器数据手册时序错误说明相关TE样品申请链接:相关TE解决方案资料下载链接:概述TEConnectivity的MeasurementSpecialtiesWeatherShield开发套件可提供必要的硬件,将下列

传感器时序:关于MS8067传感器数据手册时序错误说明  第1张

传感器时序:关于MS8067传感器数据手册时序错误说明

相关TE 样品申请链接:
相关TE 解决方案资料下载链接:
概述
TE Connectivity的Measurement Specialties Weather Shield开发套件可提供必要的硬件,将下列传感器连接到任何利用Arduino/Genuino兼容扩展端口进行I2C通信的系统:
HTU21D数字相对湿度传感器
MS5637数字大气压力传感器
TSYS01数字温度传感器
MS8607数字相对湿度和数字压力传感器
TSD305-1C55数字热电堆传感器
有64个插头孔焊盘,能够用于焊接外部器件,然后插在主板上进行测试。
原理图
板载
独立的压力、湿度和温度传感器
TE Connectivity Measurement Specialties HTU21D 的工作电压范围是1.5V至3.6V。MS8607非常适合用于嵌入紧凑型器件的气象站应用以及需要压力、湿度和温度监测的任何应用。
独立的压力和温度传感器
TE Connectivity Measurement Specialties MS5637 的工作电压范围是1.5V至3.6V。该传感器模块包括一个高线性度压力传感器和一个超低功耗24位δ-σ ADC,具有内部工厂校准系数。
独立的压力、湿度和温度传感器
TE Connectivity Measurement Specialties MS8607的工作电压范围是1.5V至3.6V。MS8607非常适合用于嵌入紧凑型器件的气象站应用以及需要压力、湿度和温度监测的任何应用。
独立的温度传感器 - TE Connectivity Measurement Specialties TSYS01 的工作电压范围是2.2V至3.6V。TSY01具有适用于功率敏感型应用的低功耗待机模式。
Arduino / Genuino库和示例源代码
相关产品
Arduino Zero开发板是由UNO平台衍生而来的32位扩展版本,旨在用于智能物联网设备、可穿戴技术等领域的创新型项目。Zero开发板具备更高的性能,并可用作出色的教学工具,用于学习如何开发32位应用程序。该开发板由Atmel SAMD21 MCU供电,其配备32位ARM CortexM0+内核。Atmel的嵌入式调试器 (EDBG) 设有完整的调试接口,无需其他硬件即可轻松进行软件调试。EDBG还支持虚拟的COM端口,可用于为设备编程,并具有引导加载功能。
Arduino INDUSTRIAL 101是一款用于Arduino 101 LGA模块的评估板,在基板上集成有ATmega32u4微控制器。该模块支持基于OpenWRT(名为LininoOS)的Linux发行版。该开发板还具有一个内置型WiFi(IEEE 802.11b/g/n工作速度高达150Mbps 1x1 2.4 GHz)和3个GPIO引脚(其中2个用作PWM输出)。该评估板的引脚排针上还设有4路模拟输入、USB和以太网信号,此外,还内置有一个直流/直流转换器。
Arduino UNO 第 3 次修订版微控制器板基于 Atmel ATmega328 8 位微控制器 (MCU),可用于连接 MEAS 天气扩展板。Arduino Uno 具有14个数字输入/输出引脚(其中六个可用作PWM输出)、6 路模拟输入和一个 16MHz石英晶体振荡器。UNO还包含一个USB接口、一个电源插孔、一个在线串行编程 (ICSP) 排针和一个复位按钮。
传感器时序:关于MS8067传感器数据手册时序错误说明  第2张

传感器时序:压力BMP180传感器时序详解

BMP180是一种高精度数字压力传感器,BMP180的超低功耗,低电压电子元件经过优化,适用于移动电话,PDA,GPS导航设备和户外设备。

UP=压力数据(16到19位) UT=温度数据(16位)

采用标准的I2C总线传输方式,在手册里面【BMP10手册点击打开链接】有流程图:开始-开始测量温度-等待4.5ms-读温度-开始测量压力-等待(看模式)-读压力-计算温度与压力单元

测量温度和压力

开始测量温度值UT和压力值UP的时序图如下所示。在启动后,主机发送器件地址写入,寄存器地址和控制寄存器数据。当接收到数据时,BMP180每8个数据位发送一个确认(ACKS)。主机在最后一次ACKS后发送停止条件。

程序为:

/写一个数据到BMP180
void BMP_WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite)
{
IIC_Start(); //发送起始信号
IIC_Send_Byte(0xEE); //芯片的地址+写信号
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(WriteAddr); //内部寄存器地址
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(DataToWrite);
IIC_Wait_Ack(); //等待应答
IIC_Stop(); //发送停止信号

}

为了读出温度数据字UT(16位),压力数据字UP(16到19位)和E2PROM数据如下进行:

在启动后,主机发送模块地址写入命令和寄存器地址。寄存器地址选择读取寄存器:E2PROM数据寄存器0xAA至0xBF温度或压力值UT或UP 0xF6(MSB),0xF7(LSB),可选0xF8(XLSB)然后,主设备发送重启条件,然后读取模块地址,BMP180(ACKS)将对其进行确认。BMP180首先发送8个MSB,由主设备(ACKM)确认,然后是8个LSB。主机发送“不确认”(NACKM),最后发送停止条件。时序为:

//从BMP180读一个字节数据
uint8_t BMP_ReadOneByte(uint8_t ReadAddr)
{
uint8_t data=0;
IIC_Start(); //发送起始信号
IIC_Send_Byte(0xEE); //芯片的地址+写信号
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(ReadAddr); //内部寄存器地址
IIC_Wait_Ack(); //等待应答
IIC_Start(); //发送起始信号
IIC_Send_Byte(0xEF);?//地址+读信号
IIC_Wait_Ack(); //等待应答
data=IIC_Read_Byte(1);
IIC_Stop(); //发送停止信号
return data;

}

//从BMP180读一个16位的数据
short BMP_ReadTwoByte(uint8_t ReadAddr)

{

short data;

uint8_t msb,lsb;

IIC_Start();
//发送起始信号

IIC_Send_Byte(0xEE); //
芯片的地址+写信号

IIC_Wait_Ack();
//等待应答

IIC_Send_Byte(ReadAddr);

IIC_Wait_Ack();
//等待应答

IIC_Start();? //
发送起始信号

IIC_Send_Byte(0xEF);?//
地址+读信号

IIC_Wait_Ack();
//等待应答

msb=IIC_Read_Byte(1);

lsb=IIC_Read_Byte(0);

IIC_Stop();
//发送停止信号

data=msb*256 + lsb;

return data;

}

下图显示了压力和温度测量的详细算法。

//从BMP180的获取计算参数
void BMP_ReadCalibrationData(void)
{
bmp180.AC1=BMP_ReadTwoByte(0xAA);
bmp180.AC2=BMP_ReadTwoByte(0xAC);
bmp180.AC3=BMP_ReadTwoByte(0xAE);
bmp180.AC4=BMP_ReadTwoByte(0xB0);
bmp180.AC5=BMP_ReadTwoByte(0xB2);
bmp180.AC6=BMP_ReadTwoByte(0xB4);
bmp180.B1?=BMP_ReadTwoByte(0xB6);
bmp180.B2?=BMP_ReadTwoByte(0xB8);
bmp180.MB?=BMP_ReadTwoByte(0xBA);
bmp180.MC?=BMP_ReadTwoByte(0xBC);
bmp180.MD?=BMP_ReadTwoByte(0xBE);
}
//从BMP180读取未修正的温度
long BMP_Read_UT(void)
{
long temp=0;
BMP_WriteOneByte(0xF4,0x2E);
delay_ms(5);
temp=(long)BMP_ReadTwoByte(0xF6);
return temp;
}
//从BMP180读取未修正的大气压
long BMP_Read_UP(void)
{
long pressure=0;
BMP_WriteOneByte(0xF4,0x34);
delay_ms(5);
pressure=(long)BMP_ReadTwoByte(0xF6);
//pressure=pressure + BMP_ReadOneByte(0xf8);
pressure &=0x0000FFFF;
return pressure;

}

//用获取的参数对温度和大气压进行修正,并计算海拔
void BMP_UncompemstatedToTrue(void)
{
bmp180.UT=BMP_Read_UT();//第一次读取错误
bmp180.UT=BMP_Read_UT();//进行第二次读取修正参数
bmp180.UP=BMP_Read_UP();
bmp180.X1=((bmp180.UT - bmp180.AC6) * bmp180.AC5) >> 15;
bmp180.X2=(((long)bmp180.MC) << 11) / (bmp180.X1 + bmp180.MD); bmp180.B5=bmp180.X1 + bmp180.X2; bmp180.Temp?=(bmp180.B5 + 8) >> 4;
bmp180.B6=bmp180.B5 - 4000;
bmp180.X1=((long)bmp180.B2 * (bmp180.B6 * bmp180.B6 >> 12)) >> 11;
bmp180.X2=((long)bmp180.AC2) * bmp180.B6 >> 11;
bmp180.X3=bmp180.X1 + bmp180.X2;
bmp180.B3=((((long)bmp180.AC1) * 4 + bmp180.X3) + 2) /4;
bmp180.X1=((long)bmp180.AC3) * bmp180.B6 >> 13;
bmp180.X2=(((long)bmp180.B1) *(bmp180.B6*bmp180.B6 >> 12)) >>16;
bmp180.X3=((bmp180.X1 + bmp180.X2) + 2) >> 2;
bmp180.B4=((long)bmp180.AC4) * (unsigned long)(bmp180.X3 + ) >> 15;
bmp180.B7=((unsigned long)bmp180.UP - bmp180.B3) * ;
if(bmp180.B7 < 0x80000000) { bmp180.p=(bmp180.B7 * 2) / bmp180.B4; } else { bmp180.p=(bmp180.B7 / bmp180.B4) * 2; } bmp180.X1=(bmp180.p >> 8) * (bmp180.p >>8);
bmp180.X1=(((long)bmp180.X1) * 3038) >> 16;
bmp180.X2=(-7357 * bmp180.p) >> 16;
bmp180.p=bmp180.p + ((bmp180.X1 + bmp180.X2 + 3791) >> 4);
bmp180.altitude= * (1-pow(((bmp180.p) / .0),(1.0/5.255)));

}

【本文参阅点击打开链接】

传感器时序:关于MS8067传感器数据手册时序错误说明  第3张

传感器时序:基于STM32的温湿度DHT11传感器时序详解

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。 它应用专用的数字模块采集技术和温湿度传感技术, 确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。 单线制串行接口, 使系统集成变得简易快捷。超小的体积、极低的功耗, 信号传输距离可达20米以上, 使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。 连接方便, 特殊封装形式可根据用户需求而提供。

采集范围:温度0-50°±2°,湿度:20-90%RH。

采用单总线双向串行通信协议,每次采集都要由单片机发起开始信号,然后DHT11会向单片机发送响应并开始传输40位数据帧,高位在前。数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验位,温湿度小数部分默认为0,即单片机采集的数据都是整数,校验位为4个字节的数据相加取结果的低8位数据作为校验和:

DHT11通信时序:
单片机完成一次采集过程:主机或者单片机需要发送一个开始信号给DHT11传感器:主机先将IO设置为输出,然后主机拉低总线(时间需要大于18ms)后设置为输入并释放数据总线,等待从机(DHT11)响应,主机开始的信号时序为:

如果传感器正常且存在,则会在收到主机的开始信号后拉低总线并持续80us来通知主机此时传感器正常,然后拉高总线80us,通知主机准备接收,响应的时序为:

接着传感器开始按照高位在前的顺序将数据按照如下的格式,一位一位的输出给主机:

程序要区分数据0和数据1的格式:先判断此时引脚的电平状态,如果是低电平就一直循环等待,直到高电平出现,高电平出现后延时40us,并读取延时后的电平状态,如果此时是高电平,则数据为1,否则为0传输完40位数据后,传感器再次输出一个50us的低电平后,将数据总线释放,采集过程结束。

DHT11 的时序编写一般可以分为五个步骤,其后依次介绍五大步骤和一个汇总。

步骤一:DHT11 上电后(DHT11 上电后要等待 1S 以越过不稳定状态在此期间不能发送任何指令),测试环境温湿度数据,幵记录数据,同时 DHT11 的 DATA 数据线由上拉电阻拉高一直保持高电平;此时 DHT11 的DATA 引脚处于输入状态,时刻检测外部信号。

步骤二:微处理器的 I/O 设置为输出同时输出低电平,且低电平保持时间不能小于 18ms,然后微处理器的 I/O设置为输入状态,由于上拉电阻,微处理器的 I/O 即 DHT11 的 DATA 数据线也随之变高,等待 DHT11 作出回答信号。

步骤三:DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA引脚处于输出状态,输出 80 微秒的低电平作为应答信号,紧接着输出 80 微秒的高电平通知外设准备接收数据,微处理器的 I/O 此时处于输入状态,检测到 I/O 有低电平(DHT11 回应信号)后,等待 80 微秒的高电平后的数据接收。

步骤四:由 DHT11 的 DATA 引脚输出 40 位数据,微处理器根据 I/O 电平的变化接收 40 位数据,位数据“0”的格式为: 50 微秒的低电平和 26-28 微秒的高电平,位数据“1”的格式为: 50 微秒的低电平加 70微秒的高电平。

步骤五:结束信号,DHT11 的 DATA 引脚输出 40 位数据后,继续输出低电平 50 微秒后转为输入状态,由于上拉电阻随之变为高电平。但 DHT11 内部重测环境温湿度数据,幵记录数据,等待外部信号的到来。

最后按照芯片手册的步骤时序对子函数进行一定顺序的配置。

注意:
在编写DHT11的时序过程中,由于主机配置为输入端口,接收数据的时间较短,只有几十us,故不能在读取数据的时候加入 printf(),会影响的时序,原因是 printf()本身的运行不止几十us。

传感器时序:温度传感器时序

关于DS18B20温度传感器的时序详解及代码分析
简要说明测温工作**:**DS18B20的核心功能是它的直接读数字的温度传感器。温度传感器的精度为用户可编程的9,10,11或12位,分别以0.5℃,0.25℃,0.125℃和0.0625℃增量
递增。在上电状态下默认的精度为12位(所以最后获取的数据要乘以0.0625得到实际温度)。DS18B20启动后保持低功耗等待状态;
当需要执行温度测量(和AD转换)时,总线控制器必须发出[44h]命令。在那之后,
产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中(所以后期获取数据时,必须连续读取两次数据),下面介绍时序及相应代码(以12MHz的晶振为例,数据线定义为DQ)
,其中DS18B20的所有通信都是以由复位脉冲组成的初始化序列开始的,并采用的是单总线协议。
操作顺序:初始化——>写相应的控制指令(用写数据函数完成)——>读取DS18B20所采集到的数据(用读数据函数完成)———>把采集的数据转化成实际的温度。

延时函数: (15+15*z)us 的延时

*时序图及代码分析如下:*

一、初始化(见下图)

在初始化序列期间,总线控制器拉低总线并保持480us(改延时可以在480~960us之间,但需要在480us以内释放总线)以发出一个复位脉
冲,然后释放总线,进入接收状态(等待DS18B20应答)。总线释放后,单总线由上拉电阻拉到高电平。当DS18B20探测到I/O引脚上的上升沿后,等待15-60us,然后其以拉低总线60-240us的方式发出存在脉冲。至此,初始化时序完毕。

初始化代码:
带返回值,有利于检验。

初始化代码写至此,其实我们便可以用数码管显示来检验初始化是否成功(即DS18B20有应答),数码管显示”0“,初始化失败,显示”1“,则初始化成功。

二、DS18B20的写时序(见下图):
主机在写时隙向DS18B20写入数据,其中分为写”0”时隙,和写”1”时隙。总线主机使用写“1”时间隙向DS18B20写入逻辑1,使用写“0”时间隙向DS18B20写入逻辑0.所有的写时隙必须有最少60us的持续时间,相邻两个写时隙必须要有最少1us的恢复时间。两种写时隙都通过主机拉低总线产生(见下图)为了产生写1时隙。
在拉低总线后主机必须在15μs内释放总线。在总线被释放后,由于上拉电阻将总线恢复为高电平。为了产生写”0”时隙,在拉低总线后主机必须继续拉低总线以满足时隙持续时间的要求(至少60μs)。
在主机产生写时隙后,DS18B20会在其后的15~60us的一个时间段内采样单总线(DQ)。在采样的时间窗口内,如果总线为高电平,主机会向DS18B20写入1;如果总线为低电平,主机会向DS18B20写入0。
综上所述,所有的写时隙必须至少有60us的持续时间。相邻两个写时隙必须要有最少1us的恢复时间。所有的写时隙(写0和写1)都由拉低总线产生。

DS18B20的写时序代码
写字节函数、由低位至高位,向DS18B20写入一个字节的数据。
无返回值。
形参byte是待写入的字节数据,读取8次,移位8次,保证每位都传输至DQ

三、DS18B20的读时序(见下图)
主机发起读时序时,DS18B20仅被用来传输数据给控制器。因此,总线控制器在发出读暂存器指令[0xBE]或读电源模式指令[0xB4]后必须立刻开始读时序,DS18B20可以提供请求信息。除此之外,总线控制器在发出发送温度转换指令[0x44] (或召回EEPROM指令[0xB8])之后读时序,详见DS18B20 的芯片手册上的功能指令。
所有读时序必须最少60us,包括两个读周期间至少1us的恢复时间。当总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持1us,然后总线被释放。DS18B20 通过拉高或拉低总线上来传输”1”或”0”。当传输逻辑”0”结束后,总线将被释放,通过上拉电阻回到上升沿状态。从DS18B20输出的数据在读时序的下降沿出现后15us 内有效。因此,总线控制器在读时序开始后必须停止把I/O口驱动为低电15us,以读取I/O口状态。

DS18B20的读时序的代码
读字节函数、由低位至高位,读取DS18B20所采集到的数据。
带返回值,可结合前面的写时序,对写、读数据函数进行检验(后面会提到检验过程及效果)
byte 是读取到的字节数据。其中,此函数读取8次,移位7次(实际移位8次)

下面简单说说如何检验写、读时序的程序:
检验写、读的程序,本人采用DS18B20中特有的64位光刻ROM存储器(其中涉及一些指令,具体请见芯片的数据手册)。数据手册上说明,“64位光刻ROM的排列是:开始(最低)8位是产品类型标号,对于DS18B20来说都是(28H),接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

因为写函数刚好是从最低位开始读,所以我们先:
调用函数:DS18B20_write_byte(0xcc);
接着再调用函数:DS18B20_read_byte();
用数码管,或者液晶,将读函数的返回值显示出来,正确的显示应该为:40。
这样,我们便能确定我们的写,读函数的正误了。

您可能感兴趣的文章

本文地址:https://www.ceomba.cn/621.html
文章标签: ,  
版权声明:本文为原创文章,版权归 ceomba 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!