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

相关推荐
碧海银沙音频科技研究院4 小时前
基于炬芯ATS308X 设计的上位机usb 串口音乐EQ调节工具
stm32·单片机·嵌入式硬件
三佛科技-134163842128 小时前
过认证72W碳化硅方案(12V6A)主控HN1562+HN36228V 典型应用电路、变压器参数分享
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
Zwawa9 小时前
串口为什么会丢字节:从轮询到中断和环形缓冲区
c语言·单片机·嵌入式
Brilliantwxx9 小时前
【STM32】 内部 Flash 详解:寄存器逐位拆解 + 工作流程顺序全讲 + EEPROM再实现
stm32·单片机·嵌入式硬件·1024程序员节
zhangxp1239 小时前
【Quectel Pi M2 实战】Day3 USB 摄像头图像采集:拍照、录像与踩坑记录(V4L2 + FFmpeg)
嵌入式
木子单片机9 小时前
基于单片机的DS18B20温度传感器测温系统设计
单片机·嵌入式硬件·51单片机·keil
华清远见IT开放实验室9 小时前
实验室建设案例 | 安徽三联学院物联网实验室
stm32·单片机·嵌入式硬件·物联网·华清远见
Zw-awa10 小时前
串口为什么会丢字节:从轮询到中断和环形缓冲区
stm32
深圳光特通信豆子11 小时前
TTL 光模块在工业控制与串口通信中的应用指南(10M BIDI 单模系列)
单片机·嵌入式硬件
桀人11 小时前
SPI概念引入
stm32·单片机·嵌入式硬件