1. 课程导论与硬件基础
各位同学好,欢迎来到《ADC采样与I2C/SPI协议寄存器驱动开发实战》。我是你们这门课的老张,在嵌入式底层摸爬滚打了十几年。今天咱们先不急着敲代码,把地基打牢。
这一章,我会带你搞清楚三件事:ADC到底怎么工作的、I2C和SPI这哥俩有啥区别、以及咱们用什么板子来练手。嗯,都是硬骨头,但啃下来后面就顺了。
1.1 ADC基本原理:从模拟到数字的那一步
ADC,全称模数转换器。说白了,就是把连续变化的电压,变成一串离散的数字。你想想看,单片机只能认0和1,但现实世界的温度、声音、光线都是连续信号。ADC就是那个“翻译官”。
最常见的ADC架构是逐次逼近型(SAR)。它的核心逻辑像“猜数字”游戏:
- 先猜中间值,比较输入电压和猜测值。
- 如果输入大,就往高半区猜;如果小,就往低半区猜。
- 重复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外设。
环境搭建步骤:
- 安装IDE:我推荐STM32CubeIDE,免费且集成CubeMX配置工具。
- 配置时钟:ADC需要独立的时钟源,一般配置为APB2时钟的2分频或4分频。
- 初始化外设:用CubeMX图形化配置ADC、I2C、SPI的引脚和参数。
- 生成代码:CubeMX会生成初始化代码,我们在此基础上添加业务逻辑。
环境检查清单:
- 开发板供电正常(3.3V或5V)
- 调试器(ST-Link/J-Link)驱动安装
- 串口工具(Putty/SecureCRT)准备就绪
- 示波器或逻辑分析仪(至少有一个,调试必备)
嗯,这里要注意:千万别一上来就写代码。先把硬件连接确认好,用万用表量一下电源和地,再用示波器看看时钟波形。我见过太多同学焊好板子发现ADC不工作,最后查出来是参考电压引脚没接。
1.5 本章知识体系总览
下面这张图,把本章的核心知识点串起来了。你可以把它当作整个课程的“导航地图”。
这张图把四个核心模块串起来了。你会发现,ADC是“感知层”,负责把物理量变成数字;I2C/SPI是“传输层”,负责把数字传给处理器;开发板是“执行层”,负责跑代码和调试。三层缺一不可。
学习建议: 别急着往下翻。花10分钟把这张图看明白,理清每个模块之间的关系。后面每一章都会回到这张图上,往里面填充细节。