外设驱动库开发笔记37:S1336-5BQ光敏二极管作为光度计驱动

  光敏二极管能够实现很多应用,用于光度检测即是其一。我们在一些产品中就曾使用S1336-5BQ光敏二极管进行光度值检测。所以在本篇中,我们将讨论如何设计并实现S1336-5BQ光敏二极管用于光度检测的驱动。

1、功能概述

  根据相关的资料,光电二极管S1336-5BQ的光谱响应范围为:190~1100nm范围,最灵敏的波长是960nm。而且光电二极管S1336-5BQ每100lx的光照对应有5μA的电流。于是我们可以据此设计一个电路,将电流的变化改变为电压变化,具体原理图设计如下:

  上图中R5是采样电阻,其阻值决定测量范围,电源VCC,默认采用5V标准电源。我们可以知道输出电压与光度值的函数关系为:

  其中lux为光度值,Vo为输出电压,Vf为参考电压。所以我们可以看到光度值与输出电压是线性关系,我们检测到输出电压就可以得到光度值。

2、驱动设计与实现

  我们明白了使用光电二极管S1336-5BQ检测光强的原理,接下来我们需要根据这一原理实现代码。

2.1、对象定义

  在使用之前我们要定义一个LUX对象,因此需要LUX对象类型。我们根据测量原理抽象可得:

/* 定义光度检测对象类型 */

typedef struct LuxObject {

​ float isc100lux; //每100个光度变化所对应的电流变化

​ float rnf; //采样电阻的值

​ float vref; //参考电压

​ float lux; //光度值

}LuxObjectType;

  有了对象我们还不能够立即使用,必须将对象初始化后方可使用。所以我们根据对象编写其初始化函数:

/* 光度检测对象初始化 */

void LuxInitialization(LuxObjectType *lm,float isc,float vref,float rnf)

{

​ if(lm==NULL)

​ {

​ return;

​ }

​ lm->lux=0.0;

​ lm->isc100lux=isc;

​ lm->rnf=rnf;

​ lm->vref=vref;

}

2.2、对象操作

  我们已经有了对象并对其进行了初始化。接下来我们就可以操作对象得到光度值。根据前面的测量原理我们可以得到光度值的计算公式:

我们就按此公式计算光度值:

/*计算光照强度*/float CalcLxIllumination(LuxObjectType *lm,float mVoltage){float lux=0.0;lux=(mVoltage-lm->vref)*100/(lm->rnf*lm->isc100lux);lm->lux=lux;return lux;}

  而输入的电压值就是通过采集电路得到的输出电压。

3、驱动的使用

  在我们的应用中,我们的光源波长则在254nm最显著,包括其它600nm以内的光波,这个正好处于S1336-5BQ光电二极管190~1100nm范围测量范围之内。

  前面测量电路的输出作为输入信号接入到ADC中。在ADC前端加一些必要的保护,但不对信号进行处理,具体如下图所示:

  当然如果需要也可以作放大缩小等处理,从而符合ADC输入的要求。但不会改变光度值的检测范围。

  同样的我们先使用LuxObjectType定义对象变量并初始化。当然,如果有多个也可以使用数组处理。这里只以单个对象为例:

  LuxObjectType lm;

  LuxInitialization(&lm,0.000005,2.5,10000.0);

  定义并初始化对象完成之后,我们就可以调用CalcLxIllumination函数计算光度值:

  CalcLxIllumination(&lm,2.738);

  可得到结果:lux=476。

4、应用总结

  使用S1336-5BQ光电二极管进行光度测量的原理比较简单。我们在臭氧发生器中,使用其检测紫外光的强度也取得了预期的效果。

  对于检测光强的范围完全由采样电阻决定。在我们的设备中我们可以检测0~5000lux的光强。如果想采用不同的范围则可以通过调整采样电阻的值来实现。

欢迎关注:

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

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

相关文章

PID控制器改进笔记之六:改进PID控制器之参数设定

前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器。这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提高性能和灵活性。这篇中我们来讨论改进PID控制…

软件设计开发笔记1:基于状态机的程序设计

在编码实现的过程中,我们会经常使用到条件判断结构,而且使用起来很方便。但是在需要转移的状态比较多,或是条件比较复杂时,我们就可能需要很长的条件判断结构来处理。不过,过于复杂的条件判断结构会给代码的编写和维护…

外设驱动库开发笔记38:RTD热电阻测温驱动

我们已经讨论过多种温度检测方式,但我们尚未关注热电阻温度检测,但热电阻测温在工业环境中是非常常见的。尽管有很多集成的数字式的热电阻接口元器件,但这些器件不但成本较高,灵活性也大打折扣。所以我们有时会使用更简单灵活的电…

外设驱动库开发笔记39:按键操作驱动

按键在我们的项目中是经常使用到的组件。一般来说,我们都是在用到按键时直接针对编码,但这样每次都做很多重复性的工作。所以在这里我们考虑做一般性抽象得到一个可应用于按键操作的通用性驱动程序。 1、功能概述 按键操作在我们的产品种经常用到&#…

外设驱动库开发笔记40:AT25xxx外部存储器驱动

我们在前面开发过AT24CXX系列EEPROM存储器,它使用的是I2C接口。不过有时候我们也会使用SPI接口的EEPROM存储器。在这一篇我们将来讨论AT25XXX系列EEPROM存储器的驱动设计、实现及使用。 1、功能概述 AT25XXX系列EEPROM存储器采用SPI接口,因其操作简单且…

闪存中的键值对:无文件系统 minINI

