热敏传感器模块开发

热敏传感器模块作为LED屏显示系统的一个小模块,小虽小,却涉及到模数转换、MQX实时操作系统、IAR集成开发环境、不同封装的ARM芯片之间的引脚转换、软件编程等多方面的的知识。需要开发人员具备扎实的软件功底和相应的硬件知识。

本文介绍从热敏传感器选型开始,到软件模块开发、测试完成这整个过程,以及软件模块的设计。整个开发过程采用边摸索边开发的方式,根据得到的信息不停地细化、调整设计。

 

一、选型

首先对光敏电阻和热敏传感器进行性能比较。严格来讲,光敏电阻属于热敏传感器的范畴,之所以将它单独拎出来,是因为其简单易用低成本等特性。经过查阅各方资料,发现光敏电阻有以下优缺点:

(1) 可用直流电源;

(2) 灵敏度和光导材料以及入射光的波长有关;

(3) 受温度影响较大;

(4) 响应速度不快;

其中,第(3)条的缺点不能接受。于是考虑其他的热敏传感器。

当时主管的手头上有一款ROHMBH1750FVC型热敏传感器,通过查看其性能,发现这是一款数字传感器,使用方便,温度范围亦可,但是其光照范围不能满足要求。产品用于户外环境,烈日下的照度可达10000lux,而BH1750FVC型的热敏传感器的最大照度只有65535lux,这一点不能满足要求。

查看ROHM的其他相关产品,发现有BH1603FVCBH1620FVC等产品可以满足照度要求。通过咨询ROHM厂家,推荐BH1620FVC型光敏传感器。这款光敏传感器是模拟传感器,光照范围最大可达100000lux,只有5个引脚,价格优惠,使用广泛。虽然模拟传感器需要经过模数转换,但是它在其他方面都完全符合要求,于是决定使用BH1620FVC这款光敏传感器。

 

二、熟悉开发环境

开发环境主要采用IAR集成开发环境,使用的操作系统为FreescaleMQX实时操作系统。熟悉开发环境的过程,遵循着由易到难、由简到繁开展。

开发环境安装好之后,自带有各种demo

IARMQX都不熟悉的情况下,首先选择在IAR环境下不使用MQX操作系统,从最简单、最常见的GPIO模块着手。硬件使用MK60DN512VLQ10芯片,操作系统库选择twrk60d100mBGA封装的开发板。对开发板上的四个LED灯进行串行、并行控制,常亮、闪烁等效果显示后,已经达到可以自如地控制LED的程度,这部分内容的熟悉就算结束了。

然后选择在IAR环境下使用MQX操作系统,同样是GPIO模块。熟悉程度达到能自如地控制四个LED灯。这种开发环境的使用,需要事先编译好即将用到的操作系统的库,然后在demo的基础上修改应用程序。

 

三、软件开发过程

BGA封装的开发板上有一个可变电阻,使用的是一对差分模拟引脚,打算从这里着手。在IAR环境下使用MQX操作系统的条件下,选择ADC模块的demo,在此基础上进行设计和修改。

在消化了demo中的代码后,将程序下载到开发板上运行,一切看起来没什么错误,但是也不能保证读取到的数据就是正确的,因为看不到结果。

采用断点调试,前面2次可以读取到模拟引脚上的数据,后面便不能读取到了。

怎么办呢?

换到不带操作系统的ADC demo看效果。这个demoLED灯来显示效果。全速运行时LED灯能够按照预期运行,整个程序看起来没什么问题。断点运行时,则不能像全速运行时那样,程序不能按照预期运行,LED灯的运行也与预期不一致。后来改变了一下断点的位置,运行倒变得与预期一致了。这说明,断点的设置位置对嵌入式程序的运行有影响,断点的设置,可能会打断程序运行的正常时序。这个程序的运行和调试情况对我很有启发,于是回到之前的环境进行调试。

这次做了一点修改,添加了led灯用于效果显示。这从大体上说明,程序的运行与预期一致。但是,如果想要获取准确的数值,仍然无法做到。

