ADC的配置
一.MCP4017
1.啥是MCP4017
老式收音机音量旋钮就是电位器:
-
拧到最左边 → 音量最小(0)
-
拧到中间 → 音量适中(50)
-
拧到最右边 → 音量最大(100)
MCP4017 就是把这个机械旋钮变成了电子的!
MCP4017 = 电子音量旋钮
= 数字电位器
= 用代码控制的电阻
2.MCP4017特点
-
有128个档位(像音量旋钮有128个刻度)
-
0 → 电阻最小(像音量最小)
-
127 → 电阻最大(像音量最大)
-
-
用I2C通信控制(两根线控制)
-
SCL:时钟线(告诉它"注意,要发数据了")
-
SDA:数据线(发送具体数值)
-
3.MCP4017的作用
// 假设你想调节一个灯的亮度 物理电位器:手拧旋钮 → 电阻变化 → 灯变亮/暗 MCP4017: 代码写数值 → 电阻变化 → 灯变亮/暗
4.MCP4017的实际应用例子
// 用MCP4017调节LED亮度
void set_led_brightness(u8 value)
{
// value 范围 0-127
// 0: 最暗
// 127: 最亮
I2C_Write_MCP4017(value);
}
// 呼吸灯效果
for(int i = 0; i < 128; i++) {
set_led_brightness(i); // 逐渐变亮
delay(10);
}
for(int i = 127; i >= 0; i--) {
set_led_brightness(i); // 逐渐变暗
delay(10);
}
二.MCP4017硬件部分

该图展示的是一个典型的I2C总线硬件连接电路,用于嵌入式系统中实现主控芯片与外部设备之间的串行通信。电路中包含两个主要外设:M24C02-WMN6TP(EEPROM存储器)和MCP4017T-104ELT(数字电位器),它们通过I2C总线与主控芯片(如STM32)相连,使用PB6作为时钟线(SCL),PB7作为数据线(SDA)。
三.关于ADC
1.ADC的模式配置

一般都是使用的单端输入,在cubemax里面配置成单端输入模式就行

这个图片是关于ADC配置的全部,下面一个一个分析(都是先简单介绍一下):
1. Independent mode(独立模式)

2.Dual regular simultaneous + alternate trigger mode
双重模式:常规通道同时采样 + 注入通道交替触发模式

-
对于常规通道:ADC1 和 ADC2 同时采样(同时触发、同时转换)
-
对于注入通道:ADC1 和 ADC2 交替采样(轮流触发、交替转换)

规则组(Regular Group) 和 注入组(Injected Group) 是理解STM32 ADC双模式的基础
一、规则组
规则组是ADC的"常规工作流程",按照预设的顺序自动转换一组通道。

开始 → 通道1转换 → 通道2转换 → ... → 通道16转换 → [循环/停止]
↓ ↓ ↓
存入DR 存入DR 存入DR
实际应用场景
-
采集温度、湿度、压力等多个传感器(慢速、周期性)
-
电机控制中的三相电流监测
-
电池电压监测
二、注入组
注入组是ADC的"紧急中断机制",可以打断规则组的转换,优先执行。

