使用STM32F103获取光敏电阻传感器数值
2025-08-26 00:43:07作者:宣海椒Queenly
1. 适用场景
STM32F103微控制器结合光敏电阻传感器的应用场景十分广泛,特别适合以下领域:
智能照明系统:根据环境光照强度自动调节LED灯的亮度,实现节能环保的智能照明控制。
农业物联网:用于温室大棚的光照监测,确保农作物获得适宜的光照条件,提高产量和质量。
智能家居:自动窗帘控制系统根据室外光照强度自动开合,室内照明系统根据自然光调节亮度。
环境监测:气象站和环保监测设备中的光照强度测量,为环境数据分析提供重要参数。
安防系统:光敏传感器可用于检测异常光照变化,触发报警或监控设备。
2. 适配系统与环境配置要求
硬件要求
- 主控芯片:STM32F103系列微控制器(如STM32F103C8T6)
- 光敏电阻:通用型光敏电阻(GL5528、GL5537等)
- 分压电阻:10kΩ精密电阻
- 开发板:STM32最小系统板或开发板
- 连接线:杜邦线若干
- 电源:3.3V或5V直流电源
软件要求
- 开发环境:Keil MDK、STM32CubeIDE或IAR Embedded Workbench
- 固件库:STM32标准外设库或HAL库
- 调试工具:ST-LINK/V2调试器
- 串口工具:用于数据输出的串口调试助手
环境配置
- 安装相应的IDE和STM32开发工具链
- 配置STM32CubeMX生成初始化代码
- 设置ADC时钟和采样时间
- 配置GPIO引脚为模拟输入模式
3. 资源使用教程
硬件连接
将光敏电阻与10kΩ电阻串联,连接至3.3V和GND之间,中间节点连接到STM32的ADC输入引脚(如PA0)。这种连接方式构成一个简单的分压电路,光敏电阻的阻值变化会导致中间节点的电压变化。
软件配置步骤
步骤1:ADC初始化
void ADC_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// 使能ADC和GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
// 配置ADC引脚为模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// ADC参数配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
// 配置ADC通道
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
// 使能ADC
ADC_Cmd(ADC1, ENABLE);
// ADC校准
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
步骤2:数据读取函数
uint16_t Read_ADC_Value(uint8_t channel)
{
ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
return ADC_GetConversionValue(ADC1);
}
float Get_Light_Intensity(void)
{
uint16_t adc_value = Read_ADC_Value(ADC_Channel_0);
float voltage = (adc_value * 3.3) / 4095.0; // 12位ADC,参考电压3.3V
return voltage; // 可根据需要转换为光照强度值
}
步骤3:主程序循环
int main(void)
{
SystemInit();
ADC_Config();
USART_Config(); // 配置串口用于输出数据
while(1)
{
float light_intensity = Get_Light_Intensity();
printf("光照强度: %.2f V\r\n", light_intensity);
Delay_ms(1000); // 每秒采样一次
}
}
数据处理与校准
为了获得更准确的光照强度值,建议进行传感器校准:
- 在完全黑暗环境下读取ADC值作为最小值
- 在标准光照条件下读取ADC值作为参考
- 建立电压与光照强度的转换公式
4. 常见问题及解决办法
问题1:ADC读数不稳定
症状:读取的ADC值跳动较大,不稳定 解决方法:
- 增加软件滤波算法,如移动平均滤波
- 调整ADC采样时间,增加采样周期
- 检查电源稳定性,添加滤波电容
- 使用硬件滤波电路
问题2:测量范围不足
症状:在强光或弱光条件下测量不准确 解决方法:
- 更换不同规格的光敏电阻
- 调整分压电阻的阻值
- 使用运算放大器进行信号调理
- 采用多量程自动切换策略
问题3:响应速度慢
症状:光照变化时响应延迟明显 解决方法:
- 优化ADC采样频率
- 减少软件处理延迟
- 使用DMA方式进行数据采集
- 选择响应速度更快的光敏电阻
问题4:温度影响明显
症状:测量结果受环境温度影响较大 解决方法:
- 进行温度补偿校准
- 选择温度系数较小的光敏电阻
- 添加温度传感器进行实时补偿
问题5:精度不足
症状:测量精度达不到要求 解决方法:
- 使用更高精度的ADC(如16位外部ADC)
- 采用多次采样求平均的方法
- 进行非线性校正
- 使用查表法进行数据转换
调试技巧
- 使用万用表测量实际电压值,与ADC读数对比
- 通过串口实时输出原始数据和处理后的数据
- 在不同光照条件下进行系统性测试
- 记录测试数据,分析误差来源
通过合理的硬件设计和软件优化,STM32F103与光敏电阻的组合能够提供稳定可靠的光照强度测量解决方案,满足大多数应用场景的需求。