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的实战应用,完整展示了模拟信号采集、数字转换和外部设备控制的完整流程。

相关推荐
blevoice11 小时前
JL杰理AC696N开发板常见问题FAQ-问题6:为什么提示“key 不匹配”?杰理的蓝牙芯片的key是什么?以及该如何添加key? 杰理key文件原理?
单片机·嵌入式硬件·物联网·jl杰理蓝牙音频芯片·ac696n·蓝牙音箱方案开发
三佛科技-1873661339713 小时前
辉芒微FT62FC1x低成本小体积定时器触摸MCU芯片选型深度解析
单片机·嵌入式硬件
独小乐13 小时前
018.使用I2C总线EEPROM|千篇笔记实现嵌入式全栈/裸机篇
linux·笔记·单片机·嵌入式硬件·arm·信息与通信
C^h14 小时前
rtthread控制达妙4310电机
数据库·单片机·嵌入式硬件
三佛科技-1873661339714 小时前
LP3717BSL 12V1A隔离型极简化自供电充电器适配器电源方案测试报告
单片机·嵌入式硬件
一路往蓝-Anbo15 小时前
第二章:STM32 bxCAN 控制器详解:从内存到总线的“中转站”
stm32·单片机·嵌入式硬件·软件工程
Dunkle.T16 小时前
DC-DC PCB设计要点说明——拓扑、走线、选型、铺铜详解
单片机·嵌入式硬件·pcb·dc-dc
charlie11451419116 小时前
嵌入式C++工程实践——第13篇:第一次重构 —— enum class取代宏,类型安全的开始
开发语言·c++·vscode·stm32·安全·重构·现代c++
三品吉他手会点灯18 小时前
STM32F103 学习笔记-21-串口通信(第4节)—串口发送和接收代码讲解(上)
笔记·stm32·单片机·嵌入式硬件·学习
weifengdq18 小时前
SJA1124 SPI转4路LIN STM32 测试笔记
stm32·spi·nxp·lin·sja1124·spi4lin