搜索
bottom↓
回复: 0

《MiniPro STM32H750 开发指南》第三十三章 光敏传感器实验

[复制链接]

出0入234汤圆

发表于 2022-9-15 09:41:52 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2022-9-15 09:41 编辑

1)实验平台:正点原子MiniPro STM32H750开发板
2)平台购买链接:https://detail.tmall.com/item.htm?id=677017430560
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar
4)MiniPro STM32H750技术交流QQ群:756580169 lQLPJxaFi2zaB4UWWrDAMgIsFEW2pwLb3abnwDMA_90_22.png
lQDPJxaFi2nfFizMjM0CbLCPlxn_FVheIQLb3aGrwFQA_620_140.jpg

lQLPJxaFi2nfFhLMkM0BXrDNvOUyeU_FPgLb3aGvQNIA_350_144.png


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


本章,我们将学习使用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. 原理图
我们主要来看看光敏传感器和开发板的连接,如下图所示:
第三十三章 光敏传感器实验1228.png
图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 程序流程图
第三十三章 光敏传感器实验2150.png
图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所示:
第三十三章 光敏传感器实验5022.png
图33.4.1 光敏传感器实验测试图

我们可以通过给LS1不同的光照强度,来观察LSENS_VAL值的变化,光照越强,该值越大,光照越弱,该值越小,LSENS_VAL值的范围是0~100。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 13:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表