1. 逐次逼近型ADC
1.1 ADC简介
ADC- Analog Digital Converter 模拟数字信号转换器
模拟信号:时间连续 幅度连续的信号
数字信号 :时间离散 幅度也离散的信号
1.2 单片机上的ADC
ADC也是单片机上的片上外设
是12位逐次逼近型ADC
1.3 采样深度
采样深度: 用多少位二进制数表示转换结果
采样深度决定了采样的精度。

1.4 逐次逼近型工作原理
先采电压,从高位到低位二分试探比较,逐位确定比特,全部位判定完输出数字量。
内部结构图如下所示:

1.5 采样保持电路
采样保持电路结构如下图:
就是给电容充电,作为采样过程。
然后断开开关后,电容的电压就保存了采样的电压,作为保持过程;
这里也涉及到后面的参数的设置。

2. ADC外设的结构框图
2.1 ADC多路复用
采用一路ADC,通过控制采样开关,实现多路模拟信号的采样。


上述的方法,也就是每个采样开关对应ADC的一个通道:

2.2 ADC常规序列
把多路ADC采样写进常规序列。
常规序列就是把每个通道采集按照规划先后列好,
然后按照规划,先后进行采样。
先闭合那个开关,后闭合那个开关,每个开关闭合多少时间都是按照常规序列进行先后处理;

例如下图:

外部触发信号是常规序列的启动信号,经过外部触发信号,决定启动常规序列与否。
当出现上升沿时候,进行一次转化。
当常规序列转化完成EOC标志位会至1:

2.3 ADC注入序列
把多路ADC采样写进注入序列。
注入序列基本上与常规序列相同,主要有如下三点区别。
此外的区别就是,相比于常规序列,注入序列具有更高的优先级。

如下图所示,当常规序列在执行采样,但是此时注入序列触发,则有限采样注入序列;

当注入序列转化完成JEOC标志位会置1:

3. 采样时间和转换时间
采样时间:开关闭合的时间长度。
转换时间:对采样点进行转换所消耗的时间-通过逐次逼近法转化为数字信号所消耗的时间。
3.1 ADC的时钟频率
主要查看ADC搭载在那个总线上,以及对应的分频系数:
这里可以看到一般设置为12Mhz
ADC最大的时钟频率为14Mhz 超出可能会出现错误。

3.2 ADC转化时间
转化时间主要取决于ADC的时钟频率:
公式如下:
转化每个位都要一个周期,所以一共12个周期,
加上额外的0.5个周期

3.3 ADC采样时间
采样时间就是采样开关闭合的时间,
采样时间和信号源的内阻 有关;
内阻影响了电流,进而影响电容充电的速度;

3.4 ADC采样时间计算方法
采样时间的公式如下:

对于一个信号源内阻为10K欧的电阻,其采样时间,经过计算为:

3.5 采样时间和保持时间影响
| 时间 | 选长(慢慢来) | 选短(赶时间) |
|---|---|---|
| 采样时间 (给电容充电的时间) | ✅ 电充得满满的,测得准; ❌ 每次等得久,测得慢 | ✅ 等得短,测得快; ❌ 电没充饱,结果偏小、乱跳 |
| 转换时间 (拿砝码试称的时间) | ✅ 天平稳了再下结论,不易判错; ❌ 整体变慢 | ✅ 整体变快; ❌ 砝码还在晃就下结论,容易判错 |
4. ADC外设的函数
4.1 ADC表格与函数表格
ADC的结构图:
参考ADC的结构图,对应其函数;

| 序号 | 分类 | 编程接口 | 作用 |
|---|---|---|---|
| 1 | 通用 | ADC_Init | 设置 ADC 的基本参数 |
| 2 | 通用 | ADC_Cmd | 总开关 |
| 3 | 通用 | ADC_GetFlagStatus | 获取标志位的值 |
| 4 | 通用 | ADC_ClearFlag | 清除标志位 |
| 5 | 通用 | ADC_ITConfig | 配置中断 |
| 6 | 通用 | ADC_DMACmd | 配置 DMA 请求 |
| 7 | 通用 | ADC_TempSensorVrefintCmd | 温度计和参考电压开关 |
| 8 | 常规序列 | ADC_RegularChannelConfig | 配置常规序列的通道 |
| 9 | 常规序列 | ADC_ExternalTrigConvCmd | 外部触发开关(常规) |
| 10 | 常规序列 | ADC_SoftwareStartConvCmd | 软件启动(常规) |
| 11 | 常规序列 | ADC_GetConversionValue | 读取 DR 寄存器的值 |
| 12 | 注入序列 | ADC_InjectedSequencerLengthConfig | 设置注入序列的长度 |
| 13 | 注入序列 | ADC_InjectedChannelConfig | 配置注入序列的通道 |
| 14 | 注入序列 | ADC_ExternalTrigInjectedConvCmd | 外部触发开关(注入) |
| 15 | 注入序列 | ADC_ExternalTrigInjectedConvConfig | 选择注入序列的外部触发 |
| 16 | 注入序列 | ADC_SetInjectedOffset | 设置注入序列的通道偏置 |
| 17 | 注入序列 | ADC_SoftwareStartInjectedConvCmd | 软件启动(注入) |
| 18 | 注入序列 | ADC_GetInjectedConversionValue | 读取 JDRx 寄存器的值 |
| 19 | 校准相关 | ADC_ResetCalibration | 复位校准寄存器 |
| 20 | 校准相关 | ADC_GetResetCalibrationStatus | 查询复位是否完成 |
| 21 | 校准相关 | ADC_StartCalibration | 启动校准 |
| 22 | 校准相关 | ADC_GetCalibrationStatus | 查询校准是否完成 |
4.2 ADC模式
ADC有如下的模式选择:
| 模式 | 说明 |
|---|---|
| 连续模式 | 开启:一次触发后,转换完成自动开启下一次转换,循环不停采集 关闭:单次模式,一次触发只转换1次,再次采集需要重新触发 |
| 数据对齐方式 | 右对齐:12位结果放在16位寄存器低12位,电压计算方便(常用) 左对齐:12位结果放在16位寄存器高12位,适合移位运算 |
| 常规序列外部触发源 | 选择启动常规ADC转换的信号源,可以是软件触发、定时器信号、外部引脚信号 |
| 双ADC模式 | 单ADC模式;双ADC可配置同步、交替等模式,需要芯片拥有两个ADC外设-可以提高采样率-高采样示波器的实现 |
| 常规序列通道数 | 设置常规序列需要采集的通道总个数,配合扫描模式使用 |
| 扫描模式 | 开启扫描:多通道依次轮流采集,多通道采集必须开启 关闭扫描:仅采集单个通道,不轮询切换通道 |
4.3 ADC的触发模式
| 模式 | 说明 |
|---|---|
| 软件触发 | 调用函数ADC_SoftwareStartConvCmd,代码手动发命令启动ADC转换。灵活,触发时间由程序决定。 |
| 定时器外部触发 | 使用定时器TRGO事件(更新/比较事件)作为触发信号,上升沿启动ADC,可以实现固定周期精准采样。 |
| 引脚外部触发 | 使用外部GPIO引脚信号(EXTI),引脚电平变化时启动ADC,适合外部硬件事件触发采集。 |
5. ADC的扫描模式
当有多个通道需要ADC采样的时候,可以选择扫描模式,对多个通道进行采样。