传感器模块(光敏电阻/热敏电阻/红外接收管等)介绍及使用

本文介绍了如何使用STM32平台配合NTC热敏电阻和光敏模块,实现模拟量和数字量输出。详细讲解了电路原理、模拟量ADC读取及数字量DO控制的代码示例。通过热敏电阻感知温度变化,LED和电压比较器辅助理解传感器工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图1 各式传感器模块

其实一些简单的传感器模块使用的都是同一个电路,就比如光敏模块、热敏模块以及红外接收管等,用的都是图2的电路,改变的也就是电路中N1的属性,如果将热敏电阻放到N1位置上,那么就可以组成一个热敏模块。

图2 内部电路图

引脚和器件说明

VCC:电源正极 3.3V—5V

GND:电源负极

DO(Digital Output):数字量输出接口

AO(Analog Output):模拟量输出接口

LED1:电源指示灯

LED2:数字量输出指示灯

LM393:在此用作电压比较器

R2:电位器(用于调节模块的灵敏度)

电路原理(以NTC热敏模块为例)

1,模拟量输出原理

由图可知,模拟输出口通过网路标签接到了R1与热敏电阻中间,此时AO口的电压为

U=(VCC-GND)R_n1/(R_n1+R1),当NTC热敏电阻( NTC是英文Negative Temperature Coefficient的缩写。 其含义为负温度系数 。它的电阻值随温度的升高而降低。)的温度上升后,其阻值将会下降,因此热敏电阻分的电压会降低,AO口的电压也随之降低,同理可得,当热敏电阻的温度降低后,AO口的电压将会上升,其赋值将在VCC至GND之间变化。

下面给大家在STM32下接受AO口模拟量的代码

void AD_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);              //开启时钟
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);                       //ADC分频器(CLOCK信号),72MHz/6=12MHz
		
	GPIO_InitTypeDef GPIO_InitStruture;
	GPIO_InitStruture.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStruture.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruture);                    //配置模拟数据输入通道
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);    //配置多路开关
	
	ADC_InitTypeDef ADC_InitStruture;
	ADC_InitStruture.ADC_Mode = ADC_Mode_Independent;                    //模数转换方式,ADC_Mode_Independent(独立模式):ADC1与ADC2互不干扰
	ADC_InitStruture.ADC_DataAlign = ADC_DataAlign_Right;                //数据对齐方式
	ADC_InitStruture.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;   //触发源选择,ADC_ExternalTrigConv_None(内部软件触发)
	ADC_InitStruture.ADC_ContinuousConvMode = DISABLE;                   //连续转换模式选择,DISABLE(单次转换)
	ADC_InitStruture.ADC_ScanConvMode = DISABLE;                         //扫描模式选择,DISABLE(非扫描模式)
	ADC_InitStruture.ADC_NbrOfChannel = 1;                               //需要几个通道,非扫描模式只有1位有效,此时此参数无效
	ADC_Init(ADC1,&ADC_InitStruture);
	
	ADC_Cmd(ADC1,ENABLE);                                  //开关控制
	
	ADC_ResetCalibration(ADC1);
	while((ADC_GetResetCalibrationStatus(ADC1)) == SET);    //复位校准
	ADC_StartCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1) == SET);           //开始校准
}

uint16_t AD_GetValue(void)
{
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //软件触发
	while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //检测标志位
	return ADC_GetConversionValue(ADC1);                   //AD转换后得到的数值:0-4096
}

 只要不断调用uint16_t AD_GetValue(void)函数,就可以接受到AO口的模拟量的值,但是这个函数返回的数值是一个整数,其数值变化范围为0—4096,如果返回为0,则代表AO的电压为0,如果为4096,则代表AO的电压为VCC,所以想要精确得到AO的电压,还需加上。

ADValue = AD_GetValue();
Voltage = (float)ADValue / 4095 * VCC;      //VCC需自己定义

此时Voltage就为AO口的模拟电压值。

 2、数字量输出原理

先给大家介绍一下,电压比较器工作过程,当用LM393电压比较器时,如果阳极电压大于阴极电压,那么输出将会使高电平,如果阴极电压大于阳极电压,将会输出低电平。

由图2可知,DO是LM393电压比较器的输出端,其阳极连接到了R1电阻与N1电阻之间,作被比较电压,而阴极接到了一个电位器上,作校准电压,所以当阳极的电压大于校准电压时,LM393电压比较器DO端口输出高电位,反之亦然,但是DO口本就通过电阻连接VCC,所以DO口默认输出高电位,只有当被比较电压低于校准电压时,DO口才输出低电压,此时LED2灯发光。

灵敏度调节:灵敏度调节是通过R2电位器进行调节的,当电位器端的电压调的较小时,也就是电压比较器的阴极电压比较小时,NTC热敏电阻将需要承受更高的温度,才能使阳极电压小于阴极电压,从而输出低电位。

下面给大家在STM32下接受DO口数字量的代码

void LightSensor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);          //开启时钟
	
	GPIO_InitTypeDef GPIO_InitStruture;
	GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU;                  //上拉输入模式
	GPIO_InitStruture.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruture); 
}

uint8_t LightSensor_Get(void)
{
	return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);             //读取端口电平
}

 调用uint8_t LightSensor_Get(void)函数,将返回端口的值,高电位时返回1,低电位返回0.