许多嵌入式系统应用需要以持久的方式存储某种数据:校准值、设置或日志信息。对于较少的数据量,使用外部存储器或文件系统是一种过度大材小用。在许多系统中,我使用minINI以“ini-file”的方式存储键值解析,但它需要使用某种文件系…

外设驱动库开发笔记41:ADS1256 ADC驱动

我们经常会碰到多通道AD采集的需求,有时候甚至需要高精度的ADC器件。本篇我们将来设计并实现ADS1256模数转换器的驱动。并简单讨论该驱动使用方式。 1、功能概述 ADS1256是TI公司推出的一款低噪声高分辨率的24位Sigma-Delta(E-v)模数转换器(ADC)。E-vADC与传统的逐…

PID参数自整定库之一:继电反馈整定算法

在前述的篇章中,我们实现了PID控制器并在后续对其进行了改进。但作为经典PID控制器还存在PID参数整定的问题。通常我们可以采取人工整定的办法,但人工整定涉及到比较专业的知识,而且找到合适的参数本身也不是一件容易的事,所以人们…

外设驱动库开发笔记42:DAC8552 DAC驱动

模拟信号输出是经常会遇到的应用需求,解决的办法应多种,但我们使用最多的还是数模转换。对于不同的数模转换器我们需要为其编写适用的驱动程序,在这一篇中我们就来考虑如何实现DAC8552高精度模数转换器的驱动程序。 1、功能概述 该DAC8552是…

软件设计开发笔记2:基于QT设计串口调试工具

串口通信是我们经常会遇到的问题。很多时候当我们设计一个串口应用时,我们希望有一个简便的、可视的方式来验证它。这一篇中我们就来基于QT设计一个串口调试工具。 1、概述 在开始软件设计之前,我们来简略地分析一下这样一个小软件其要包含的主要内容有…

外设驱动库开发笔记43:GPIO模拟SPI驱动

SPI总线是我们常用的串行设备接口,一般情况下我们都会适应硬件SPI接口,但有些时候当硬件端口不足时,我们也希望可以使用软件来模拟SPI硬件接口,特别是要求不是很高的时候。在这一篇中我们将来讨论如何使用GPIO和软件来模拟SPI通讯…

外设驱动库开发笔记44:DDC114 ADC驱动

在产品设计过程中,很多时候都会用到ADC器件,而在一些特殊场合还需要一些特别的ADC器件。我们在这篇中将讨论常用于医疗器件方面的,DDC114这款电流输入ADC,并为其设计一个驱动程序。 1、功能概述 模数转换器DDC114是一款电流输入型…

PID控制器改进笔记之七:改进PID控制器之防超调设定

我们已经设计了PID控制器,并根据实际使用的情况对器进行了诸多的改进。在这一篇中我们将讨论如何改进PID控制器超调的问题。 1、问题提出 在前面的文章中,我们曾推导过增量式PID控制器的公式,并且对其进行了离散化以适用于程序实现&#xff…

软件设计开发笔记3:基于QT的Modbus RTU主站

Modbus是一种常见的工业系统通讯协议。在我们的设计开发工作中经常使用到它。在这一篇中我们将简单实现一个基于QT的Modbus RTU主站上位工具。 1、概述 Modbus RTU主站应用很常见,有一些是通用的,有一些是专用的。而这里我们希望实现一个主要针对我们的…

外设驱动库开发笔记45:MS4515DO压力传感器驱动

很多时候我们需要检测流量和压力这些参数,比如我们要检测大气压,或者通过测量差压来获得输送流体的流量等,都需要用到压力传感器。这一篇我们就来讨论MS4515DO压力传感器的数据获取。 1、功能概述 MS4515DO是TE公司推出的一款基于PCB安装的小…

外设驱动库开发笔记48:MCP4725单通道DAC驱动

在产品设计过程中,我们经常会遇到数模转换的应用需求。在本篇种我们就来讨论一下MCP4725单通道数模转换器的驱动设计与实现。 1、功能概述 MCP4725是一个低功耗,高精度,单通道,12位缓冲电压输出数字到模拟转换器(DAC)与非易失性存…

如何确保不使用动态内存

在许多嵌入式应用程序中,内存分配必须是静态的,而不是动态的。意味着在应用程序中不应使用对malloc()或free()等内容的调用,因为它们可能会在运行时失败(内存不足、堆碎片)。 但是,当与第三方库甚至 C/C 标…

go 单元测试 testing 打印输出_2020,你需掌握go 单元测试进阶篇

本文说明go语言自带的测试框架未提供或者未方便地提供的测试方案,主要是用于解决写单元测试中比较头痛的依赖问题。也就是伪造模式,经典的伪造模式有桩对象(stub),模拟对象(mock)和伪对象(fake)。比较幸运的是,社区有丰富的第三方测试框架支持…

一文读懂Git工作流

Git是目前最流行的代码管理工具,相信大家也都是在用Git来管理自己团队的源代码。 团队一般为了规范开发,保持良好的代码提交记录以及维护 Git 分支结构清晰,方便后续维护等,都会迫切需要一个比较规范的 Git 工作流。 本文就是在…

xbox360fsd更新游戏封面_游戏类短视频创作指南

一.起步阶段1.内容发布垂直,整体风格一致,选定一个品类的游戏内容风格持续更新注意:冷启动时期不要频繁更换游戏类型2.账号IP化 根据自身风格特色打造独特的风格账号。有利延长账号生命周期,提升粉丝转化率。搞笑、中二…