本系列笔记是笔者学习 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 关键参数配置解析

  1. 通道选择:进入 Analog → ADC1,勾选 IN1 通道(默认对应 PA1 引脚,无需修改);

  2. 核心参数配置

    • 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 周期),满足光敏电阻采样精度需求;

  3. 生成工程:确认配置无误后,点击 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 实时时钟,核心内容包括:

  1. RTC 时钟原理(实时时间 / 日期存储与更新);
  2. CubeMX 中 RTC 外设配置(校准、时钟源选择);
  3. RTC 时间 / 日期读取代码实现,以及在 OLED 上显示多参数整合。

无需额外准备硬件(RTC 为 STM32 内置外设),后续将实现 “时间戳 + 环境参数” 的完整监测功能。关注 Hello_Embed,持续更新环境监测项目!

六、总结

本次笔记围绕 “ADC 采样 + 光敏电阻” 展开,核心收获包括:

  1. 理解 ADC 核心作用:将模拟信号(电压)转换为数字信号(0~4095),为模拟传感器提供量化方案;
  2. 掌握 CubeMX ADC 配置要点:右对齐数据、单通道单次采样,匹配光敏电阻的采样需求;
  3. 分析实验现象:明确光敏电阻 “光照 - 阻值 - 采样值” 的反向关系,为后续光照强度显示与应用奠定基础。

ADC 是嵌入式开发中处理模拟传感器的核心工具,后续可扩展至更多场景(如土壤湿度传感器、酒精浓度传感器等)。下一篇通过 RTC 时钟为环境监测添加 “时间标签”,进一步完善项目功能。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