在这里提醒一下,因为DO口默认为高电位,因此读取时,设置IO端口为上拉输入模式是最好的。

要是觉得文章对你有帮助,那就给一个小小的赞吧。

 

<think>嗯,用户想了解光敏电阻传感器的程序设计流程,特别是编程流程图和步骤。首先,我需要回忆一下光敏传感器的工作原理。光敏电阻的阻值会随光照强度变化,通常光照越强,阻值越低,反之亦然。所以在编程时,需要读取这个变化的阻值,并将其转换为数字信号进行处理。 接下来,用户提到了参考的四个引用内容。引用1和3提到了使用Keil uVision5配置STM32的模拟输入引脚,读取光敏传感器的值,然后控制LED。引用2和4讨论了传感器连接和应用场景。这些信息应该整合到程序设计的步骤中。 首先,硬件连接部分。根据引用2,光敏传感器需要连接到微控制器的ADC引脚,可能需要分压电路。而引用3提到具体的原理图连接,比如PA1引脚通过跳线选择连接到光敏电阻。所以程序设计的第一步应该是正确配置硬件连接,确保传感器输出连接到正确的ADC通道。 然后是软件配置。根据引用1和3,需要初始化ADC模块,配置模拟输入引脚。比如在STM32中,可能需要启用ADC时钟,配置GPIO为模拟输入模式,设置ADC的分辨率、采样时间等参数。同时,如果使用PWM控制LED亮度,还需要配置定时器和PWM输出通道。 接下来是主循环中的处理。主循环中需要不断读取ADC的值,将其转换为光照强度。可能需要做一些滤波处理,比如移动平均滤波,避免噪声干扰。然后根据预设的阈值或映射关系,调整LED的亮度。例如,当光照低于某个值时,增加LED亮度,反之则降低。 此外,用户可能需要流程图。流程图应该包括初始化硬件、配置ADC、读取数据、处理数据、控制输出这几个步骤。可能还需要考虑中断处理,比如使用定时器中断定期采样,或者使用DMA传输数据以提高效率。 还要注意引用4提到的自动化控制系统的应用,这可能涉及到更复杂的控制逻辑,比如PID调节,但用户的问题集中在程序设计流程,所以基础步骤可能就足够了。需要确保步骤清晰,逻辑正确,并符合嵌入式编程的常规流程。 最后,生成相关问题时要围绕程序设计可能遇到的难点、优化方法、硬件连接注意事项等。例如,如何校准传感器,如何处理ADC噪声,或者如何实现动态调整阈值等功能。 总结一下,程序设计流程应包括硬件连接、初始化配置、主循环处理数据和控制输出,每个步骤需要结合引用中的具体配置方法,并给出代码示例。流程图可以用文字描述,分步骤说明。确保引用标注正确,比如ADC配置引用1和3,硬件连接引用2和3,应用场景引用4。</think>### 光敏电阻传感器程序设计流程及步骤 #### 1. **硬件连接与配置** - **传感器电路连接**: 光敏电阻需要与分压电阻串联,输出模拟电压信号到微控制器的ADC引脚(如STM32的PA1)[^2][^3]。 例如:光敏电阻一端接VCC,另一端接ADC引脚和下拉电阻到GND。 - **LED控制配置**: 若需控制LED亮度,需配置PWM输出引脚(如TIM2_CH1对应的GPIO)[^1]。 #### 2. **软件初始化** - **ADC配置**: 启用ADC时钟,设置模拟输入引脚模式,配置ADC参数(分辨率、采样时间)。 ```c // 示例代码(STM32 HAL库) ADC_HandleTypeDef hadc; hadc.Instance = ADC1; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.ContinuousConvMode = ENABLE; HAL_ADC_Init(&hadc); ``` - **PWM配置**(可选): 初始化定时器通道,设置PWM频率和占空比范围[^1]。 #### 3. **主程序设计流程** ```mermaid graph TD A[系统初始化] --> B[ADC校准] B --> C[开启ADC连续转换] C --> D[读取ADC原始值] D --> E[转换为光照强度] E --> F[根据阈值控制LED] F --> D ``` **详细步骤**: 1. **读取ADC值**:通过轮询或中断方式获取光敏电阻的电压值。 ```c HAL_ADC_Start(&hadc); uint32_t raw_value = HAL_ADC_GetValue(&hadc); ``` 2. **数据滤波**:对ADC值进行滑动平均滤波,减少噪声干扰。 ```c // 示例:5次滑动平均 static uint32_t buffer[5] = {0}; buffer[index] = raw_value; uint32_t avg_value = (buffer[0] + buffer[1] + ... + buffer[4]) / 5; ``` 3. **映射为光照强度**:根据电路参数将电压值转换为光照度(需实验标定)。 ```c // 示例:线性映射(假设0-3.3V对应0-1000 Lux) float voltage = (avg_value / 4095.0) * 3.3; float lux = voltage * 303.03; // 标定系数 ``` 4. **控制逻辑**: - **阈值控制**:若光照低于阈值,则点亮LED或调整PWM占空比[^1]。 ```c if (lux < 200) { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); } ``` - **动态调光**:通过PWM实现亮度渐变(如`TIMx->CCR1 = pwm_value`)。 #### 4. **调试与优化** - **校准传感器**:在不同光照下记录ADC值,建立电压-光照度关系表[^4]。 - **抗干扰设计**:增加硬件滤波电容或软件中值滤波。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值