50元从零到成品:一套AI辅助的嵌入式实战入门教程——ADC采集篇

ADC采集让我印象深刻的就是一个太阳能控制器的项目,需要采集太阳能电压、电池电压、ntc温度等等7个模拟量,>开始也没感觉有多难直到调驱动出现了bug------前6个ad通道都能正常采集到数据了,第7个通道不行。然后又是查工作>模式,又是查采集时间与频率,然后跟着手册一条条配置。倒腾了一个通宵才搞好。 后来我才明白,ADC采集这件事,看起来简单,但要把数据采得准、采得稳,里面有不少门道。这篇咱们就从光敏电阻入手,感受一下ADC采集的整个链路------从cubemx配置,再到缓冲设计,一步不落。

省流版:

  • ✅ 什么是ADC?为什么需要它?

  • ✅ 缓冲设计是什么?为什么做指示灯控制也需要缓冲?

  • ✅ 实验目标:采集光敏电阻电压,实现光暗点灯光亮关灯

  • ✅ 资源包在文章最后

一、为什么需要ADC?

在之前的篇章里,我们接触到的信号只有两种状态------高电平 和低电平,也就是0和1。GPIO输入检测按键是否按下,输出控制LED亮灭,这些都是数字信号的世界。

但现实世界不是非0即1的。光照强度是连续变化的 ,温度是连续变化的,声音大小也是连续变化的。这些物理量最终都会转化为连续变化的电压值------可能从0V慢慢升到3.3V,也可能在某个范围内波动。

单片机只能理解0和1,那怎么"读懂"这个连续变化的电压呢?答案就是ADC(模数转换器,Analog-to-Digital Converter)。

ADC的作用就是把连续的模拟电压信号,转换成一个离散的数字值 。STM32F103的ADC是12位精度 的------也就是说,它能把0~3.3V的电压范围划分成 4096(2¹²)个等级 。理论上,它能分辨出约 0.8mV 的电压变化。

二、STM32的ADC怎么工作?

在开始配置之前,先简单了解一下STM32的ADC采样原理。

ADC内部有一个采样保持电容。采样时,内部开关闭合,这个电容开始充电,直到电容上的电压等于外部输入电压。然后开关断开,电容把电压"保持"住,交给后面的逐次逼近转换单元去转换成数字值。

这里有三个关键参数:

  1. 采样时间 :电容充电需要时间。如果采样时间太短,电容没充到位,读到的值就会偏小。STM32的ADC允许我们配置采样周期,一般用55.5个周期 或71.5个周期比较稳妥。

  2. 分辨率:12位,即0~4095对应0~3.3V。

  3. 转换结果 :读取到的数字值 ADC_Value 转换成电压的公式是:

    cpp 复制代码
    Voltage = ADC_Value * 3.3 / 4095

三、本次实验目标

这次我们要做的是:用ADC采集光敏电阻分压点的电压,根据电压值控制PC13引脚的指示灯。

具体逻辑很简单:

  • 采集到的电压 低于1.5V → 点亮PC13指示灯

  • 采集到的电压 ≥ 1.5V → 关闭PC13指示灯

等等,是不是觉得少了点什么?------如果电压刚好在1.5V附近波动呢?

这就是我们要重点讨论的问题。

四、为什么要做缓冲设计?

假设我们把代码写成这样:

cpp 复制代码
if (voltage < 1.5) {
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);  // 点亮
} else {
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);    // 熄灭
}

如果环境光照稳定,一切正常。但如果光照刚好在阈值附近波动------比如有人在旁边走动带起一阵风、灯管微微闪烁、或者ADC采样本身就有几个LSB的噪声------指示灯就会在亮和灭之间高频切换。

这种高频切换带来几个问题:

1. 视觉上不舒服:人眼能感知到几十赫兹的闪烁,看着非常廉价且不专业。

2. 对硬件不友好:频繁的电压跳变对LED的寿命有影响,对驱动电路也是一种不必要的冲击。

3. 系统状态不稳定:如果这个指示灯状态还要被其他逻辑依赖(比如上报给上位机),那这个信号就会变得不可靠。

所以我们需要缓冲设计------在状态切换之间加入一个**"迟疑区"**,让状态不会因为微小的波动而频繁翻转。

缓冲设计的核心思想是:

  • 从"灭"切换到"亮",需要电压 持续低于某个阈值(如1.4V)一段时间(比如连续5次采样都低于阈值)

  • 从"亮"切换到"灭",需要电压 持续高于另一个阈值(如2V)一段时间

这样就在1.4V~1.6V之间形成了一个缓冲区间------在这个区间内,指示灯保持当前状态不变,不会因为电压的微小波动而跳变。

这个思路在工业控制里有个专门的术语叫施密特触发,本质上就是给信号加了一个迟滞比较器。在软件里实现同样的效果,成本为零,收益却立竿见影。

五、实际操作

硬件连接

接线依旧很简单,首先板子和仿真器依旧正常连接。光敏模块的话还是三根线,VCC,GND不多说了这次我们用的是模拟量采集要连接模块的AO口和单片机的PA0连接。

Cubemx配置

这里配置也是非常简单直接找到ADC1配置然后勾选IN0也就是我们的PA0,我们这里使用的默认转换模式,下面这些就不需要修改了。

Trae编写程序

依旧是靠ai写程序,告诉他:现在PA0配置成adc采集了外接了光敏模块,我需要修改主函数功能实现连续5次采集的电压后判断高于2V点亮led,低于1.4V关闭。

六、资源分享

复制代码
通过网盘分享的文件:adc采集光敏.7z 链接: https://pan.baidu.com/s/1tDyekrxOEBHBkd5Xfb7fNg?pwd=j3c6提取码: j3c6 –来自百度网盘超级会员v4的分享
相关推荐
女神下凡3 小时前
芯参谋(31):SPI NOR Flash 电路设计指南
arm开发·单片机·嵌入式硬件·fpga开发·设计规范
csg11074 小时前
上电没反应、运行中死机、现场“抽风”——单片机控制板异常排查六步法
单片机·嵌入式硬件
小程序设计4 小时前
基于单片机的恒温水箱设计
单片机·嵌入式硬件
小程序设计4 小时前
基于单片机的大棚温湿度自动监控系统
单片机·嵌入式硬件
XiHongShi20167 小时前
STM32F407 CRC-循环冗余校验例程,建议保存学习
stm32·单片机
lhbweilai8 小时前
结合手册调试各个功能的寄存器+最后通过寄存器编写SPI的初始化和读写函数
stm32·单片机
小程序设计11 小时前
本科毕设避坑|大数据 / 单片机物联网 / 网络工程 / PLC / 机械设计选题与落地心得
java·hive·hadoop·单片机
Zw-awa16 小时前
先让程序开口说话:为什么把人机交互放在最前面
stm32
Zwawa16 小时前
把按键和 LED 状态显示出来:第一次看见程序到底在干什么
单片机·嵌入式