1)实验平台:正点原子MiniPro H750开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-336836-1-1.html
4)对正点原子STM32感兴趣的同学可以加群讨论:879133275

第三十三章 光敏传感器实验

本章,我们将学习使用MiniPRO STM32H750开发板板载的一个光敏传感器。我们还是要使用到ADC采集,通过ADC采集电压,获取光敏传感器的电阻变化,从而得出环境光线的变化,并在TFTLCD上面显示出来。
本章分为如下几个小节:
33.1 光敏传感器简介
33.2 硬件设计
33.3 程序设计
33.4 下载验证

33.1 光敏传感器简介
光敏传感器是最常见的传感器之一,它的种类繁多,主要有:光电管、光电倍增管、光敏电阻、光敏三极管、太阳能电池、红外线传感器、紫外线传感器、光纤式光电传感器、色彩传感器、CCD和CMOS图像传感器等。光传感器是目前产量最多、应用最广的传感器之一,它在自动控制和非电量电测技术中占有非常重要的地位。
光敏传感器是利用光敏元件将光信号转换为电信号的传感器,它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光传感器不只局限于对光的探测,它还可以作为探测元件组成其它传感器,对许多非电量进行检测,只要将这些非电量转换为光信号的变化即可。
MiniPRO STM32H750开发板板载了一个光敏二极管(光敏电阻),作为光敏传感器,它对光的变化非常敏感。光敏二极管也叫光电二极管。光敏二极管与半导体二极管在结构上是类似的,其管芯是一个具有光敏特征的PN结,具有单向导电性,因此工作时需加上反向电压。无光照时,有很小的饱和反向漏电流,即暗电流,此时光敏二极管截止。当受到光照时,饱和反向漏电流大大增加,形成光电流,它随入射光强度的变化而变化。当光线照射PN结时,可以使PN结中产生电子一空穴对,使少数载流子的密度增加。这些载流子在反向电压下漂移,使反向电流增加。因此可以利用光照强弱来改变电路中的电流。
利用这个电流变化,我们串接一个电阻,就可以转换成电压的变化,从而通过ADC读取电压值,判断外部光线的强弱。
本实验利用ADC3的通道11(PC1)来读取光敏二极管电压的变化,从而得到环境光线的变化,并将得到的光线强度,显示在TFTLCD上面。关于ADC的介绍,前面已经有详细介绍了,这里我们就不再细说了。
33.2 硬件设计

  1. 例程功能
    通过ADC3的通道11(PC1)读取光敏传感器(LS1)的电压值,并转换为0~100的光线强度值,显示在LCD模块上面。光线越亮,值越大;光线越暗,值越小。大家可以用手指遮挡LS1和用手电筒照射LS1,来查看光强变化。LED0闪烁用于提示程序正在运行。
  2. 硬件资源
    1)RGB灯
    RED : LED0 - PB4
    2)串口1(PA9/PA10连接在板载USB转串口芯片CH340上面)
    3)正点原子2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
    4)ADC3 :通道11 - PC1
    5)光敏传感器 - PC1
  3. 原理图
    我们主要来看看光敏传感器和开发板的连接,如下图所示:

图33.2.1 光敏传感器与开发板连接示意图
图中,LS1是光敏二极管(实物在开发板5V排针(VOUT2)上面),R28为其提供反向电压,当环境光线变化时,LS1两端的电压也会随之改变,从而通过ADC3_IN11通道,读取LIGHT_SENSOR(PC1)上面的电压,即可得到环境光线的强弱。光线越强,电压越低,光线越暗,电压越高。
33.3 程序设计
33.3.1 ADC的HAL库驱动
本实验用到的ADC的HAL库API函数前面都介绍过,具体调用情况请看程序解析部分。下面介绍读取光敏传感器ADC值的配置步骤。
读取光敏传感器ADC值配置步骤
1)开启ADCx和ADC通道对应的IO时钟,并配置该IO为模拟功能
首先开启ADCx的时钟,然后配置GPIO为模拟模式。本实验我们默认用到ADC3通道11,对应IO是PC1,它们的时钟开启方法如下:
__HAL_RCC_ADC3_CLK_ENABLE (); /* 使能ADC3时钟 /
__HAL_RCC_GPIOC_CLK_ENABLE(); /
开启GPIOC时钟 */
2)设置ADC3,开启内部温度传感器
调用HAL_ADC_Init函数来设置ADC3时钟分频系数、分辨率、模式、扫描方式、对齐方式等信息。
注意:该函数会调用:HAL_ADC_MspInit回调函数来完成对ADC底层的初始化,包括:ADC3时钟使能、ADC3时钟源的选择等。
3)配置ADC通道并启动AD转换器
调用HAL_ADC_ConfigChannel()函数配置ADC3通道11,根据需求设置通道、序列、采样时间和校准配置单端输入模式或差分输入模式等。然后通过HAL_ADC_Start函数启动AD转换器。
4)读取ADC值,转换为光线强度值
这里选择查询方式读取,在读取ADC值之前需要调用HAL_ADC_PollForConversion等待上一次转换结束。然后就可以通过HAL_ADC_GetValue来读取ADC值。最后把得到的ADC值转换为0~100的光线强度值。
33.3.2 程序流程图

