一.MCP4017

1.啥是MCP4017

老式收音机音量旋钮就是电位器:

  • 拧到最左边 → 音量最小(0)

  • 拧到中间 → 音量适中(50)

  • 拧到最右边 → 音量最大(100)

MCP4017 就是把这个机械旋钮变成了电子的!

MCP4017 = 电子音量旋钮
        = 数字电位器
        = 用代码控制的电阻

2.MCP4017特点

  1. 有128个档位(像音量旋钮有128个刻度)

    • 0 → 电阻最小(像音量最小)

    • 127 → 电阻最大(像音量最大)

  2. 用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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