精华内容
下载资源
问答
  • 常用传感器工作原理
    千次阅读
    2020-07-31 17:18:50

    压电效应是压电压力传感器的主要工作原理,压电传感器不能用于静态测量,因为经过外力作用后的电荷,只有在回路具有无限大的输入阻抗时才得到保存。实际的情况不是这样的,所以这决定了压电传感器只能够测量动态的应力。
           压电传感器主要应用在加速度、压力和力等的测量中。压电式加速度传感器是一种常用的加速度计。它具有结构简单、体积小、重量轻、使用寿命长等优异的特点。压电式加速度传感器在飞机、汽车、船舶、桥梁和建筑的振动和冲击测量中已经得到了广泛的应用,特别是航空和宇航领域中更有它的特殊地位。压电式传感器也可以用来测量发动机内部燃烧压力的测量与真空度的测量。也可以用于军事工业,例如用它来测量枪炮子弹在膛中击发的一瞬间的膛压的变化和炮口的冲击波压力。它既可以用来测量大的压力,也可以用来测量微小的压力。
           现在压电效应也应用在多晶体上,比如现在的压电陶瓷,包括钛酸钡压电陶瓷、PZT、铌酸盐系压电陶瓷、铌镁酸铅压电陶瓷等等。
           压电传感器中主要使用的压电材料包括有石英、酒石酸钾钠和磷酸二氢胺。其中石英(二氧化硅)是一种天然晶体,压电效应就是在这种晶体中发现的,在一定的温度范围之内,压电性质一直存在,但温度超过这个范围之后,压电性质完全消失(这个高温就是所谓的“居里点”)。由于随着应力的变化电场变化微小(也就说压电系数比较低),所以石英逐渐被其他的压电晶体所替代。而酒石酸钾钠具有很大的压电灵敏度和压电系数,但是它只能在室温和湿度比较低的环境下才能够应用。磷酸二氢胺属于人造晶体,能够承受高温和相当高的湿度,所以已经得到了广泛的应用。

    更多相关内容
  • 常用传感器工作原理磁电式PPT课件.pptx
  • 常用传感器工作原理电涡流式PPT课件.pptx
  • 常用传感器工作原理电涡流式PPT学习教案.pptx
  • 常用传感器工作原理压电式PPT学习教案.pptx
  • 常用传感器工作原理磁电式PPT学习教案.pptx
  • 无刷直流电机大多以霍尔元件、光电码盘或其他位置检测元件作为位置传感器,但当电机的尺寸小到一定程度时,使用位置传感器的弊病就比较明显。因此,在小型和轻载起动条件下,无位置传感器无刷直流电机成为理想的选择...
  •  为了测量并计算这些物理量,便产生了加速度传感器。 加速度传感器  加速度传感器是一种能够测量加速力,将加速度转换为电信号的电子设备。加速力就是当物体在加速过程中作用在物体上的力,就好比...
  • 汽车技术的发展,使得越来越多的...下面,小编来和大家分享一些汽车传感器类型,并针对这些不同性能的传感器它的工作原理,来告诉大家它在汽车中是用在什么地方,具体是怎么操作的,并且它在整个系统中有什么样的作用。
  • 其广泛应用于各种工业自控环境,涉及水利水电、铁路交通、智能建筑、生产自控、航空航天、军工、石化、油井、电力、船舶、机床、管道等众多行业,下面就简单介绍一些常用传感器原理及其应用。  力学传感器的种类...
  • 无刷直流电机大多以霍尔元件、光电码盘或其他位置检测元件作为位置传感器,但当电机的尺寸小到一定程度时,使用位置传感器的弊病就比较明显。因此,在小型和轻载起动条件下,无位置传感器无刷直流电机成为理想的选择...
  • 第3章常用传感器工作原理及应用.doc
  • 压力传感器是工业实践中最为常用的一种传感器,而我们通常使用的压力传感器主要是利用压电效应制造而成的,这样的传感器也称为压电传感器。今天文章就为大家介绍一下压力传感器工作原理
  • 电位器通常用来作为内部反馈传感器,以检测关节和连杆的位置。光源(LED)会向接收器(光电二极管)发出光束,光源和接收器都安装在旋转连接轴承的静止部位,编码器是一个带有透明小窗的遮光圆盘,被安装在轴承的...


    一、常用传感器及其原理

    1.位置传感器

    (1)电位器
    电位器通过电阻把位置信息转化为随位置变化的电压。

    示意图和公式如下

    示意图
    公式
    电位器通常用来作为内部反馈传感器,以检测关节和连杆的位置。

    2.编码器

    光源(LED)会向接收器(光电二极管)发出光束,光源和接收器都安装在旋转连接轴承的静止部位,编码器是一个带有透明小窗的遮光圆盘,被安装在轴承的转动部分。
    当轴承转动时,编码器会让光束交替通过(通过小窗)。光电二极管则随着位置的变化输出对应的高电平或低电平信号,光电二极管的输出可以通过专门的电路转化为位置和速率信息,达到了编码的作用。
    编码器
    (1)增量式编码器
    透光和不透光的弧段尺寸相同且交替出现。
    增量式编码器就像积分器,它仅能检测角位置的变化。
    增量式编码器只能告诉我们移动了多少。
    进行位置跟踪的系统中,都必须在系统开始时进行复位
    (2)绝对式编码器
    绝对式编码器的每个位置都对应着透光和不透光弧段的唯一组合,这种确定组合有唯一的特征。
    在这里插入图片描述

    3.传输时间测量(磁反射)型位移传感器

    通过导体发射脉冲,当其遇到磁体就返回来,机器人中的位移传感器就是这种类型。根据传播时间计算出位置信息。

    4.速度传感器

    (1)使用测速计
    (2)位置信号求微分
    位置信号中噪声较小,对它进行微分来求速度信号。
    相反,对速度信号求积分可得位置信号。

    5.力和压力传感器

    (1)压电晶体:压电材料在施加一定电压时将会收缩,而在受到挤压时将会产生一定的电压。
    (2)力敏电阻:其阻值随垂直施加在表面的力的增加而降低。
    (3)应变片:用于测量力,应变片的输出是与其形变成正比的阻值,而形变本身又与施加的力成正比。

    6.力矩传感器

    在轴上安装两个力传感器,在相反的面上将它们方向相反的放置。如果在轴上施加力矩,力矩将在轴上产生两个方向相反的力和两个方向相反的形变。

    7.可见光和红外传感器

    这些传感器的电阻随着投射在其上面光强的变化而改变。入射的光强为零,电阻就最大。光强越大,电阻就越小,相应流过的电流就越大。
    光敏电阻,当光强超过一定程度时,它就会导通,否则就断开。
    光传感器对光敏感,红外传感器对红外光敏感。如果需要用光测量一段长的距离来进行导航,就可以使用红外线,这样不会干扰人的注意或影响任何人。

    8.接触和触觉传感器

    接触传感器:最简单的是微动开关,接触发生时就接通或者断开。
    触觉传感器:很多接触传感器的组合,可以提供有关接触物体的更多信息。

    9.接近觉传感器

    探测两个物体接触之前一个物体靠近另一个物体。
    (1)磁感应接触觉传感器
    (2)光学接近觉传感器
    (3)超声波接近觉传感器

    10.测距仪

    (1)超声波测距仪
    优点:系统结构坚固,简单,廉价,并且能耗低
    缺点:分辨率和最大工作距离受限,背景噪声过高会影响超声波设备工作。
    通过测量传输时间进行测距。
    (2)光测距仪
    常用的是三角法
    在这里插入图片描述

    11.嗅觉传感器

    12.味觉传感器

    13.视觉系统

    展开全文
  • 温度传感器(temperature transducer)是指能感受温度并转换成可用输出信号的传感器。...但对于运动体、小目标或热容量很小的对象则会产生较大的测量误差,常用的温度计有双金属温度计、玻璃液体温度计、压力式
  • 接近开关传感器工作原理doc,接近开关传感器工作原理
  • 汽车技术的发展,使得越来越多的元器件用到...下面将介绍一些汽车传感器类型,并针对这些不同性能的传感器它的工作原理,来告诉大家它在汽车中是用在什么地方,具体是怎么操作的,并且它在整个系统中有什么样的作用。
  • 速度传感器工作原理

    2021-06-30 15:59:51
    单位时间内位移的增量就是速度。速度包括线速度和角速度,与之相对应的就有线速度传感器和角速度传感器,我们都统称为速度传感器
  • 压力传感器是工业实践中为常用的一种传感器,其广泛应用于各种工业自控环境,涉及水利水电、铁路交通、智能建筑、生产自控、航空航天、军工、石化、油井、电力、船舶、机床、管道等众多行业。并且在不同环境下,需要...
  • 其广泛应用于各种工业自控环境,涉及水利水电、铁路交通、智能建筑、生产自控、航空航天、军工、石化、油井、电力、船舶、机床、管道等众多行业,下面就简单介绍一些常用传感器原理及其应用。  力学传感器的种类...
  • 其广泛应用于各种工业自控环境,涉及水利水电、铁路交通、智能建筑、生产自控、航空航天、军工、石化、油井、电力、船舶、机床、管道等众多行业,下面就简单介绍一些常用传感器原理及其应用。
  • CMOS图像传感器工作原理

    千次阅读 2020-07-05 21:51:01
    首先来看下CMOS图像传感器长啥样: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200705212212158.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4...

    首先来看下CMOS图像传感器长啥样:

    在这里插入图片描述
    我们知道计算机不能处理模拟信号,只能处理数字信号,所以现实世界的光影也不能直接被计算机处理,要记录数字影像,那么我们必须把真实的影像通过数字化转变为计算机能读取写入的格式。因此我们就需要一种东西,能够把光信号转换为电信号,这也就是 CCD 和CMOS 的由来,由于成本和功耗等等原因我们现在看到的数字相机和手机都是 CMOS, 具体原因展开太麻烦所以也就不详细说了。

    每一个 CMOS 像素都包括感光二极管(Photodiode)、浮动式扩散层(Floating diffusion layer)、传输电极门 (Transfer gate)、起放大作用的MOSFET、起像素选择开关作用的M0SFET.在 CMOS 的曝光阶段,感光二极管完成光电转换,产生信号电荷,曝光结束后,传输电极门打开,信号电荷被传送到浮动式扩散层,由起放大作用的MOSFET电极门来拾取,电荷信号转换为电压信号。所以这样的 CMOS 也就完成了光电转换、电荷电压转换、模拟数字转换的三大作用,通过它我们就能把光信号转化为电信号,最终得到数字信号被计算机读取,这样,我们就已经拥有了记录光线明暗的能力,但这还不够,因为我们需要色彩。

    在这里插入图片描述
    现代彩色CMOS 的原理也很简单,直接在黑白图像传感器的基础上增加色彩滤波阵列(CFA),从而实现从黑白到彩色的成像。很著名的一种设计就是Bayer CFA(拜耳色彩滤波阵列)。一个很有趣的事就是,我们用来记录光影的 CMOS, 和我们用来输出光影的显示器,原理也刚好是向相反的,CMOS 把光转化为电信号最后以数字格式记录,显示器把解码的数字格式从电信号重新转化为光。光电之间的转换也就构成了我们人类数字影像的基础。好了回到正题,为什么是 RGB 三种颜色?为什么 G 的占比要高于 R 和 B 呢?
    在这里插入图片描述
    这是因为人视网膜上的感光细胞分为两种:视锥细胞和视杆细胞,分别对应人眼的明视觉和暗视觉。视锥细胞又分三种:红色感光细胞、绿色感光细胞、蓝色感光细胞,它们对照明的明暗条件敏感度较低,只有当光照强度达到一定条件锥细胞才能够起作用。视杆细胞对光照的敏感度较高,可以在光照条件很暗的情况下对景物成像,却不能感受颜色。这也解释了为什么在晚上的时候人仍然能够看到物体,却不能有效地分辨物体的颜色的现象跟颜色有关的三种视锥细胞,每一种都对 RGB 三种颜色最敏感。

    在这里插入图片描述
    注意,是最敏感,所以蓝视锥细胞不仅能感应蓝色,也可以感应到绿和一部分红色,绿视锥细胞不仅能感应绿,也可以感应一部份蓝和红,最后红视锥细胞也是如此。所以通过三种视锥细胞感应到不同波长光谱的比例,人类就能识别出视觉上除了红绿蓝之外的其他颜色。

    在这里插入图片描述
    人造的大部分显示器,也都是利用这个特性来欺骗人类看到红绿蓝之外的颜色,比如上图就是我的显示器在显示黄色时实际发出的光谱,根本就没有黄色,这就是一个骗子显示器,但是通过对人眼视觉特性的利用,我们看到的就是黄色。1931年,CIE(国际标准照明委员会)建立了一系列表示可见光谱的颜色空间标准,定义了CIE-RGB基色系统。规定了RGB系统的三原色光波长分别为700nm,546.1nm,435.8nm的红光(R)、绿光(G)、蓝光(B)。

    在这里插入图片描述
    通过混色实验可以得到上图的一组曲线,它们表示在 380nm-780nm 范围 内当各个光谱能量一样时,某一波长的光谱色与

    在这里插入图片描述
    混色结果一样,并称这三条曲线为 CIE1931 RGB 系统光谱三刺激值曲线,这与后文中我们要提到的标定有很大关系。
    在这里插入图片描述
    这还可以延伸一下,由于计算颜色三刺激值时会出现负值,所以 CIE 又设计出了一套 CIE-XYZ 系统,用 X, Y, Z 来代表红绿蓝三原色,上图也就是 CIE1931 XYZ 系统光谱三刺激值曲线。
    在这里插入图片描述
    著名的 CIE 1931 xy 色度图也就是从此而来,我们可以用它描述出任意的一种人眼可见色彩。当然后来为了更精确的修正,还有 CIE 1976 u’v 色度图,我们的很多评测也都使用了这个标准。因此,在理论上只需要记录 RGB, 也就能还原出我们眼睛看到的所有颜色了。
    好了我们回到滤镜颜色的问题上。对于基于 Bayer CFA 的设计,当我们拍摄右侧图 1 的场景时,CMOS 所有像素传回来的图像直接组合的结果就是右侧图 2, 当我们将滤镜颜色加到像素上会得到图 3, 很明显这也不应该是我们最后看到的图像。所以由 3 到 4 的过程,就需要插值算法来补足。

    在这里插入图片描述
    对于 Bayer CFA 设计的 CMOS, 有常用的插值算法,比如相邻像素插值、双线性插值、三次多项式插值等,它们的目的都是为了还原出全部的 RGB 三个通道分量,比如双线性插值就是这么算的:对于只有红色分量的像素:例如 R32:
    在这里插入图片描述
    通过还原得到完整的 RGB 分量,我们就能得到一幅没有缺损的图像了,但是这就是终点了吗?并不是,我们不能直接把这样的图像存储,因为这其中有一个很重要的问题:Bayer CFA 经过插值之后,CFA 的色特性与人眼的视觉特性并不一定重合,所以图像中的像素颜色可能都是偏色的,这里可能是光学透镜的光谱特性导致,也可能是 Bayer CFA 上的彩色滤镜光谱特性导致,跟拍摄的环境光也有很大关系。所以还有一步,那就是校正标定。校正标定之中最重要的则是伽马校正和颜色校正,先看伽马校正:在现实世界中,几乎所有的显示器、摄影胶片以及很多电子照相机的光电转换特性都是非线性的。这些非线性部件的输出与输入之间的关系通常用幂函数表示。理想状态下,色彩强度 (Intensity)与电子束的电压信号之间成线性关系,但实际情况刚好想法,色彩强度与输入的电压信号之间是非线性关系。显示器的输出强度和输出电压的响应大致成幂指数关系,下方式子表示输出的强度随着输入电压的增长成指数增长,通常我们就把这个幂指数称为伽马(Gamma):

    在这里插入图片描述
    为了使图像在显示器上的效果和实际情形更为接近,在摄像机获取图像后,必须进行伽马校正,把上边式子的非线性关系校正为线性关系:

    在这里插入图片描述
    其中,是经过校正处理后的图像的像素值;是没有经过校正的像素值;伽马值γ表示校正的程度,γ=1 时,不进行校正,γ值越大,像素灰度值的校正程度越大。颜色校正:由于不同厂家在制造 CMOS 时使用的彩色滤光片不同,CMOS 对不同波段的光电响应度不同,都会导致相机的光谱响应曲线不同,比如这是某一个 CMOS 的光谱相应曲线:

    在这里插入图片描述
    很容易的就会发现彩色相机 RGB 三刺激值曲线图和之前我们提到过的 CIE 1931-RGB 系统有很大差别。
    想减小这种差异,就要对原始图像的像素灰度值(R,G,B)进行必要的补偿,带来和人眼感知相近的颜色,这其中的工作就是颜色标定。好了,铺垫了这么久,终于讲到那当我们把 RGGB 换成 RYYB, 用黄色滤镜替代绿色会怎么样了。

    在这里插入图片描述
    黄光的光谱主波是 570-590 纳米,刚好被夹在红绿主波之间,所以只要彩色滤镜的光谱特性设计得足够好,那么理论上黄色也就能记录红+绿。

    在这种非常理想的条件下,RYYB 的感光总量肯定可以超过 RGGB, 不过这也给插值算法补全 RGB 的那一步带来了一定困难,插值不理想的话后期色彩标定也会出现问题。
    在这里插入图片描述
    转自:https://tech.qudong.com/2019/0402/558867.shtml

    展开全文
  • 气体传感器顾名思义是对气体进行监测判断的,我们都知道气体的范围很广泛,比如我们呼吸中的氧气、二氧化碳等,...及时作出选择或者判断,今天OFweek Mall就来从气体传感器工作原理跟大家分享一下它的常用分类吧!
  • 常用传感器原理及应用.ppt
  • 常用传感器原理及应用 .ppt
  • 数字温度传感器(DS18B20) 传感器参数

    数字温度传感器(DS18B20)

    DS18B20是一款常用的高精度的单总线数字温度测量芯片。具有体积小,硬件开销低,抗干扰能力强,精度高的特点。

    在这里插入图片描述

    传感器参数

    • 测温范围为-55℃到+125℃,在-10℃到+85℃范围内误差为±0.4°

    • 返回16位二进制温度数值

    • 主机和从机通信使用单总线,即使用单线进行数据的发送和接收

    • 在使用中不需要任何外围元件,独立芯片即可完成工作。

    • 掉电保护功能 DS18B20 内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。

    • 每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值

    • 宽电压供电,电压2.5V~5.5V

    • DS18B20返回的16位二进制数代表此刻探测的温度值,其高五位代表正负。如果高五位全部为1,则代表返回的温度值为负值。如果高五位全部为0,则代表返回的温度值为正值。后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625即可获得此时的温度值。

    传感器引脚及原理图

    DS18B20传感器的引脚及封装图如下:

    在这里插入图片描述
    DS18B20一共有三个引脚,分别是:

    • GND:电源地线
    • DQ:数字信号输入/输出端。
    • VDD:外接供电电源输入端。

    单个DS18B20接线方式: VDD接到电源,DQ接单片机引脚,同时外加上拉电阻,GND接地

    注意这个上拉电阻是必须的,就是DQ引脚必须要一个上拉电阻

    DS18B20上拉电阻

    首先我们要知道什么是漏极开路

    首先看一下 场效应管(MOSFET)
    在这里插入图片描述
    场效应管 是电压控制型元器件,只要对栅极施加一定电压,DS就会导通。

    漏极开路:MOS管的栅极G和输入连接,源极S接公共端,漏极D悬空(开路)什么也没有接,直接输出 ,这时只能输出低电平和高阻态,不能输出高电平

    那么这个时候会出现三种情况:

    1. 图a为正常输出(内有上拉电阻):场效应管导通时,输出低电位输出低电位,截止时输出高电位。

    2. 图b为漏极开路输出,外接上拉电阻:场效应管导通时,驱动电流是从外部的VCC流经电阻通过MOSFET到GND,输出低电位,截止时输出高电位。

    3. 图c为漏极开路输出,无外接上拉电阻:场效应管导通时输出低电位,截止呈高阻态(断开)。
      在这里插入图片描述

    总结:

    开漏输出只能输出低电平,不能输出高电平。漏极开路输出高电平时必须在输出端与正电源(VCC)间外接一个上拉电阻。否则只能输出高阻态。

    DS18B20 是单线通信,即接收和发送都是这个通信脚进行的。 其接收数据时为高电阻输入,其发送数据时是开漏输出,本身不具有输出高电平的能力,即输出0时通过MOS下拉为低电平,而输出1时,则为高阻,需要外接上拉电阻将其拉为高电平。 因此,需要外接上拉电阻,否则无法输出1。



    外接上拉电阻阻值:

    DS18B20的工作电流约为1mA,VCC一般为5V,则电阻R=5V/1mA=5KΩ,

    所以正常选择4.7K电阻,或者相近的电阻值。



    DS18B20寄生电源

    DSl8B20的另一个特点是不需要再外部供电下即可工作。当总线高电平时能量由单线上拉电阻经过DQ引脚获得。高电平同时充电一个内部电容,当总线低电平时由此电容供应能量。这种供电方法被称为“寄生电源”。另外一种选择是DSl8B20由接在VDD的外部电源供电
    在这里插入图片描述

    DS18B20内部构成

    主要由以下3部分组成: 64 位ROM,高速暂存器,存储器

    64 位ROM存储独有的序列号

    ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。这样就可以实现一根总线上挂接多个DS18B20的目的。

    高速暂存器包含:

    • 温度传感器
    • 一个字节的温度上限和温度下限报警触发器(TH和TL)
    • 配置寄存器允许用户设定9位,10位,11位和12位的温度分辨率,分别对应着温度的分辨率为:0.5°C,0.25°C,0.125°C,0.0625°C,默认为12位分辨率,

    存储器:由一个高速的RAM和一个可擦除的EEPROM组成,EEPROM存储高温和低温触发器(TH和TL)以及配置寄存器的值,(就是存储低温和高温报警值以及温度分辨率)
    在这里插入图片描述

    DS18B20高速缓存器

    高速暂存器由9个字节组成

    • 字节0~1 是温度存储器,用来存储转换好的温度。第0个字节存储温度低8位,第一个字节存储温度高8位
    • 字节2~3 是用户用来设置最高报警和最低报警值(TH和TL)。
    • 字节4 是配置寄存器,用来配置转换精度,可以设置为9~12 位。
    • 字节5~7 保留位。芯片内部使用
    • 字节8 CRC校验位。是64位ROM中的前56位编码的校验码。由CRC发生器产生。
      在这里插入图片描述

    DS18B20温度读取与计算

    DS18B20采用16位补码的形式来存储温度数据温度是摄氏度。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。

    高字节的五个S为符号位,温度为正值时S=1,温度为负值时S=0

    剩下的11位为温度数据位,对于12位分辨率,所有位全部有效,对于11位分辨率,位0(bit0)无定义,对于10位分辨率,位0和位1无定义,对于9位分辨率,位0,位1,和位2无定义

    在这里插入图片描述

    对应的温度计算:


    当五个符号位S=0时,温度为正值,直接将后面的11位二进制转换为十进制,再乘以0.0625(12位分辨率),就可以得到温度值;

    当五个符号位S=1时,温度为负值,先将后面的11位二进制补码变为原码(符号位不变,数值位取反后加1),再计算十进制值。再乘以0.0625(12位分辨率),就可以得到温度值;

    例如:

    +125℃的数字输出07D0(00000111 11010000)
     
    转换成10进制是2000,对应摄氏度:0.0625x2000=125°C

    -55℃的数字输出为 FC90。
      
    首先取反,然后+1,转换成原码为:11111011 01101111
    数值位转换成10进制是870,对应摄氏度:-0.0625x870=-55°C

    在这里插入图片描述
    代码:

    unsigned int Templ,Temp2,Temperature;  //Templ低八位,Temp2高八位
    unsigned char Minus Flag=0;  //负温度标志位
    
    if(Tenp2&0xFC//判断符号位是否为1
    {
    	Minus Flag=l; //负温度标志位置1
    	Temperature=((Temp2<<8)|Temp1); //高八位第八位进行整合
    	Temperature=((Temperature)+1); //讲补码转换为原码,求反,补1
    	Temperature*=0.0625;//求出十进制
    }
    else   //温度为正值
    {
    	Minus Flag=0;  //负温度标志位置0
    	Temperature =((Temp2<<8) |Temp1)*0.0625;
    }
    

    配置寄存器

    在配置寄存器中,我们可以通过R0和R1设置DS18B20的转换分辨率,DS18B20在上电后默认R0=1和R1=1(12分辨率),寄存器中的第7位和第0位到4位保留给设备内部使用。
    在这里插入图片描述

    单总线系统

    在每个DS18B20内部都有一个唯一的64位长的序列号,这个序列号值就存在DS18B20内部的ROM中。开始的8位是产品类型编码(DS18B20是28H),接着的48位是每个器件唯一的序号,最后的8位是CRC校验码。
    在这里插入图片描述

    一线总线系统使用单总线主控来控制一个或多个从机设备。每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值。

    DS18B20工作步骤

    DS18B20的工作步骤可以分为三步:

    1.初始化DS18B20
    2.执行ROM指令
    3.执行DS18B20功能指令

    其中第二步执行ROM指令,也就是访问每个DS18B20,搜索64位序列号,读取匹配的序列号值,然后匹配对应的DS18B20,如果我们仅仅使用单个DS18B20,可以直接跳过ROM指令。而跳过ROM指令的字节是0xCC。

    1.初始化DS18B20

    任何器件想要使用,首先就是需要初始化,对于DS18B20单总线设备,首先初始化单总线为高电平,然后总线开始也需要检测这条总线上是否存在DS18B20这个器件。如果这条总线上存在DS18B20,总线会根据时序要求返回一个低电平脉冲,如果不存在的话,也就不会返回脉冲,即总线保持为高电平。

    初始化具体时序步骤如下:

    • 1.单片机拉低总线至少480us,产生复位脉冲,然后释放总线(拉高电平)。
    • 2.这时DS8B20检测到请求之后,会拉低信号,大约60~240us表示应答。
    • 3.DS8B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示初始化成功
    • 4.DS18B20拉低电平60~240us之后,会释放总线。
      在这里插入图片描述
      代码如下:
    /*****初始化DS18B20*****/
    unsigned int Init_DS18B20(void)
    {
      unsigned int x=0;
      DQ = 1;      //DQ复位
      delay(4);    //稍做延时
      DQ = 0;      //单片机将DQ拉低
      delay(60);   //精确延时,大于480us
      DQ = 1;      //拉高总线
      delay(8);
      x = DQ;      //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
      delay(4);
      return x;
    }
    

    2.写时序

    总线控制器通过控制单总线高低电平持续时间从而把逻辑1或0写DS18B20中。每次只传输1位数据

    单片机想要给DS18B20写入一个0时,需要将单片机引脚拉低,保持低电平时间要在60~120us之间,然后释放总线
    单片机想要给DS18B20写入一个1时,需要将单片机引脚拉低,拉低时间需要大于1us,然后在15us内拉高总线.

    在写时序起始后15μs到60μs期间,DS18B20处于采样单总线电平状态。如果在此期间总线为高电平,则向DS18B20写入1;如果总线为低电平,则向DSl8B20写入0。

    注意:2次写周期之间至少间隔1us

    在这里插入图片描述

    /*****写一个字节*****/
    void WriteOneChar(unsigned char dat)
    {
      unsigned char i=0;
      for (i=8; i>0; i--)
      {
        DQ = 0;
        DQ = dat&0x01;  //与1按位与运算,dat最低位为1时DQ总线为1,dat最低位为0时DQ总线为0
    	delay(4);
        DQ = 1;
        dat>>=1;
      }
      delay(4);
    }
    
    

    DS18B20写入的功能命令:

    ROM指令:

    采用多个DS18B20时,需要写ROM指令来控制总线上的某个DS18B20
    如果是单个DS18B20,直接写跳过ROM指令0xCC即可
    在这里插入图片描述

    RAM指令,DS18B20的一些功能指令

    常用的是:

    温度转换 0x44

    开启温度读取转换,读取好的温度会存储在高速暂存器的第0个和第一个字节中

    读取温度 0xBE
    读取高速暂存器存储的数据
    在这里插入图片描述

    读时序

    读时隙由主机拉低总线电平至少1μs然后再释放总线,读取DS18B20发送过来的1或者0

    DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。

    在这里插入图片描述
    注意:所有读时隙必须至少需要60us,且在两次独立的时隙之间至少需要1ps的恢复时间

    同时注意:主机只有在发送读暂存器命令(0xBE)或读电源类型命令(0xB4)后,立即生成读时隙指令,DS18B20才能向主机传送数据。 也就是先发读取指令,再发送读时隙

    最后一点: 写时序注意是先写命令的低字节,比如写入跳过ROM指令0xCC(11001100),写的顺序是“零、零、壹、壹、零、零、壹、壹”,

    读时序时是先读低字节,在读高字节,也就是先读取高速暂存器的第0个字节(温度的低8位),在读取高速暂存器的第1个字节(温度的高8位) 我们正常使用DS18B20读取温度读取两个温度字节即可



    51例程

    sbit DQ=P1^0;	//定义DS18b20的管脚
    
    /*****延时子程序*****/
    void delay(unsigned int t)
    {
    	for(;t>0;t--);
    }
    
    
    /*****初始化DS18B20*****/
    unsigned char Init_DS18B20(void)
    {
      unsigned char x=0;
      DQ = 1;      //DQ复位
      delay(8);    //稍做延时
      DQ = 0;      //单片机将DQ拉低
      delay(80);   //精确延时,大于480us
      DQ = 1;      //拉高总线
      delay(8);
      x = DQ;      //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
      delay(4);
      return x;
    }
    
    /*****读一个字节*****/
    unsigned char ReadOneChar(void)
    {
      unsigned char i=0;
      unsigned char dat = 0;
      for (i=8;i>0;i--)
      {
        DQ = 0;     // 给脉冲信号
        dat>>=1;
        DQ = 1;     // 给脉冲信号
        if(DQ)
        	dat|=0x80;
    	delay(4);
      }
      return(dat);
    }
    
    /*****写一个字节*****/
    void WriteOneChar(unsigned char dat)
    {
      unsigned char i=0;
      for (i=8; i>0; i--)
      {
        DQ = 0;
        DQ = dat&0x01;
    	delay(4);
        DQ = 1;
        dat>>=1;
      }
      delay(4);
    }
    
    /*****读取温度*****/
    int ReadTemperature(void)
    {
      	unsigned char a=0;
      	unsigned char b=0;
      	unsigned int t=0;
      	t=Init_DS18B20();
      	if(t) return Real_temp;
      	WriteOneChar(0xCC);  //跳过读序号列号的操作
      	WriteOneChar(0x44);  //启动温度转换
      	t=Init_DS18B20();
      	if(t) return Real_temp;
      	WriteOneChar(0xCC);  //跳过读序号列号的操作
      	WriteOneChar(0xBE);  //读取温度寄存器
      	a=ReadOneChar();     //读低8位
      	b=ReadOneChar();     //读高8位
      	t=b;
      	t<<=8;
      	t=t|a;
      	if(t<=0||t>0x900) 
    	return Real_temp;
    	t=t*0.625+0.5;
      	return(t);
    }
    
    

    STM32例程

    DS18B20.C

    #include "ds18b20.h"
    #include "delay.h"	
    
    //复位DS18B20
    void DS18B20_Rst(void)	   
    {                 
    	DS18B20_IO_OUT(); 	//SET PG11 OUTPUT
        DS18B20_DQ_OUT=0; 	//拉低DQ
        delay_us(750);    	//拉低750us
        DS18B20_DQ_OUT=1; 	//DQ=1 
    	delay_us(15);     	//15US
    }
    //等待DS18B20的回应
    //返回1:未检测到DS18B20的存在
    //返回0:存在
    u8 DS18B20_Check(void) 	   
    {   
    	u8 retry=0;
    	DS18B20_IO_IN();	//SET PG11 INPUT	 
        while (DS18B20_DQ_IN&&retry<200)
    	{
    		retry++;
    		delay_us(1);
    	};	 
    	if(retry>=200)return 1;
    	else retry=0;
        while (!DS18B20_DQ_IN&&retry<240)
    	{
    		retry++;
    		delay_us(1);
    	};
    	if(retry>=240)return 1;	    
    	return 0;
    }
    //从DS18B20读取一个位
    //返回值:1/0
    u8 DS18B20_Read_Bit(void) 	 
    {
        u8 data;
    	DS18B20_IO_OUT();	//SET PG11 OUTPUT
        DS18B20_DQ_OUT=0; 
    	delay_us(2);
        DS18B20_DQ_OUT=1; 
    	DS18B20_IO_IN();	//SET PG11 INPUT
    	delay_us(12);
    	if(DS18B20_DQ_IN)data=1;
        else data=0;	 
        delay_us(50);           
        return data;
    }
    //从DS18B20读取一个字节
    //返回值:读到的数据
    u8 DS18B20_Read_Byte(void)     
    {        
        u8 i,j,dat;
        dat=0;
    	for (i=1;i<=8;i++) 
    	{
            j=DS18B20_Read_Bit();
            dat=(j<<7)|(dat>>1);
        }						    
        return dat;
    }
    //写一个字节到DS18B20
    //dat:要写入的字节
    void DS18B20_Write_Byte(u8 dat)     
     {             
        u8 j;
        u8 testb;
    	DS18B20_IO_OUT();	//SET PG11 OUTPUT;
        for (j=1;j<=8;j++) 
    	{
            testb=dat&0x01;
            dat=dat>>1;
            if (testb) 
            {
                DS18B20_DQ_OUT=0;	// Write 1
                delay_us(2);                            
                DS18B20_DQ_OUT=1;
                delay_us(60);             
            }
            else 
            {
                DS18B20_DQ_OUT=0;	// Write 0
                delay_us(60);             
                DS18B20_DQ_OUT=1;
                delay_us(2);                          
            }
        }
    }
    //开始温度转换
    void DS18B20_Start(void) 
    {   						               
        DS18B20_Rst();	   
    	DS18B20_Check();	 
        DS18B20_Write_Byte(0xcc);	// skip rom
        DS18B20_Write_Byte(0x44);	// convert
    } 
    
    //初始化DS18B20的IO口 DQ 同时检测DS的存在
    //返回1:不存在
    //返回0:存在    	 
    u8 DS18B20_Init(void)
    {
     	GPIO_InitTypeDef  GPIO_InitStructure;
     	
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);	 //使能PORTG口时钟 
    	
     	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				//PORTG.11 推挽输出
     	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		  
     	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     	GPIO_Init(GPIOG, &GPIO_InitStructure);
    
     	GPIO_SetBits(GPIOG,GPIO_Pin_11);    //输出1
    
    	DS18B20_Rst();
    
    	return DS18B20_Check();
    }  
    //从ds18b20得到温度值
    //精度:0.1C
    //返回值:温度值 (-550~1250) 
    short DS18B20_Get_Temp(void)
    {
        u8 temp;
        u8 TL,TH;
    	short tem;
        DS18B20_Start ();  			// ds1820 start convert
        DS18B20_Rst();
        DS18B20_Check();	 
        DS18B20_Write_Byte(0xcc);	// skip rom
        DS18B20_Write_Byte(0xbe);	// convert	    
        TL=DS18B20_Read_Byte(); 	// LSB   
        TH=DS18B20_Read_Byte(); 	// MSB  
    	    	  
        if(TH>7)
        {
            TH=~TH;
            TL=~TL; 
            temp=0;					//温度为负  
        }else temp=1;				//温度为正	  	  
        tem=TH; 					//获得高八位
        tem<<=8;    
        tem+=TL;					//获得底八位
        tem=(float)tem*0.625;		//转换     
    	if(temp)return tem; 		//返回温度值
    	else return -tem;    
    }
    
    
    

    DS18B20.H

    #ifndef __DS18B20_H
    #define __DS18B20_H 
    #include "sys.h"   
    
    //IO方向设置
    #define DS18B20_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}
    #define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}
    IO操作函数											   
    #define	DS18B20_DQ_OUT PGout(11) //数据端口	PA0 
    #define	DS18B20_DQ_IN  PGin(11)  //数据端口	PA0 
       	
    u8 DS18B20_Init(void);//初始化DS18B20
    short DS18B20_Get_Temp(void);//获取温度
    void DS18B20_Start(void);//开始温度转换
    void DS18B20_Write_Byte(u8 dat);//写入一个字节
    u8 DS18B20_Read_Byte(void);//读出一个字节
    u8 DS18B20_Read_Bit(void);//读出一个位
    u8 DS18B20_Check(void);//检测是否存在DS18B20
    void DS18B20_Rst(void);//复位DS18B20    
    #endif
    
    

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • PNP与NPN型传感器其实就是利用三极管的饱和和截止,输出两种状态,属于开关型传感器。但输出信号是截然相反的,即高电平和低电平。PNP输出是高电平1,NPN输出的是低电平0。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,374
精华内容 9,349
关键字:

常用传感器工作原理