图33.3.2.1 光敏传感器实验程序流程图
33.3.3 程序解析

  1. LSENS驱动代码
    这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。LSENS驱动源码包括两个文件:lsens.c和lsens.h。本实验还要用到adc3.c和adc3.h文件的驱动代码。adc3.c和adc3.h文件前面已经介绍过了,就不再赘述。
    lsens.h头文件定义了一些宏定义和一些函数的声明,该宏定义如下:
/*****************************************************************************/
/* 光敏传感器对应ADC3的输入引脚和通道 定义 */
#define LSENS_ADC3_CHX_GPIO_PORT            GPIOC
#define LSENS_ADC3_CHX_GPIO_PIN             GPIO_PIN_1
#define LSENS_ADC3_CHX_GPIO_CLK_ENABLE()
do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0)  /* PC口时钟使能 */
#define LSENS_ADC3_CHX           ADC_CHANNEL_11         /* 通道Y,  0 <= Y <= 19 */
/*****************************************************************************/
这些宏定义分别是PC1及其时钟使能的宏定义,还有ADC通道11的宏定义。
下面介绍lsens.c的函数,首先是光敏传感器初始化函数,其定义如下:
/*** @brief       初始化光敏传感器* @param       无* @retval      无*/
void lsens_init(void)
{GPIO_InitTypeDef gpio_init_struct;LSENS_ADC3_CHX_GPIO_CLK_ENABLE ();                       /* 使能对应IO时钟 */gpio_init_struct.Pin = LSENS_ADC3_CHX_GPIO_PIN;  /* PC1 */gpio_init_struct.Mode = GPIO_MODE_ANALOG;         /* 模拟 */HAL_GPIO_Init(LSENS_ADC3_CHX_GPIO_PORT, &gpio_init_struct);adc3_init();    /* 初始化ADC3 */
}

该函数初始化PC1为模拟功能,然后通过adc3_init函数初始化ADC3。
最后是读取光敏传感器值,函数定义如下:

/*** @brief       读取光敏传感器值* @param       无* @retval      0~100:0,最暗;100,最亮*/
uint8_t lsens_get_val(void)
{uint32_t temp_val = 0;
/* 读取平均值 */temp_val = adc3_get_result_average(g_adc3_handle, LSENS_ADC3_CHX, 10); temp_val /= 655;if (temp_val > 100)temp_val = 100;return (uint8_t)(100 - temp_val);
}

lsens_get_val函数用于获取当前光照强度,该函数通过adc3_get_result_average函数得到通道11转换的电压值,经过简单量化后,处理成0~100的光强值。0对应最暗,100对应最亮。
2. main.c代码
在main.c里面编写如下代码:

int main(void)
{short adcx;sys_cache_enable();                         /* 打开L1-Cache */HAL_Init();                                 /* 初始化HAL库 */sys_stm32_clock_init(240, 2, 2, 4);    /* 设置时钟, 480Mhz */delay_init(480);                          /* 延时初始化 */usart_init(115200);                      /* 串口初始化为115200 */mpu_memory_protection();                  /* 保护相关存储区域 */led_init();                                   /* 初始化LED */lcd_init();                                     /* 初始化LCD */
lsens_init();                                   /* 初始化光敏传感器 */lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);lcd_show_string(30, 70, 200, 16, 16, "LSENS TEST", RED);lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
lcd_show_string(30, 110, 200, 16, 16, "LSENS_VAL:", BLUE);while (1){ adcx = lsens_get_val();lcd_show_xnum(30 + 10 * 8, 110, adcx, 3, 16, 0, BLUE); /* 显示光线强度值 */LED0_TOGGLE();  /* LED0闪烁,提示程序运行 */delay_ms(250);}
}

