STM32 环境监测项目笔记(三):ADC 采样与光敏电阻光照检测实现
本笔记记录了基于STM32的ADC采样与光敏电阻光照检测的实现过程。主要内容包括:ADC基础概念(12位模数转换)、STM32关键参数配置(右对齐、单通道采样);CubeMX工程配置详解(ADC1通道选择、采样时间设置);光敏电阻模块接线指南;核心采样代码实现(单次启动循环采样);实验现象分析(光照强度与采样值的反向关系)。通过调试验证了光照变化对ADC采样值的影响,为后续OLED显示光照数据奠定
本系列笔记是笔者学习 B 站 up 主 “技术探索者” STM32 系列视频所作的记录,不理解的地方推荐观看视频~
目录
一、前言
大家好,我是 Hello_Embed。上一篇我们完成了 OLED 屏幕的配置与温湿度显示,实现了 “数据采集→串口打印→屏幕展示” 的闭环。本次笔记将聚焦环境监测项目的第三个核心模块 ——光照强度检测,通过 STM32 的 ADC 外设采集光敏电阻的模拟信号,将 “光照强度” 转换为可量化的数字信号。
ADC(模数转换器)是嵌入式开发中处理模拟传感器的核心外设,本次将从 ADC 基础概念入手,结合光敏电阻模块的特性,完成 “光照强度→数字信号” 的采样流程,为后续 OLED 显示光照数据铺垫。
二、ADC 基础认知与核心特性
2.1 ADC 核心概念(模拟 / 数字信号转换)
ADC(Analog-to-Digital Converter,模数转换器)的核心作用是将连续变化的模拟信号(如电压)转换为离散的数字信号,供 MCU 处理。两者的关键区别:
- 模拟信号:取值连续,如光敏电阻的电压(随光照强度平滑变化);
- 数字信号:取值离散,仅能表示特定数值(如 ADC 输出的 0~4095 整数)。
STM32F103 内置的 ADC 为 12 位逐次逼近型 ADC,“12 位” 意味着其数字输出范围为 0 ~ 2¹² - 1 = 0 ~ 4095,数值越大代表采集到的模拟电压越高(需结合参考电压计算实际电压值)。
2.2 STM32 ADC 关键参数
- 采样通道:共 16 个外部采样通道(ADC1/ADC2 共享),可灵活选择不同 GPIO 引脚作为采样输入;
- 数据对齐:分为左对齐和右对齐(影响数字值读取方式);
- 采样模式:包括连续采样(一次启动后持续采样)和单次采样(每次采样需手动启动);
- 通道类型:
- 规则通道组:用于常规数据采集(如本次光敏电阻采样);
- 注入通道组:用于紧急 / 触发式采集(特殊场景,本次暂不涉及);
- 采样时间:采样间隔可配置,间隔越长采样精度越高,但速度越慢;间隔越短速度越快,但精度可能下降。
三、CubeMX 工程配置(ADC1 单通道采样)
本次基于上一篇的 OLED 工程扩展,新增 ADC1 配置,用于采集光敏电阻的模拟信号。
3.1 ADC 关键参数配置解析
-
通道选择:进入
Analog → ADC1,勾选IN1通道(默认对应 PA1 引脚,无需修改); -
核心参数配置:
-
Data Alignment(数据对齐):选择
Right alignment(右对齐)。原因:右对齐时,ADC 采样值的最低位对应寄存器最低位,直接读取
HAL_ADC_GetValue()即可获得正确数值;左对齐时最低 4 位为 0,需手动移位处理,右对齐更便捷(数据手册说明如图):
-
-
-
Scan Conversion Mode(扫描模式):保持
Disabled(关闭)。原因:仅采集单通道(IN1),无需扫描多通道;
-
Continuous Conversion Mode(连续采样模式):保持
Disabled(关闭)。原因:本次采用 “单次采样 + 循环启动” 的方式,便于控制采样频率;若开启连续模式,ADC 会持续采样,无需重复启动;
-
ADC_Regular_ConversionMode(规则通道):默认启用,配置
Number of Conversion = 1(仅 1 个通道采样); -
Sampling Time(采样时间):保持默认(如 1.5 个 ADC 周期),满足光敏电阻采样精度需求;
-
-
生成工程:确认配置无误后,点击
Generate Code,编译确保无错误。
3.2 光敏电阻模块接线
光敏电阻模块共 4 个引脚,核心是通过 AO 引脚(模拟量输出) 输出与光照强度相关的电压信号,接线如下:
| 光敏电阻模块引脚 | 功能描述 | 连接对象(STM32) | 说明 |
|---|---|---|---|
| VCC | 电源正极 | 3.3V 引脚 | 模块工作电压,勿接 5V |
| GND | 电源负极 | GND 引脚 | 必须与 STM32 共地,避免干扰 |
| DO | 开关量输出(可选) | 无需连接(本次用模拟量) | 输出高低电平,适合简单阈值判断 |
| AO | 模拟量输出(核心) | PA1 引脚(ADC1_IN1) | 输出连续电压,供 ADC 采样 |
注意:AO 引脚必须接 ADC 通道对应的 GPIO(本次 PA1),否则无法采集模拟信号。
四、ADC 采样代码实现与实验验证
4.1 核心采样代码(主函数)
ADC 采样逻辑简单:每次采样前启动 ADC,读取采样值后存储,由于未开启连续采样模式,需在循环内重复启动采样。完整核心代码如下:
// 定义 ADC 采样值存储变量(16 位,匹配 12 位采样范围 0~4095)
uint16_t adc_val = 0;
int main(void)
{
// 1. 初始化所有外设(HAL库、ADC1、DHT11、OLED、USART1 等)
// 2. OLED 初始化(清屏,准备显示)
// 3. 主循环:周期性采集 ADC(光照)和 DHT11(温湿度)
while (1)
{
// -------------------------- ADC 采样(光照强度)--------------------------
HAL_ADC_Start(&hadc1); // 启动 ADC1 采样(单次采样需每次启动)
adc_val = HAL_ADC_GetValue(&hadc1); // 读取 ADC 采样值(范围 0~4095)
HAL_Delay(1000);
}
}
关键说明:若在 CubeMX 中开启 “连续采样模式”,则只需在主循环外调用一次
HAL_ADC_Start(&hadc1),ADC 会持续采样,无需重复启动。
4.2 实验现象与数据分析
通过 Keil 的 调试模式 观测 adc_val 变量,验证光照强度与采样值的关系:
1. 正常光照(无遮挡)
光敏电阻受光照射,阻值较小,AO 引脚输出电压较低,ADC 采样值较小。调试观测结果如下:
2. 弱光环境(有遮挡)
用手或物体遮挡光敏电阻,阻值增大,AO 引脚输出电压升高,ADC 采样值显著增大。调试观测结果如下:
现象解释
- 光敏电阻特性:光照强度越大,阻值越小;光照强度越小,阻值越大;
- ADC 采样值与电压的关系:采样值 ∝ AO 引脚电压 ∝ 光敏电阻阻值(模块内部为分压电路),因此采样值与光照强度呈 反向关系(光照强→阻值小→电压低→采样值小;光照弱→阻值大→电压高→采样值大)。
扩展应用(可选)
若需根据光照强度调节 LED 亮度,可结合 PWM 实现:通过 if-else 判断 adc_val 范围,动态修改 PWM 占空比(如采样值大→光照弱→LED 亮;采样值小→光照强→LED 暗),本次暂不展开。
五、下一篇预告:RTC 时钟配置
本次完成了 ADC 采样与光敏电阻的光照检测,下一篇将聚焦环境监测项目的 “时间维度”——RTC 实时时钟,核心内容包括:
- RTC 时钟原理(实时时间 / 日期存储与更新);
- CubeMX 中 RTC 外设配置(校准、时钟源选择);
- RTC 时间 / 日期读取代码实现,以及在 OLED 上显示多参数整合。
无需额外准备硬件(RTC 为 STM32 内置外设),后续将实现 “时间戳 + 环境参数” 的完整监测功能。关注 Hello_Embed,持续更新环境监测项目!
六、总结
本次笔记围绕 “ADC 采样 + 光敏电阻” 展开,核心收获包括:
- 理解 ADC 核心作用:将模拟信号(电压)转换为数字信号(0~4095),为模拟传感器提供量化方案;
- 掌握 CubeMX ADC 配置要点:右对齐数据、单通道单次采样,匹配光敏电阻的采样需求;
- 分析实验现象:明确光敏电阻 “光照 - 阻值 - 采样值” 的反向关系,为后续光照强度显示与应用奠定基础。
ADC 是嵌入式开发中处理模拟传感器的核心工具,后续可扩展至更多场景(如土壤湿度传感器、酒精浓度传感器等)。下一篇通过 RTC 时钟为环境监测添加 “时间标签”,进一步完善项目功能。
更多推荐



所有评论(0)