【国信长天蓝桥杯】扩展板⑦ 光敏电阻的使用

摘要

本文章主要基于国信长天蓝桥杯嵌入式开发板及其扩展板,介绍了扩展板上光敏电阻的使用方法。
在这里插入图片描述

硬件原理图

光敏电阻原理图
光敏电阻的阻值会随着光照强度的变化而变化,光照越强阻值越小,光线越暗阻值越大。

从上图可以看出,定值电阻R46与光敏电阻R47组成了一个欧姆分压电路,当光线增强时,光敏电阻R47的阻值减小,Tr_AO的电压降低;当光线减弱时,光敏电阻R47的阻值增大,Tr_AO的电压增大。

另外,Tr_AO连接到运算放大器LM393的正向输入端(3号脚),LM393的反向输入端(2号脚)连接在可调电阻RP7上,当3号脚的电压高于2号脚的电压时,Tr_DO输出高电平,当3号脚的电压低于2号脚的电压时,Tr_Do输出低电平。

调节可调电阻RP7可设定2号脚的电压,相当于是调节光敏电阻的阈值

扩展板与主板连接后,调节跳线帽,可是Tr_AO连接到PA4Tr_DO连接到PA3

光敏电阻使用步骤

下面将基于硬件原厂提供的显示屏示例代码:HAL_06_LCD 介绍ADC的使用步骤:

① 添加 stm32g4xx_hal_adc.c,stm32g4xx_hal_adc_ex.c

双击Drivers/STM32G4xx_HAL_Driver,打开添加文件对话框,在向上一级 -> Drivers -> STM32G4xx_HAL_Driver -> Src中,找到stm32g4xx_hal_adc.c stm32g4xx_hal_adc_ex.c 并添加。添加后如下图所示:
在这里插入图片描述

② 修改 stm32g4xx_hal_conf.h 文件

在如下位置找到该文件,并打开:
在这里插入图片描述
取消注释 #define HAL_ADC_MODULE_ENABLED 这一行,取下注释后如下图所示:
在这里插入图片描述

main.c 添加 #include "stm32g4xx_hal_adc.h"

main.c 适当位置添加 #include "stm32g4xx_hal_adc.h",添加后如下图所示:
在这里插入图片描述

④ 复制如下 ADC 按键初始化及获取ADC按键值的代码

复制下面的代码,粘贴到main.c文件 main()函数上面空白处

ADC_HandleTypeDef hadc2;

uint16_t Get_ADC2_Value(void)
{
	uint16_t adc_value = 0;
	
	HAL_ADC_Start(&hadc2);
	adc_value = HAL_ADC_GetValue(&hadc2);

	return adc_value;
}

static void ADC2_Init(void)
{
	ADC_ChannelConfTypeDef sConfig = {0};
	RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
	PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
	HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
	
	__HAL_RCC_ADC12_CLK_ENABLE();//打开ADC时钟
	__HAL_RCC_GPIOA_CLK_ENABLE();//打开GPIO A时钟
	
	hadc2.Instance = ADC2;
	hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
	hadc2.Init.Resolution = ADC_RESOLUTION_12B;
	hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
	hadc2.Init.GainCompensation = 0;
	hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
	hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
	hadc2.Init.LowPowerAutoWait = DISABLE;
	hadc2.Init.ContinuousConvMode = DISABLE;
	hadc2.Init.NbrOfConversion = 1;
	hadc2.Init.DiscontinuousConvMode = DISABLE;
	hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;
	hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
	hadc2.Init.DMAContinuousRequests = DISABLE;
	hadc2.Init.Overrun = ADC_OVR_DATA_PRESERVED;
	hadc2.Init.OversamplingMode = DISABLE;
	
	HAL_ADC_Init(&hadc2);
	
	sConfig.Channel = ADC_CHANNEL_17; //设置采样通道为17(PA4引脚)
	sConfig.Rank = ADC_REGULAR_RANK_1;
	sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
	sConfig.SingleDiff = ADC_SINGLE_ENDED;
	sConfig.OffsetNumber = ADC_OFFSET_NONE;
	sConfig.Offset = 0;
	
	HAL_ADC_ConfigChannel(&hadc2, &sConfig);
	
	GPIO_InitStruct.Pin = GPIO_PIN_4;
	GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化PA4脚为模拟模式
	HAL_ADC_Start(&hadc2);
}

static void Photo_Status_Init(void) //读取Tr_DO电平高低
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	GPIO_InitStruct.Pin = GPIO_PIN_3;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化PA3脚为输入模式
}

上述代码中包含了Tr_AO与Tr_DO数据的读取,考生根据题目要求,按需复制。

⑤ 在main() 中调用 ADC2_Init();Photo_Status_Init()

如下图所示,在main() 函数中LCD_Init();下面调用 ADC2_Init();Photo_Status_Init()

在这里插入图片描述

⑥ 获取光敏电阻值及其状态

main()while()中插入如下代码:

		char buf[64] = { 0 };
		int adc_value =  Get_ADC2_Value();
		int p_status =  HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3);
		
		sprintf(buf, "Photo Value is %d  ", adc_value);
		LCD_DisplayStringLine(Line3, (u8*)buf);
		
		sprintf(buf, "Photo Status is %d  ", p_status);
		LCD_DisplayStringLine(Line5, (u8*)buf);

在这里插入图片描述

⑦ 运行效果

在这里插入图片描述

用手遮住光敏电阻或者使用灯光照射光敏电阻,可以看到屏幕上数字的变化。

如果此文章对你有帮助,欢迎点赞 关注 收藏 转发.

作者:我是鹏老师

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值