规则组正在运行: 通道3 → 通道4 → [被打断] → 通道5...
↓
注入组触发: J1 → J2 → J3 → J4
↓
规则组恢复: [继续] → 通道5...
实际应用场景
-
过流保护:电流超过阈值,立即采样确认
-
过压/欠压保护:电源异常时紧急检测
-
故障诊断:系统异常时快速采集关键信号
3. Dual regular simultaneous mode only
| 特性 | 说明 |
|---|---|
| 作用 | 仅规则通道同时采样 |
| 效果 | ADC1和ADC2在同一时刻开始转换各自的规则通道 |
| 用 vs 不用 | ✅ 电机控制、电源监测等需要严格同步采样的场景 ❌ 不需要同步时浪费资源 |
4. Dual interleaved mode only(仅交错模式)
| 特性 | 说明 |
|---|---|
| 作用 | 两个ADC交替采样同一通道 |
| 效果 | 采样率翻倍! 例如:单个ADC 1MSPS → 双ADC 2MSPS |
| 用 vs 不用 | ✅ 高频信号采集(如射频、高速传感器) ❌ 会增加功耗和复杂度 |
5. Dual alternate trigger mode only(仅交替触发模式)
| 特性 | 说明 |
|---|---|
| 作用 | 注入通道交替触发 |
| 效果 | 减少注入转换的延迟,提高响应速度 |
| 用 vs 不用 | ✅ 快速保护电路(如过流保护) ❌ 普通慢速采集不需要 |
6. Dual combined regular simultaneous + injected simultaneous mode
| 特性 | 说明 |
|---|---|
| 作用 | 规则通道同时采样 + 注入通道同时采样 |
| 效果 | 所有通道都同步转换 |
| 用 vs 不用 | ✅ 复杂系统需要全面同步(如多相电机控制) ❌ 最复杂的配置,一般场景用不到 |
7. Dual Interleaved mode + injected simultaneous mode
| 特性 | 说明 |
|---|---|
| 作用 | 规则通道交错(高速)+ 注入通道同步 |
| 效果 | 兼顾高速采样和同步注入转换 |
| 用 vs 不用 | ✅ 高速采集+需要同步的紧急事件处理 ❌ 配置复杂,资源占用多 |
8. Dual injected simultaneous mode only(仅注入通道同时模式)
| 特性 | 说明 |
|---|---|
| 作用 | 仅注入通道同时转换 |
| 效果 | 紧急事件(如故障检测)时两个ADC同时响应 |
| 用 vs 不用 | ✅ 安全关键应用(如过压、过流保护) ❌ 普通应用不需要 |
STM32的ADC双模式总共就这8种!
8种模式一览表
| 序号 | 模式名称 | 核心功能 |
|---|---|---|
| 1 | Independent mode | 各自独立 |
| 2 | Dual regular simultaneous + alternate trigger | 规则同时 + 注入交替 |
| 3 | Dual regular simultaneous only | 仅规则同时 |
| 4 | Dual interleaved only | 仅交错(提速) |
| 5 | Dual alternate trigger only | 仅注入交替 |
| 6 | Dual combined regular simultaneous + injected simultaneous | 规则同时 + 注入同时 |
| 7 | Dual interleaved + injected simultaneous | 交错 + 注入同时 |
| 8 | Dual injected simultaneous only | 仅注入同时 |
组合逻辑拆解
这8种模式其实是 3个功能的组合:
| 功能A:规则组 | 功能B:注入组 | 组合结果 |
|---|---|---|
| 无 | 无 | → Independent |
| 同时 | 无 | → Regular simultaneous only |
| 无 | 同时 | → Injected simultaneous only |
| 无 | 交替 | → Alternate trigger only |
| 同时 | 交替 | → Regular simultaneous + alternate trigger |
| 同时 | 同时 | → Combined regular + injected simultaneous |
| 交错 | 同时 | → Interleaved + injected simultaneous |
| 交错 | 无 | → Interleaved only |
注:交错(Interleaved)和同时(Simultaneous)是互斥的,不能同时存在。
普通采样(单ADC):
时间: 0μs 1μs 2μs 3μs 4μs
ADC1: ✓ ✓ ✓
采样率:1MSPS(每秒100万次)
交错采样(双ADC):
时间: 0μs 0.5μs 1μs 1.5μs 2μs
ADC1: ✓ ✓ ✓
ADC2: ✓ ✓
合并: ✓ ✓ ✓ ✓ ✓
采样率:2MSPS(翻倍!)
可是你的代价是要由一个ADC变成两个ADC
就记住一句话就行:基本上都使用的独立模式,双重模式的话是2~8这7种模式但是很少用。她两不一样的地方就是一个起始时间

