摘要
本文主要介绍了国信长天蓝桥杯嵌入式开发板及其扩展板上光敏电阻的使用。
硬件原理图
光敏电阻的电阻值会随着光强的变化而变化。光越强,电阻值越小,光越暗,电阻值越大。
从上图可以看出,定值电阻R46与光敏电阻R当光线增强时,47形成欧姆分压电路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
连接到PA4
,Tr_DO
连接到PA3
。
使用光敏电阻的步骤
下面将基于硬件原厂提供的显示屏示例代码:HAL_06_LCD
介绍ADC使用步骤:
双击Drivers/STM32G4xx_HAL_Driver,在向上一级
-> Drivers
-> STM32G4xx_HAL_Driver
-> Src
中,找到stm32g4xx_hal_adc.c
和 stm32g4xx_hal_adc_ex.c
并添加。添加后如下图所示:
找到文件并打开以下位置: 取消注释 #define HAL_ADC_MODULE_ENABLED
取下注释后,如下图所示:
在 main.c
添加适当的位置 #include "stm32g4xx_hal_adc.h"
,添加后如下图所示:
复制下面的代码,粘贴到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()
函数中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);
用手遮住光敏电阻或者使用灯光照射光敏电阻,可以看到屏幕上数字的变化。
作者:我是鹏老师