1. 课程导论与硬件基础

各位同学好,欢迎来到《ADC采样与I2C/SPI协议寄存器驱动开发实战》。我是你们这门课的老张,在嵌入式底层摸爬滚打了十几年。今天咱们先不急着敲代码,把地基打牢。

这一章,我会带你搞清楚三件事:ADC到底怎么工作的、I2C和SPI这哥俩有啥区别、以及咱们用什么板子来练手。嗯,都是硬骨头,但啃下来后面就顺了。

1.1 ADC基本原理:从模拟到数字的那一步

ADC,全称模数转换器。说白了,就是把连续变化的电压,变成一串离散的数字。你想想看,单片机只能认0和1,但现实世界的温度、声音、光线都是连续信号。ADC就是那个“翻译官”。

最常见的ADC架构是逐次逼近型(SAR)。它的核心逻辑像“猜数字”游戏:

  1. 先猜中间值,比较输入电压和猜测值。
  2. 如果输入大,就往高半区猜;如果小,就往低半区猜。
  3. 重复N次,直到猜出最接近的值。

举个例子,一个8位SAR ADC,参考电压3.3V。它会把0~3.3V分成256份。每份大约是12.9mV。这就是它的分辨率。

关键公式:

量化步长 = Vref / 2^N

其中N是ADC位数,Vref是参考电压。

我在项目中遇到过一个问题:某次做电池电压监测,用了10位ADC,参考电压3.3V。算下来步长是3.22mV。但电池电压变化只有几毫伏,根本测不准。后来换了12位ADC,步长降到0.8mV,问题才解决。所以,选ADC位数不是越高越好,但一定要够用。

1.2 采样率与分辨率:鱼和熊掌

采样率决定了ADC每秒能测多少次。分辨率决定了每次测得多精细。这两者往往是矛盾的。

参数 含义 常见范围 我的建议
采样率 每秒采样次数(SPS) 1k ~ 10M SPS 音频用8k~48k,传感器用100~1k
分辨率 量化位数(bit) 8 ~ 24 bit 控制类8~12bit,测量类16~24bit
有效位数 实际能达到的精度(ENOB) 通常比标称低1~3bit 别被标称值骗了,看数据手册ENOB

避坑指南: 我曾经被一个16位ADC的标称分辨率忽悠过。实际测下来,由于电源噪声和PCB布局问题,有效位数只有12位。后来加了RC滤波和独立参考电压,才勉强到14位。记住:数据手册上的理想值,在真实环境中往往要打折扣。

为什么会这样?因为ADC内部有采样保持电容,需要时间充电。采样率越高,留给电容充电的时间越短,精度自然下降。这就是采样率与分辨率的权衡。

1.3 I2C与SPI协议对比:选哪个?

这两个协议是嵌入式世界最常用的外设总线。我个人的习惯是:需要多设备、低速、线少,用I2C;需要高速、全双工、简单,用SPI。

先看一张对比表:

特性 I2C SPI
信号线数 2(SCL, SDA) 4(SCLK, MOSI, MISO, CS)
通信方式 半双工 全双工
速率 标准100k,快速400k,高速3.4M 通常10M~50M,甚至更高
设备寻址 7位或10位地址,总线仲裁 片选信号,无仲裁
从机数量 理论127个(受总线电容限制) 理论无限(受片选引脚限制)
典型应用 传感器、EEPROM、RTC ADC、DAC、显示屏、SD卡

我记得有一次做多传感器采集板,用了I2C总线挂了6个传感器。结果发现总线电容太大,波形都变形了。后来改成SPI,每个传感器独立片选,问题迎刃而解。所以,I2C虽然省线,但总线电容是个隐形杀手。

再来看一个实际场景:你有一个12位ADC,需要以100kSPS的速率采样。I2C的400kbps模式,理论上够用,但加上地址、控制字节和应答,实际有效数据率只有300kbps左右。而SPI可以轻松跑到10Mbps,完全不是问题。

我的经验: 如果ADC采样率超过10kSPS,优先选SPI。如果只是偶尔读一下温度、湿度,I2C更省引脚和布线。

1.4 开发板选型与环境搭建

咱们这门课,我选的是STM32F4系列开发板。为什么?

  • 它有3个12位ADC,最多支持16个外部通道。
  • 硬件I2C和SPI接口齐全,支持DMA。
  • 生态成熟,HAL库和LL库都有,方便对比学习。

当然,你用其他Cortex-M4或M3内核的板子也行。关键是要有独立的ADC模块和至少一组I2C/SPI外设。

环境搭建步骤:

  1. 安装IDE:我推荐STM32CubeIDE,免费且集成CubeMX配置工具。
  2. 配置时钟:ADC需要独立的时钟源,一般配置为APB2时钟的2分频或4分频。
  3. 初始化外设:用CubeMX图形化配置ADC、I2C、SPI的引脚和参数。
  4. 生成代码:CubeMX会生成初始化代码,我们在此基础上添加业务逻辑。

环境检查清单:

  • 开发板供电正常(3.3V或5V)
  • 调试器(ST-Link/J-Link)驱动安装
  • 串口工具(Putty/SecureCRT)准备就绪
  • 示波器或逻辑分析仪(至少有一个,调试必备)

嗯,这里要注意:千万别一上来就写代码。先把硬件连接确认好,用万用表量一下电源和地,再用示波器看看时钟波形。我见过太多同学焊好板子发现ADC不工作,最后查出来是参考电压引脚没接。

1.5 本章知识体系总览

下面这张图,把本章的核心知识点串起来了。你可以把它当作整个课程的“导航地图”。

第一章知识体系结构图 第一章:课程导论与硬件基础 ADC基本原理 采样率与分辨率 I2C与SPI对比 开发板与环境搭建 硬件基础与协议选择 核心逻辑说明: 1. ADC基本原理是基础,理解SAR架构和量化步长是关键。 2. 采样率与分辨率相互制约,根据应用场景做取舍。 3. I2C/SPI协议选择取决于速率、引脚和从机数量需求。 4. 开发板选型要匹配ADC和外设资源,环境搭建从时钟配置开始。

这张图把四个核心模块串起来了。你会发现,ADC是“感知层”,负责把物理量变成数字;I2C/SPI是“传输层”,负责把数字传给处理器;开发板是“执行层”,负责跑代码和调试。三层缺一不可。

学习建议: 别急着往下翻。花10分钟把这张图看明白,理清每个模块之间的关系。后面每一章都会回到这张图上,往里面填充细节。