STM32使用光敏传感器计算光照度Lux,而不是仅仅打印个电压值或者电阻值
最近项目中用到了光敏电阻。搜索资料,发现很多人都使用光敏电阻,只是用了AD读取了电压值,或者算出了电阻值,就发送给上位机或者服务器,美其名曰获取了光照度。
搜索一番,也没找到用光敏电阻计算Lux的方法,于是自己做了一些研究,分享一下。
计算光敏电阻值
相信STM32的ADC读者应该会用,教程也一抓一大把,在此不表。接下来先计算电阻值。我的光敏电阻电路图如下:
其中PA6接单片机AD采集引脚,它最大只能输入3.6V电压,而光敏电阻的供电为5V,所以设计了R1与R2两个分压电阻,确保PA6的电压不超过3.6V。
设光敏电阻的阻值为xΩ,PA6的电压为y,可得以下公式:
y/1500=5/(x+2500)
STM32的ADC精度为12位,则最大值为4096。采集到的AD值与电压成线性对应关系,系统中最高的电压值为3.3V的电源电压,它与4096对应。假设PA6感受到的电压y对应的AD值为z,则:
y/z=3.3/4096
联立两式,消去y,得到关于x的表达式:
x=10240000/(1.1×z)-2500
使用ADC得到z以后,就可以根据上式算出光敏电阻的值了。
我的代码使用了DMA获取多通道AD值,并且取100个数据求算数平均值滤波,然后打印电阻值的代码如下:
//main.c main()while (1){if(DMA_Flag){for(int i=0;i<ADC_CHANNEL_CNT;i++)printf("CH%d value = %d \n",i+2,ADC1_AVG_Buf[i] );uint32_t PhotoResistor = (uint32_t)(10240000/(1.1*ADC1_AVG_Buf[4]) - 2500);//串口打印采样结果printf("The AD value is %d,the PhotoResistor is %d .\r\n",ADC1_AVG_Buf[4],PhotoResistor);printf("The DMA count is %d .\r\n",DMA_CNT);DMA_Flag = 0;}}
现象是能够打印出光敏电阻值。
从电阻值到光照度
之前已经算出来了光敏电阻的电阻值,并且能够分出光照强度的等级,但是仍然无法计算出光照强度。光照强度是指单位面积上所接受可见光的能量,简称照度,单位勒克斯(Lux或lx)。常见环境的光照强度值如表
场所/环境 |
光照强度(lux) |
场所/环境 |
光照强度(lux) |
晴天室内 |
100~1000 |
办公室/教室 |
300~500 |
阴天室内 |
5~50 |
餐厅 |
10~30 |
月圆夜室外 |
0.2 |
距60W台灯60cm |
300 |
精确测量光照强度是比较困难的一件事情,使用简陋的光敏电阻测量光照强度则精度更难以保障。本节的重点是解决问题的思路,如何用较简单的方法获取相对准确的光照度。配套电路板中使用的光敏电阻型号为GL5528,它的主要参数如表
项目 |
最大电压 |
最大功耗 |
环境温度 |
光谱峰值 |
10Lux时亮电阻 |
暗电阻 |
γ值 |
上升时间 |
下降时间 |
单位 |
V |
mW |
℃ |
nm |
KΩ |
MΩ |
0.6 |
ms |
ms |
GL5528 |
500 |
500 |
-30~+70 |
560 |
10~20 |
2 |
0.6 |
20 |
30 |
其中的γ值表示10Lux电阻值与100Lux电阻值的比值的对数。
γ=lg(R10/R100)
将γ=0.6带入,可得R10/R100≈4。即R10=4×R100,对于R10与R1关系仍然成立:R1=4×R10。手册中给出了一个对数坐标系的图,光照强度与Lux的对应关系并非一条直线,而是一个范围。为了简便计算,取范围中稍微靠下的一条直线,直线中包含(1,40),(10,10),(100,2.5)这三个点。
手册中给出的1到100范围太小了,常用光照度可到达1000Lux,因此要通过现有的关系推算出光照度与电阻值的关系式。虽然看上去光照度与电阻值的对应关系是一条直线,但是要注意坐标系是对数坐标系,不能套用一元一次方程。在MATLAB中拟合,拟合过程如图7-19所示。可得关系式为:
f(x)=(4e+0.4)×x^(-0.6021)
拟合过程如图。
编写代码算出光照度
在单片机内,用带指数的关系式计算,计算速度会很慢。可以使用查表法,无需计算,只遍历数组得到结果。根据拟合得到的函数,可以推导出Lux从1到1000,各自对应的电阻值,共1000对。观察数据,可以发现在Lux比较大的时候,对应的电阻值过于接近。此处仅要求粗略计算,无需这么多数据。将电阻值的个位数舍去,并删除重复电阻值,可得到281对数据。
定义新的结构体数据如下。
//ADC.h
typedef struct
{unsigned short ohm; //光敏电阻值unsigned short lux; //流明
}PhotoRes_TypeDef;
//ADC.c
//GL5528光敏电阻的阻值与流明对应的关系
const PhotoRes_TypeDef GL5528[281]=
{
{40000, 1},{26350, 2},{20640, 3},{17360, 4},{15170, 5},
{13590, 6},{12390, 7},{11430, 8},{10650, 9},{9990, 10},
{9440, 11},{8950, 12},{8530, 13},{8160, 14},{7830, 15},
......
{720, 773},{710, 791},{700, 809},{690, 829},{680, 849},
{670, 869},{660, 891},{650, 914},{640, 937},{630, 961},
{620, 987},
};
当得到电阻值以后,遍历数据,算出光照度,代码如下。
//ADC.c
/*** @brief 通过电阻值算出光照度* @param 光敏电阻值* @retval None*/
unsigned short GetLux(uint32_t PhotoResistor)
{unsigned short lux = 0;//查表法,根据电阻值得出光照度for(int i = 0 ; i < 281 ; i++){if (PhotoResistor > GL5528[i].ohm){lux = GL5528[i].lux;break;}}return lux;
}
主函数中,打印光照度:
//main.c main() while(1)if(DMA_Flag){unsigned short lux = 0;for(int i=0;i<ADC_CHANNEL_CNT;i++)printf("CH%d value = %d \n",i+2,ADC1_AVG_Buf[i] );uint32_t PhotoResistor = (uint32_t)(10240000/(1.1*ADC1_AVG_Buf[4]) - 2500);//从电阻值计算光照度lux = GetLux(PhotoResistor);//串口打印采样结果printf("The AD value is %d,the PhotoResistor is %d .\r\n",ADC1_AVG_Buf[4],PhotoResistor);printf("The Lux is %d .\r\n",lux);printf("The DMA count is %d .\r\n",DMA_CNT);DMA_Flag = 0;}
下载程序,观察现象,应该看到如图7-19所示的现象,说明算出了Lux的值。
当然,这个计算结果也不会很精确,毕竟光照度与电阻的关系也不是一一对应的。聊胜于无吧。
关注公众号“yummy说电子”,后台回复关键字“光敏电阻”,获取配套源码、拟合数据与MATALAB代码。
STM32使用光敏传感器计算光照度Lux,而不是仅仅打印个电压值或者电阻值相关推荐
- 基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计
目录 1 项目概述 1.1 项目介绍 1.2 项目开发环境 1.3 小组人员及分工 2 需求分析 2.1 系统需求分析 2.2 可行性分析 2.3 项目实施安排 3 系统硬件设计 3.1 系统整体硬件 ...
- STM32的光敏传感器
STM32的光敏传感器 简介 硬件连接 计算公式 程序 简介 1.照射光敏二极管的光强不同,通过光敏二极管的电流大小就不同,所以可以通过检测电流大小,达到检测光强的目的.利用这个电流变化,我们串接一个 ...
- 【STM32】光敏传感器示例
00. 目录 文章目录 00. 目录 01. 光敏传感器简介 02. 硬件模块 03. 程序设计 04. 结果验证 05. 预留 06. 附录 07. 声明 01. 光敏传感器简介 光敏传感器是最常见 ...
- STM32+BH1750光敏传感器获取光照强度
一.环境介绍 MCU: STM32F103ZET6 光敏传感器: BH1750数字传感器(IIC接口) 开发软件: Keil5 代码说明:使用IIC模拟时序驱动,方便移植到其他平台,采集的光照度比较 ...
- 光照传感器哪个好_传感器2—光敏传感器
记忆关键:光敏传感器是负相关,光越强,电阻越小. 记忆技巧(只是技巧,不是原理,不要深究):把光敏传感器看做太阳能发电模块,太阳越强电压(电流越大),那根据欧姆定律,电阻不变,电压变大:电压不变,电阻 ...
- STM32光敏传感器原理
发现很多人都使用光敏电阻,但只是用了AD读取了电压值,或者算出了电阻值,就发送给上位机或者服务器,美其名曰获取了光照度,但其原理并...... 图中的 LS1 就是光敏传感器,其实就是一个光敏二极管, ...
- STM32——ADC读取光敏传感器控制LED灯,看门狗中断
本文介绍两种使用方法 一.编写读取AD值的函数,之后判断AD值,进行相应操作,比如点灯. 二.用ADC读取光敏传感器AO口输出,并配置ADC通道看门狗监控这条通道,当光线太暗时打开LED灯. 之后会再 ...
- STM32学习笔记(六 定时器及应用 4 光敏传感器实验 )
一.光敏传感器简介 光敏传感器是最常见的传感器之一,它的种类繁多,主要有:光电管.光电倍增管.光敏电阻.光敏三极管.太阳能电池.红外线传感器.紫外线传感器.光纤式光电传感器.色彩传感器.CCD 和 C ...
- STM32开源代码——光敏传感器
正点原子精英开发板 模块化封装,入口函数简明,易上手操作 展示main.c代码,完整代码请下载 点击下载代码 #include "led.h" #include "del ...
最新文章
- 网站推广专员浅析如何做好网站推广与运营?
- debain apt oracle jdk,debian安装oracle jdk
- IntelliJ IDEA for Mac下载、安装、使用TunnelliJ插件(一种TCP/IP Monitor)
- 详解html结构之间的各个关系,层级关系(以列表为例)
- lol1.7更新服务器维护,lol今天停机维护到几点11日7.1版本停机更新公告
- apache过滤恶意频繁访问_采用网关过滤器实现权限验证及对异常统一处理
- js扁平数组对象转成树结构
- esp8266开发入门教程(基于Arduino)——编程基础介绍
- 关于HTML按钮跳转方法(及其相关)
- 差点被威金病毒搞死了……
- Matlab中的atmoscoesa函数与atmosisa函数——不同海拔下的标准大气参数查询
- c语言gcd 简易函数,简单[GCD]用法详细总结(上)
- Focal损失函数学习笔记
- EMV(一):初步了解EMV和EMV的分层结构
- Android整合网上资源以及个人对GreenDao数据库框架的理解与使用(android-studio开发)
- 【iOS逆向与安全】iOS插件开发光速入门
- 第一届华数杯A题思路分析
- 数学 计算机 生物学,数据:中国高校数学、物理、化学、生物、计算机5大学科实力排名!...
- 以太坊客户端mist和geth加快区块同步速度的方法
- Nelder Mead SIMPLEX Algorithm
热门文章
- PHP require、include、require_once、include_once用法及区别
- 软件工程——系统流程图符号及案例
- Android中计步器的实现
- 搜狗输入法在idea打不了汉字_IDEA下搜狗输入法输入中文时卡着不动的参考解决方法...
- 家用宽带搭建个人服务器(二)
- 如何快速删除 Word 文档中的分页符
- 前端工程化——脚手架及自动化构建
- 计算机毕业设计ssm家具商城hog7l系统+程序+源码+lw+远程部署
- 与Mr. Zuul男神的亲密接触 | 温哥华峰会Day3
- KEIL-51单片机实现自定义bootloader,用于程序更新 研究