
🎬 渡水无言 :个人主页渡水无言
❄专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》
❄专栏传送门 : 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》
❄专栏传送门 :《产品测评专栏》
⭐️流水不争先,争的是滔滔不绝
📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生
| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生
在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连
目录
[二、 STM32CubeMX配置](#二、 STM32CubeMX配置)
[2.2、选择SYS 外设的核心配置及设置引脚模式](#2.2、选择SYS 外设的核心配置及设置引脚模式)
前言
在前两期博客中我们介绍了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的实战应用,完整展示了模拟信号采集、数字转换和外部设备控制的完整流程。