2.ADC 的配置参数
1.Clock Prescaler时钟预分频器
时钟频率越高 → 转换越快 → 每秒能采更多次
时钟频率越低 → 转换越慢 → 每秒采的次数少
这里说的转换就是电压转换成数字这个过程
转换速度 = 电压变数字的快慢,时钟越快转得越快!
同步模式Synchronous
系统主时钟 ──→ 分频 ──→ ADC时钟
72MHz ÷2 36MHz
÷4 18MHz
特点:
├── ADC时钟和CPU时钟同步
├── 系统时钟变,ADC也变
├── 速度快,精度高
└── 适合正常运行时使用
系统主时钟 是咋来的来着我有点忘了,让我想一想,对了,它的来源是外部高速晶振然后经过锁相环就有了系统主时钟,之后再分频给CPU和ADC他们
外部高速晶振 → 锁相环倍频 → 系统主时钟 → 分频给CPU和ADC
异步模式Asynchronous
独立时钟源(HSI 16MHz)──→ 分频 ──→ ADC时钟
÷1 16MHz
÷2 8MHz
特点:
├── ADC时钟独立于CPU
├── 系统时钟变化(如降频省电),ADC不受影响
├── 低功耗模式下也能工作
└── 适合低功耗、时钟变化场景
2.Resolution分辨率
用尺子量长度:
├── 12-bit = 毫米尺,能测到1mm
├── 8-bit = 厘米尺,只能测到1cm
└── 分辨率越高,刻度越细,量得越准
测电压也一样:
├── 12-bit:把3.3V分成4096份,每份0.8mV
├── 8-bit:把3.3V分成256份,每份12.9mV
└── 电压变化小于12.9mV,8-bit就看不出来!
分辨率 = 电压测量的精细程度,越高越准,但转换越慢!
分辨率不一样,测出来的电压精度不一样。
例子:真实电压 = 1.500V,参考电压3.3V
12-bit:
数字值 = 1.500 / 3.3 × 4096 = 1861
反算电压 = 1861 / 4096 × 3.3 = 1.499V ✓ 很准
8-bit:
数字值 = 1.500 / 3.3 × 256 = 116.36 → 取整116
反算电压 = 116 / 256 × 3.3 = 1.494V ✗ 差了6mV
6-bit:
数字值 = 1.500 / 3.3 × 64 = 29.09 → 取整29
反算电压 = 29 / 64 × 3.3 = 1.495V ✗ 差了5mV,更糙
结论:
├── 分辨率越高,数字值越接近真实电压
├── 分辨率越低,取整误差越大
└── 12-bit最常用,8-bit够用但糙,6-bit很快但很糙
3.Data Alignment数据对齐方式
为什么要进行左对齐和右对齐:
因为 ADC分辨率可以配置为12/10/8/6位,但数据寄存器都是16位,需要决定数据放在16位中的哪一边。
16位数据寄存器:| D15 D14 D13 D12 D11 D10 D9 D8 | D7 D6 D5 D4 D3 D2 D1 D0 |
12位ADC值: | 0 0 0 0 | B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 |
↑______________↑ ↑_________________________________________________↑
高位补0 12位有效数据
右对齐:数据放右边(D11~D0),左边补0 → 直接读就是0~4095
左对齐:数据放左边(D15~D4),右边补0 → 需要右移4位
为什么要左对齐
| 场景 | 原因 |
|---|---|
| 只想要高8位 | 左对齐后,直接读高8位(D15~D8),丢弃低4位 |
| 快速处理 | 不右移,直接取整 |
| 兼容旧设备 | 某些外设需要左对齐格式 |
4.Gain Compensation增益补偿
什么是增益误差:就是电压越大误差越大
给ADC值加一个补偿系数,让输出更准确。
补偿公式:
实际值 = ADC原始值 × (1 + Gain Compensation / 4096)
Gain Compensation = 0:不补偿(默认)
Gain Compensation = 正数:放大
Gain Compensation = 负数:缩小
5.Scan Conversion Mode扫描模式
只要用多通道,就必须开扫描模式
单通道(Scan Disabled):
ADC只采一个通道,采完就停或重复采同一个通道。
多通道(Scan Enabled):
ADC按顺序轮流采多个通道:
Channel 1 → Channel 2 → Channel 3 → ... → 循环
6.End Of Conversion Selection转换结束选择
-
End of single conversion:每次单个通道转换完就产生结束标志
-
End of sequence conversion:整个序列转换完才产生标志
-
选 single:每采完一个通道就知道一次
-
选 sequence:所有通道都采完才知道
7.Low Power Auto Wait低功耗自动等待
如果开了,ADC 转换完会等待 CPU 取走数据才采下一个,适合低速低功耗
8.Continuous Conversion Mode连续转换模式
-
Enabled:ADC 采完一遍自动从头再采,无限循环
-
Disabled:采完一遍就停,需要再触发才采
9.Discontinuous Conversion Mode不连续转换模式
把长序列分成几组,每次触发只采一组
10.DMA Continuous RequestsDMA 连续请求
-
Enabled:DMA 一直请求数据,ADC 一直采
-
Disabled:DMA 只在当前传输完成后停止请求
这里的这个配置并不是说我要开启DMA而是说当我开启了DMA之后你要不要是连续的
11.Overrun behaviour溢出处理
那我总结一下ADC就是这个你要是有多通道的话就得必须开启扫描模式IN0->IN1->IN2,这样算是一轮,要是想让他接着进行下一轮就是不停的话就要开启连续转换模式,这样就是在一直采集不停的采集,采集到的东西放在了一个寄存器里面,然后DMA就从寄存器里面开始搬运,搬到数组里面,数组搬运满之后就看你这个DMA有没有请求连续转换,如果请求连续转换了就接着进行下一轮的搬运
3.常规通道转换序列
之前我只是告诉芯片这个ADC要怎么做了,但是告诉的不具体
为什么是常规通道,是因为还有注入通道,这个注入通道我爱和交错混淆:
独立模式和双重模式都是可以用注入通道的,但是交错只能让双重模式的使用因为交错是需要两个ADC的。两个通道不能用交错吗,答案是不能的,两个通道 + 一个 ADC → ❌ 不能用交错。两个通道 + 两个 ADC → ✅ 可以用交错。。交错 = 两个 ADC 轮流采样同一个信号
1.Enable Regular Conversions开启常规通道转换功能
| Enable Regular Conversions | Enable | 开启常规通道转换功能。 如果 Disable,ADC 就不采常规通道了(可能只用注入通道)。 |
2.Enable Regular Oversampling过采样功能
| Enable Regular Oversampling | Disable | 关闭过采样功能。 过采样 = 多次采样求平均,提高精度但降低速度。 |
3.Number Of Conversion转换序列长度
| Number Of Conversion | 2 | 这一轮转换序列里包含几个通道。 取值范围 1~16。 |
4.触发方式
连续转换模式只管“停不停”,触发方式只管“怎么启动”
| 配置项 | 当前值 | 解释 |
|---|---|---|
| External Trigger Conversion Source | Regular Conversion launched by software | 用什么方式启动这一轮转换。 这里选的是“软件触发”——需要手动调用函数启动。 |
| External Trigger Conversion Edge | None | 触发边沿选择。 软件触发不需要边沿,所以是 None。 如果上面选了定时器触发,这里要选上升沿/下降沿。 |
5.Rank 1(第1个通道的配置)Rank 2(第2个通道的配置)
| 配置项 | 当前值 | 解释 |
|---|---|---|
| Channel | Channel 5 | 这一位(Rank)要采的是通道5。 |
| Sampling Time | 2.5 Cycles | 采样时间 = ADC 对这个通道采一次需要多长时间。 2.5 Cycles 是最快的一档。 |
| Offset Number | No offset | 偏移校准,一般不用,选 No offset。 |
| 配置项 | 当前值 | 解释 |
|---|---|---|
| Channel | Channel 5 | 这一位要采的是通道5。 |
| Sampling Time | 2.5 Cycles | 同上。 |
| Offset Number | No offset | 同上。 |
采样时间是快了好还是慢了好:说看一下模拟电压是多少,看完之后我就开始转换了
2.5 Cycles = ADC 采样需要 2.5 个 ADC 时钟周期的时间。
开始采样 → [采样时间] → 开始转换 → [转换时间] → 完成
↑_________↑ ↑_____↑
(2.5 Cycles) (12.5 Cycles 固定)
↑__________________________↑
总时间 = 15 Cycles
4.注入通道开关
什么时候用注入通道
场景1:紧急事件
你正在连续采室温(常规)
突然火灾报警来了
立刻暂停常规,采火灾传感器(注入)
采完再继续采室温
场景2:精确定时
常规通道一直在采波形
每到 PWM 的某个时刻
需要精确采一个电流值(注入)
场景3:示波器触发
常规通道在滚动显示
检测到下降沿时
立即采一个精确值(注入)
5.模拟看门狗(Analog Watchdog)的开关
什么时候用
场景1:过压保护
监控电源电压
如果超过 3.6V,立即触发中断
关闭电源或报警
场景2:欠压检测
监控电池电压
如果低于 3.0V,触发中断
提醒用户充电
场景3:信号异常监测
监控传感器输出
如果超出正常范围,说明传感器故障
为什么有三个(1、2、3)
STM32 有多个模拟看门狗,可以同时监控不同的通道:
Analog Watchdog 1:监控通道0-3,范围 1.0V-3.0V
Analog Watchdog 2:监控通道4-7,范围 0.5V-2.5V
Analog Watchdog 3:监控通道8-11,范围 2.0V-3.3V
更多推荐



所有评论(0)