1)资料下载:点击资料即可下载

2)对正点原子Linux感兴趣的同学可以加群讨论:935446741

3)关注正点原子公众号,获取最新资料更新

本章我们将向大家介绍探索者 STM32F4 开发板自带的一个光敏传感器,本章还是要用

到 ADC 采集,通过 ADC 采集电压,获取光敏传感器的电阻变化,从而得出环境光线的变

化,并在 TFTLCD 上面显示出来。本章将分为如下几个部分:

25.1 光敏传感器简介

25.2 硬件设计

25.3 软件设计

25.4 下载验证

25.1 光敏传感器简介

光敏传感器是最常见的传感器之一,它的种类繁多,主要有:光电管、光电倍增管、光

敏电阻、光敏三极管、太阳能电池、红外线传感器、紫外线传感器、光纤式光电传感器、色

彩传感器、CCD 和 CMOS 图像传感器等。光传感器是目前产量最多、应用最广的传感器之

一,它在自动控制和非电量电测技术中占有非常重要的地位。

光敏传感器是利用光敏元件将光信号转换为电信号的传感器,它的敏感波长在可见光波

长附近,包括红外线波长和紫外线波长。光传感器不只局限于对光的探测,它还可以作为探

测元件组成其他传感器,对许多非电量进行检测,只要将这些非电量转换为光信号的变化即

可。

探索者 STM32F4 开发板板载了一个光敏二极管(光敏电阻),作为光敏传感器,它对

光的变化非常敏感。光敏二极管也叫光电二极管。光敏二极管与半导体二极管在结构上是类

似的,其管芯是一个具有光敏特征的 PN 结,具有单向导电性,因此工作时需加上反向电压。

无光照时,有很小的饱和反向漏电流,即暗电流,此时光敏二极管截止。当受到光照时,饱

和反向漏电流大大增加,形成光电流,它随入射光强度的变化而变化。当光线照射 PN 结时,

可以使 PN 结中产生电子一空穴对,使少数载流子的密度增加。这些载流子在反向电压下漂

移,使反向电流增加。因此可以利用光照强弱来改变电路中的电流。

利用这个电流变化,我们串接一个电阻,就可以转换成电压的变化,从而通过 ADC 读

取电压值,判断外部光线的强弱。

本章,我们利用 ADC3 的通道 5(PF7)来读取光敏二极管电压的变化,从而得到环境

光线的变化,并将得到的光线强度,显示在 TFTLCD 上面。关于 ADC 的介绍,前面两章已

经有详细介绍了,这里我们就不再细说了。

25.2 硬件设计

本实验用到的硬件资源有:

1) 指示灯 DS0

2) TFTLCD 模块

3) ADC

4) 光敏传感器

前三个之前均有介绍,光敏传感器与 STM32F4 的连接如图 25.2.1 所示:

图 25.2.1 光敏传感器与 STM32F4 连接示意图

图中,LS1 是光敏二极管(实物在开发板摄像头接口右侧),R58 为其提供反向电压,

当环境光线变化时,LS1 两端的电压也会随之改变,从而通过 ADC3_IN5 通道,读取

LIGHT_SENSOR(PF7)上面的电压,即可得到环境光线的强弱。光线越强,电压越低,光

线越暗,电压越高。

25.3 软件设计

打开本章实验工程可以看到,在 HAL 库文件中,我们跟上一讲的实验是一样的,添加

了 adc 相关的库函数文件 stm32f4xx_hal_adc.c 和对应头文件的支持。同时,我们在

HARDWARE 分组下新建了 adc3.c 和 lsens.c 源文件,以及包含了它们对应的头文件。因为

本实验我们主要是使用 ADC3 去测量关敏二极管的电压变化,所以大部分知识我们在前面

ADC 实验部分都有所讲解,这里我们就略带而过。打开 lsens.c,代码如下:

//初始化光敏传感器

void Lsens_Init(void)

{

GPIO_InitTypeDef GPIO_Initure;

__HAL_RCC_GPIOF_CLK_ENABLE();

//开启 GPIOF 时钟

GPIO_Initure.Pin=GPIO_PIN_7;

//PF7

GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟

GPIO_Initure.Pull=GPIO_NOPULL;

//不带上下拉

HAL_GPIO_Init(GPIOF,&GPIO_Initure);

Adc3_Init();//初始化 ADC3

}

//读取 Light Sens 的值

//0~100:0,最暗;100,最亮

u8 Lsens_Get_Val(void)