后来修改了用户配置,使之能够支持uart输出。重新编译库,重新编译应用程序,运行,结果与预期一致,当电阻固定在一个位置时,输出的数值也是固定的;当电阻旋转时,输出的数值也跟着做相应的变化。这从根本上证明了ADC模块应用在产品中的可行性。

以上实验都是在BGA封装的板子上运行的。这个开发板设计得密密麻麻,想要在其上飞线加什么元器件比较困难,于是打算在自行开发的LQFP封装的开发板上运行。

LQFP封装的开发板与BGA封装的开发板引脚之间有对应关系,这个从资料中也比较容易查到。但是使用到的模拟引脚与模数转换的channel的映射则费了一番功夫。

LQFP封装的开发板准备好(连接光敏传感器,配置及安装UART模块),模拟引脚配置好之后,开始进行软件的进一步细化实现中。

 

四、软件模块方案变更

1)需求分析

考虑到户外环境的特殊性,当环境亮度变化达到一定的程度时,让屏幕亮度的变化延后一段时间。

2)设计准备

本次采样时间与上次屏幕亮度变化时间,这二者的差值需要用到时间模块。

3)设计方案:

在一个采样周期(100ms)中,如果屏幕亮度与环境亮度的差异达到一定的程度,就让屏幕延时3秒改变亮度。

4)实验结果与实验分析

设计完成后,观察效果,从串口输出的数据中发现:(1)环境亮度的变化很剧烈时,屏幕的亮度也跟着剧烈变化(2)采样周期也太短。

屏幕亮度的剧烈变化,将严重影响电源的使用寿命。于是考虑让屏幕亮度慢慢朝着环境亮度的方向接近,同时延长采样周期。

5)新的设计方案

在一个采样周期中,如果屏幕亮度与环境亮度的差异达到一定程度,在延时3秒后,如果亮度差异仍然较大,就让屏幕亮度向着环境亮度的方向变化一个level;在下一个采样周期中,采样环境亮度,比较屏幕亮度和环境亮度,如果存在的差异达到一个level,就继续让屏幕亮度向着环境亮度的方向接近一个level;一直循环,直到屏幕亮度和环境亮度的level相同;然后继续采样,当二者不相等时,将开始下一个亮度平衡过程。另一方面,取消延时改变屏幕亮度,改为实时改变。将采样周期改为1000ms

五、模块接口

该模块的主要功能是获取进行屏幕亮度设置需要的信息。调整屏幕亮度分为手动和自动两种方式。

自动方式,是从光敏传感器上获取亮度数值,将之转换成亮度级别,若与屏幕的亮度级别存在差异,则传给其他模块进行屏幕亮度控制。自动方式为屏幕亮度控制的默认方式。

屏幕亮度的级别从0开始,最高为31,共32level2048lux为一个level,当环境亮度与屏幕亮度的差别大于一个level时,延时一定时间后若亮度差异仍然较大,会逐步调整屏幕亮度,使屏幕逐步达到与环境同样的亮度。1000ms为一个采样周期,每个采样周期对屏幕亮度最多调整一个level

手动方式,是通过手动方式直接设置屏幕亮度,并通知系统不再获取光敏传感器的数据。

热敏传感器模块提供两个接口:

(1) void get_set_luminance(void)

若采样方式为自动方式,则调用本函数。自动方式为屏幕亮度调整的默认方式。本函数将周期性地进行采样(周期设定为1000毫秒,可调整),将光敏传感器的采样数据转换为亮度的level,并与屏幕上亮度level进行比较,若存在差异,则将屏幕亮度level向着采样的亮度level方向调近一个亮度级别。

 

(2) void set_luminance(uint_8 level)

若手动调节屏幕亮度,则调用本函数。该函数直接调节屏幕亮度,不再通过先采样再调整的方式。调用该函数后,不再进行自动采样。

 

六、与其他模块的交互

本模块需要设置2个全局变量screen_levelillunimance_adjust_mode

screen_level用于表示屏幕亮度level

illunimance_adjust_mode用于表示屏幕亮度调节方式。

上游模块其他模块调用本模块的两个接口函数,通过接口函数,改变这两个全局变量的数值。再由下游模块根据这两个全局变量的值,来改变屏幕亮度。

 

你可能感兴趣的:(热敏传感器模块开发)