STM32实战:ADC单通道单次转换,光敏传感器实现智能光控LED---STM32 HAL库专栏

🎬 渡水无言个人主页渡水无言

专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》

专栏传送门 : 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏

专栏传送门《产品测评专栏

⭐️流水不争先,争的是滔滔不绝

📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生

| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生

在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连

目录

前言

一、光敏传感器工作原理

[二、 STM32CubeMX配置](#二、 STM32CubeMX配置)

2.1、创建新工程及选择芯片型号

[2.2、选择SYS 外设的核心配置及设置引脚模式](#2.2、选择SYS 外设的核心配置及设置引脚模式)

2.3、配置ADC

2.4、配置led引脚

三、硬件连接图

四、正式编写程序

4.1、新的编程接口

4.2、主函数代码编写

总结


前言

在前两期博客中我们介绍了STM32F103C8T6内部集成的两个12位逐次逼近型ADC的基本原理,本期我们就来做一个实用的ADC实验------光敏传感器采集环境光照强度,并根据光线强弱自动控制板载LED。实验为:当电压 > 1.5V:led弱光;当电压 < 1.5V:led强光。


一、光敏传感器工作原理

输出特性:

光照变化 光敏电阻阻值 分压 ADC输入电压
光照增强 减小 降低 下降
光照减弱 增大 升高 上升

实验为:当电压 > 1.5V:led弱光;当电压 < 1.5V:led强光。

现在要计算ADC采样光敏传感器的时间,先看内部结构

等效出的内源电阻要小于10K欧姆,我们这里假设取10K,带入公式,可以得到采样时间为0.85US.

系统默认配置到ADC时钟频率为4M,可以得到需要3.4倍的时钟周期,这里我们选7.5倍周期。

二、 STM32CubeMX配置

CubeMX新建项目------选型号------选调试接口------再点开clock configuration

1.打开STM32CubeMX,新建工程,选择芯片

2.设置芯片的调试接口(如果忘记这个步骤,芯片的调试接口将被锁死,程序烧录不进去)

2.1、创建新工程及选择芯片型号

首先点击File --->点击New project

选中STM32F103C8T6,再点击start project

2.2、选择SYS 外设的核心配置及设置引脚模式

在SYS Mode and Configuration栏中,按如下配置:

调试模式(Debug):选定了Serial Wire(SW 模式)。

这是 STM32 最常用的调试接口模式,仅需占用SWDIO和SWCLK两个引脚。

时基源(Timebase Source):选定了SysTick。

这表示将系统滴答定时器作为 HAL 库的时基来源,用于实现HAL_Delay()等延时函数,是 STM32 工程的标准配置。

2.3、配置ADC

这里我们随便选择一个ADC1,然后选一个通道,如下图所示:

我们要把信息写到序列管理,我们这里写07.5,0表示通道0,7.5表示采样时间

配置项 参数路径 设置值 说明
使能常规转换 ADC_Regular_ConversionMode → Enable Regular Conversions Enable 开启常规转换功能
转换通道数 ADC_Regular_ConversionMode → Number Of Conversion 1 单通道转换
外部触发源 ADC_Regular_ConversionMode → External Trigger Conversion Source regular 软件触发

2.4、配置led引脚

这里我们选择PA9引脚,使用输出推挽模式,如下图所示:

三、硬件连接图

四、正式编写程序

4.1、新的编程接口

函数 原型 作用 参数说明
HAL_ADC_Start HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc) 启动ADC常规序列转换 hadc: ADC句柄指针(如 &hadc1
HAL_ADC_PollForConversion HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout) 等待转换完成(轮询模式) hadc: ADC句柄指针 Timeout: 超时时间(ms)
HAL_ADC_GetValue uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc) 读取ADC转换结果 hadc: ADC句柄指针 返回值: 12位ADC值(0~4095)

4.2、主函数代码编写

cpp 复制代码
int main(void) 
{
    // 1. 启动常规序列
    HAL_ADC_Start(&hadc1);
    
    // 2. 等待转换完成
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
    
    // 3. 获取结果
    uint32_t dr = HAL_ADC_GetValue(&hadc1);
    
    // 4. 把结果转换成电压
    float voltage = dr * (3.3f - 0.0f) / 4095.0f;
    
    // 5. 根据电压控制LED
    if(voltage > 1.5f)      // 光线暗(电压高)
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13, GPIO_PIN_SET);   // 灭灯
    else                     // 光线亮(电压低)
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13, GPIO_PIN_RESET); // 亮灯
}

总结

本期博客通过光敏传感器与STM32 ADC的实战应用,完整展示了模拟信号采集、数字转换和外部设备控制的完整流程。

相关推荐
FreakStudio9 小时前
lvgl-micropython、lv_micropython和lv_binding_micropython到底啥关系?一文读懂
python·单片机·嵌入式·面向对象·电子diy
风逸尘_lz12 小时前
STM32标准工程目录文件解释
stm32·单片机·嵌入式硬件
小白学电子_12 小时前
51 单片机 拖尾流水灯
单片机·嵌入式硬件
酸奶乳酪14 小时前
IIC学习笔记
笔记·单片机·学习
进击的横打14 小时前
【车载开发系列】系统时钟与定时器
stm32·单片机·fpga开发
LCG元15 小时前
STM32实战案例:基于STM32F103的智能插座(电量计量+远程控制)
stm32·单片机·嵌入式硬件
至为芯15 小时前
PY32F005至为芯支持32位ARM内核的高主频MCU微控制器
单片机·集成电路·芯片
somi715 小时前
ARM-06-时钟系统配置
arm开发·单片机·嵌入式硬件·时钟配置
爱喝纯牛奶的柠檬15 小时前
基于STM32和HAL库的大夏龙雀BT311-10C02S蓝牙模块驱动
stm32·单片机·嵌入式硬件