{

u32 temp_val=0;

u8 t;

for(t=0;t<LSENS_READ_TIMES;t++)

{

temp_val+=Get_Adc3(ADC_CHANNEL_5);

//读取 ADC 值,通道 5

delay_ms(5);

}

temp_val/=LSENS_READ_TIMES;//得到平均值

if(temp_val>4000)temp_val=4000;

return (u8)(100-(temp_val/40));

}

这里就 2 个函数,其中:Lsens_Init 用于初始化光敏传感器,其实就是初始化 PF7 为模

拟输入,然后通过 Adc3_Init 函数初始化 ADC3 的通道 ADC_Channel_5。Lsens_Get_Val 函

数用于获取当前光照强度,该函数通过 Get_Adc3 得到通道 ADC_Channel_5 转换的电压值,

经过简单量化后,处理成 0~100 的光强值。0 对应最暗,100 对应最亮。

接下来我们看看 adc3.c 源文件代码:

ADC_HandleTypeDef ADC3_Handler;//ADC 句柄

//初始化 ADC

//ch: ADC_channels

//通道值 0~16 取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16

void Adc3_Init(void)

{

ADC3_Handler.Instance=ADC3;

ADC3_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;

//4 分频,ADCCLK=PCLK2/4=84/4=21MHZ

ADC3_Handler.Init.Resolution=ADC_RESOLUTION_12B;

//12 位模式

ADC3_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT; //右对齐

ADC3_Handler.Init.ScanConvMode=DISABLE;

//非扫描模式

ADC3_Handler.Init.EOCSelection=DISABLE;

//关闭 EOC 中断

ADC3_Handler.Init.ContinuousConvMode=DISABLE;

//关闭连续转换

ADC3_Handler.Init.NbrOfConversion=1;

//1 个转换在规则序列中 也就是只转换规则序列 1

ADC3_Handler.Init.DiscontinuousConvMode=DISABLE; //禁止不连续采样模式

ADC3_Handler.Init.NbrOfDiscConversion=0; //不连续采样通道数为 0

ADC3_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START; //软件触发

ADC3_Handler.Init.ExternalTrigConvEdge=

ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发

ADC3_Handler.Init.DMAContinuousRequests=DISABLE; //关闭 DMA 请求

HAL_ADC_Init(&ADC3_Handler); //初始化

}

//ADC 底层驱动,引脚配置,时钟使能

//此函数会被 HAL_ADC_Init()调用

//hadc:ADC 句柄

void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)

{

__HAL_RCC_ADC3_CLK_ENABLE(); //使能 ADC3 时钟

}

//获得 ADC 值

//ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16

//返回值:转换结果

u16 Get_Adc3(u32 ch)

{

ADC_ChannelConfTypeDef ADC1_ChanConf;

ADC1_ChanConf.Channel=ch; //通道

ADC1_ChanConf.Rank=1; //1 个序列

ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES; //采样时间

ADC1_ChanConf.Offset=0;

HAL_ADC_ConfigChannel(&ADC3_Handler,&ADC1_ChanConf); //通道配置

HAL_ADC_Start(&ADC3_Handler); //开启 ADC

HAL_ADC_PollForConversion(&ADC3_Handler,10); //轮询转换

return (u16)HAL_ADC_GetValue(&ADC3_Handler);

//返回最近一次 ADC1 规则组的转换结果

}

这里,Adc3_Init 函数几乎和 ADC_Init 函数一模一样,这里我们设置了 ADC3_CH5 的

相关参数,但是没有设置对应 IO为模拟输入,因为这个在Lsens_Init函数已经实现。Get_Adc3

用于获取 ADC3 某个通道的转换结果。

因为我们前面对 ADC 有了详细的讲解,所以本章实验源码部分讲解就比较简单。接下

来我们看看主函数:

int main(void)

{

u8 adcx;

HAL_Init(); //初始化 HAL 库

Stm32_Clock_Init(336,8,2,7); //设置时钟,168Mhz

delay_init(168); //初始化延时函数

uart_init(115200); //初始化 USART

usmart_dev.init(84);

//初始化 USMART

LED_Init();

//初始化 LED

KEY_Init();

//初始化 KEY

LCD_Init();

//初始化 LCD

Lsens_Init();

//初始化光敏传感器

POINT_COLOR=RED;

LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");

LCD_ShowString(30,70,200,16,16,"LSENS TEST");

LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");

LCD_ShowString(30,110,200,16,16,"2014/5/7");

POINT_COLOR=BLUE;//设置字体为蓝色

LCD_ShowString(30,130,200,16,16,"LSENS_VAL:");

while(1)

{

adcx=Lsens_Get_Val();

LCD_ShowxNum(30+10*8,130,adcx,3,16,0);//显示 ADC 的值

LED0=!LED0;

delay_ms(250);

}

}