该部分的代码逻辑很简单,初始化各个外设之后,进入死循环,通过lsens_get_val获取光敏传感器得到的光强值(0~100),并显示在TFTLCD上面。
33.4 下载验证
将程序下载到开发板后,可以看到LED0不停的闪烁,提示程序已经在运行了。LCD显示的内容如图33.4.1所示:

图33.4.1 光敏传感器实验测试图
我们可以通过给LS1不同的光照强度,来观察LSENS_VAL值的变化,光照越强,该值越大,光照越弱,该值越小,LSENS_VAL值的范围是0~100。

【正点原子STM32连载】 第三十三章 光敏传感器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1相关推荐

  1. 【正点原子STM32连载】第二十三章 OLED显示实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

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

  2. 【正点原子FPGA连载】第二十三章 DDS信号发生器实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

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

  3. 【正点原子STM32连载】第二十一章 通用定时器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

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

  4. 【正点原子STM32连载】第五十三章 DSP测试实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

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

  5. 扩展中断控制器8259实验_「正点原子FPGA连载」第十三章双核AMP实验

    1)摘自[正点原子]领航者 ZYNQ 之嵌入式开发指南 2)实验平台:正点原子领航者ZYNQ开发板 3)平台购买地址:https://item.taobao.com/item.htm?&id= ...

  6. 【正点原子STM32连载】第四章 STM32初体验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

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

  7. 【正点原子STM32连载】第四十五章 SD卡实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

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

  8. 【正点原子STM32连载】第六章 新建寄存器版本MDK工程 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

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

  9. 【正点原子STM32连载】第四十七章 汉字显示实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

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

  10. 【正点原子STM32连载】第五十七章 USB读卡器(Slave)实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

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

最新文章

  1. vue 圆形百分比进度条_vue实用组件——圆环百分比进度条
  2. [转]Visual Studio 2010帮助文件MSDN安装说明
  3. renderthread是什么_Android 旗舰机标配的高帧屏(120Hz),对各位 App 开发者有什么影响?...
  4. 【CodeVS】1023 GPA计算
  5. MySQL的NULL值
  6. 如何在 Mac 上自定 Safari 浏览器窗口?
  7. vector容器中是否应该放指针?解决方法
  8. stata进行空间自相关检验
  9. 魔兽世界私服搭建架设教程
  10. PCkit3.5烧写器直接上手使用方法
  11. 《中文版PHOTOSHOP.CS3完全自学教程》李金明.李金荣.彩色扫描版.pdf
  12. 如何用Matlab修正异方差性,matlab 异方差 white
  13. android官方原生主题,原生Android可以更换系统主题吗?
  14. APT案例调研和研究
  15. win10电脑装USB CAN 1报错代码39
  16. harbor 安装启动遇到的keng
  17. 绿竹生物上市破发:首日跌33% 募资2亿收盘市值45亿港元
  18. java打印超市消费小票_Java-超市购物小票案例-详细介绍
  19. “感动中国”2012年度人物颁奖词
  20. 在Docker容器中使用iptables时的最小权限的开启方法

热门文章

  1. 精通Javascript+jQuery视频下载地址
  2. mac系统下用wineskin安装plsql developer及数据乱码解决办法
  3. Iphone 5s 8.0.2越狱
  4. 《HBase权威指南》一第1章 简介
  5. 计算机编辑文档教程,word文档怎么编辑pdf的教程
  6. 视觉SLAM十四讲学习笔记——ch9后端1
  7. 16个大数据常见案例分享,看完别说还不懂大数据!
  8. 一文看懂Java内存模型(JMM)
  9. android模拟qq登陆,模拟qq登录
  10. 原生js格式化显示json对象以及stringify的妙用