此部分代码也比较简单,初始化各个外设之后,进入死循环,通过 Lsens_Get_Val 获取

光敏传感器得到的光强值(0~100),并显示在 TFTLCD 上面。

代码设计部分就为大家讲解到这里,下面我们开始下载验证。

25.4 下载验证

在代码编译成功之后,我们通过下载代码到 ALIENTEK 探索者 STM32F4 开发板上,

可以看到 LCD 显示如图 25.4.1 所示:

图 25.4.1 光敏传感器实验测试图

伴随 DS0 的不停闪烁,提示程序在运行。此时,我们可以通过给 LS1 不同的光照强度,

来观察 LSENS_VAL 值的变化,光照越强,该值越大,光照越弱,该值越小。

stm32 adc输入电压范围_正点原子【STM32-F407探索者】第二十五章 光敏传感器实验...相关推荐

  1. 【正点原子MP157连载】第二十五章 pinctrl和gpio子系统实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  2. 【正点原子FPGA连载】第二十五章HDMI方块移动实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  3. 正点原子探索者原理图_正点原子【STM32-F407探索者】第六章 跑马灯实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 http://weixin.qq.com/r/hEhUT ...

  4. linux键盘设置的文件在哪个文件夹,「正点原子Linux连载」第十五章按键输入试验...

    原标题:「正点原子Linux连载」第十五章按键输入试验 第十五章按键输入试验 前面几章试验都是讲解如何使用I.MX6U的GPIO输出控制功能,I.MX6U的IO不仅能作为输出,而且也可以作为输入.I. ...

  5. 【正点原子MP157连载】第十六章 基本定时器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  6. 【正点原子FPGA连载】第十四章 串口通信实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  7. 【正点原子FPGA连载】 第二十九章TFT LCD画板实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  8. 【正点原子MP157连载】第二十六章 DS18B20数字温度传感器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  9. 【正点原子MP157连载】第二十四章 设备树下的LED驱动实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

最新文章

  1. 分享jQuery对象和Javascript对象之间的转换代码
  2. visual studio 阅读 linux-kernel
  3. [BZOJ4766]文艺计算姬
  4. 关于python搞笑段子_Python爬取内涵段子里的段子
  5. CLI or GUI --- 要高效还是要易用? (该文作者的功底真的很深厚啊)
  6. Java中int[]与Integer[]相互转化的方法
  7. Dcloud+mui 压缩上传图片到服务器
  8. python计算期望值_机器学习:计算方差时为何除以n-1
  9. Nutanix,在转型的道路上越走越远 | 人物志
  10. switch 条件判断_C语言学习第7篇---C语言三大结构之一判断结构
  11. zigbee无线通信数码管实验、usbDongle抓包、发字符串
  12. java视频切片_使用ffmpeg视频切片并加密和视频AES-128加密后播放
  13. 信息必填的php,php - {“成功”:0,“消息”:“必填字段丢失”}在本地主机上测试文件 - 堆栈内存溢出...
  14. 共轭梯度法(Conjugate gradient)详解
  15. 解决谷歌浏览器安装插件失败:无法从该网站添加应用、扩展程序和用户脚本
  16. 2020同济大学电子与信息工程学院计算机系夏令营机试题目
  17. [python]学习过程小例子
  18. GAMES101笔记_Lec07~09_着色 Shading
  19. 第4季2:并口、MIPI、LVDS的简介
  20. Easy EDA #学习笔记06# | L9110S H桥2路直流电机驱动板设计(附.4056 充电、过充过放保护电路设计)

热门文章

  1. 5.2凯撒密码-加密python
  2. 安装mmcv和mmseg
  3. 【C语言】打印九九乘法表
  4. 如何在CSDN上赚钱:CSDN收益渠道分析
  5. 329_S32K144 CAN波特率修改
  6. 一个非常好用的自制Shell小程序 File Creator
  7. 一个txt文档 访问直接下载
  8. Java打印一个比较好看的表白爱心
  9. 自走棋还没凉?腾讯有了《多多自走棋》还要上线《战歌竞技场》?
  10. 如何升级oracle版本?(11.2.0.1至11.2.0.4)