STM32F103VET6 ADC架构解析:从ADC1/2/3硬件到ADC12/123协同模式
2026/7/30 4:36:49 网站建设 项目流程

1. 项目概述:从ADC1到ADC123,一次搞懂STM32F103VET6的模数转换器

如果你正在用STM32F103VET6这颗经典的“国民MCU”做项目,无论是采集传感器数据、监测电池电压,还是做简单的信号分析,ADC(模数转换器)功能几乎是你绕不开的一环。但当你打开数据手册和CubeMX配置工具,看到ADC1、ADC2、ADC3,以及ADC12、ADC123这些术语时,是不是感觉有点懵?它们到底指的是同一个东西的不同叫法,还是完全不同的功能实体?

我刚开始接触STM32时,也在这个问题上卡了很久。简单来说,在STM32F103VET6上,ADC1、ADC2、ADC3是三个独立的ADC外设硬件模块,而ADC12、ADC123则描述了这些硬件模块之间可以协同工作的模式,特别是“双ADC模式”和“三ADC模式”。理解这背后的硬件架构和软件配置逻辑,是高效、稳定使用ADC的关键。否则,你可能会遇到采样数据错乱、DMA传输异常,或者资源浪费、性能无法发挥的问题。

这篇文章,我就结合自己踩过的坑和项目经验,帮你彻底理清STM32F103VET6上ADC1、ADC2、ADC3以及ADC12、ADC123的概念、联系、配置方法和典型应用场景。目标是让你看完后,不仅能正确配置,更能理解为什么这么配,从而在设计系统时做出最优选择。

2. 核心概念解析:硬件实体与工作模式

要理解ADC1/2/3和ADC12/123,我们必须先深入到STM32F103VET6的芯片内部去看它的ADC子系统架构。这不仅仅是命名差异,而是硬件资源和软件调度逻辑的体现。

2.1 ADC1, ADC2, ADC3:三个独立的硬件转换器

STM32F103VET6内部集成了最多3个12位精度的逐次逼近型模数转换器。你可以把它们想象成三个独立的“测量员”。

  • ADC1:这是功能最全的“主力测量员”。它通常拥有最多的外部通道(具体数量取决于封装和引脚复用),并且是唯一一个支持DMA传输的ADC。这意味着ADC1可以连续采样,并通过DMA自动把数据搬运到内存,完全不需要CPU干预,效率极高。在单ADC工作模式下,我们最常使用的就是ADC1。
  • ADC2:可以看作是ADC1的“搭档”。它的通道通常与ADC1的部分通道共享外部引脚(即同一个引脚既可以给ADC1用,也可以给ADC2用)。但ADC2不支持独立的DMA。在双ADC模式下,它需要和ADC1配合,由ADC1来触发DMA。
  • ADC3:在一些型号(如VET6)中提供,是第三个“测量员”。它的通道可能独立,也可能与前面两个共享。和ADC2一样,ADC3通常也不支持独立的DMA,需要在多ADC模式下协同工作。

注意:具体每个ADC有多少个外部通道,哪些通道是共享的,一定要查阅你所使用的具体型号(STM32F103VET6)的**数据手册(Datasheet)中的“Pinouts and pin description”章节和参考手册(Reference Manual)**中的ADC章节。例如,VET6的ADC1可能有16个外部通道,而ADC2和ADC3可能少一些。

2.2 ADC12与ADC123:协同工作的“团队模式”

当单个“测量员”速度不够,或者你需要同步采集多个相关信号时,就需要团队协作。这就是ADC12和ADC123模式的意义。

  • ADC12模式:指ADC1和ADC2组成一个团队,在特定的同步模式下工作。它不是指一个叫“ADC12”的新硬件,而是ADC1和ADC2这两种硬件资源的一种协同工作状态。在CubeMX中,当你启用ADC2时,软件层面通常就会涉及ADC12模式的配置。
  • ADC123模式:同理,指ADC1、ADC2和ADC3三个硬件模块组成团队协同工作。

为什么需要团队工作?主要是为了实现更高级的采样功能:

  1. 交替采样:ADC1和ADC2轮流对同一个通道进行采样。比如ADC1采一次,紧接着ADC2采一次,然后再ADC1...这样可以在不提高单个ADC转换速度的情况下,有效提升对同一信号的采样率。
  2. 同步采样:ADC1和ADC2在同一个时刻不同的通道进行采样。这对于需要保持相位关系的信号至关重要,比如电机控制中同时采集三相电流。
  3. 注入通道:这是一种可以打断常规序列采样的“插队”机制。在多ADC模式下,注入通道的管理会更复杂,功能也更强大。

2.3 关键区别与联系总结

为了更直观,我们可以用一个表格来对比:

特性ADC1 (独立硬件)ADC2/ADC3 (独立硬件)ADC12/123 (工作模式)
本质独立的ADC外设单元独立的ADC外设单元ADC1与ADC2/ADC3的协同工作状态
DMA支持支持,可独立使用DMA通常不支持独立DMA,需依赖ADC1的DMA在同步模式下,通常由ADC1的DMA统一搬运数据
触发源丰富(TIM、EXTI等)丰富,但常与ADC1同步触发触发主ADC(通常是ADC1),从ADC跟随动作
典型用途单通道高速采样、多通道扫描(独立使用)必须与ADC1配合,用于双/三ADC模式提高采样率(交替)、同步采样多路信号、复杂序列采样
配置体现在CubeMX中作为一个外设单独配置在CubeMX中作为独立外设配置,但模式依赖ADC1在ADC1的“Parameter Settings”中,“Multimode Mode”选项下选择(如“Dual Regular simultaneous mode”)

核心联系:你必须先有ADC1、ADC2这些硬件,才能让它们以ADC12的模式去工作。ADC12是功能,ADC1和ADC2是实现这个功能的资源。在代码中,你操作的对象始终是hadc1,hadc2这些实体句柄,但通过配置它们的同步关系,来实现ADC12模式的功能。

3. 实战配置详解:从CubeMX到代码

理论清楚了,我们动手配置。这里以最常用的ADC1独立模式ADC1与ADC2同步模式为例,讲解如何在STM32CubeMX和HAL库中实现。

3.1 场景一:独立使用ADC1进行多通道扫描

这是最基础、最常用的场景。假设我们需要循环采集3个传感器的电压(通道1, 2, 3)。

CubeMX配置步骤:

  1. 引脚分配:在Pinout & Configuration视图,找到你需要使用的模拟输入引脚(例如PA1, PA2, PA3),将其功能设置为ADC1_IN1,ADC1_IN2,ADC1_IN3
  2. ADC1参数设置
    • 在左侧导航栏找到Analog->ADC1
    • Resolution: 选择12 Bits。分辨率越高,转换时间越长。
    • Scan Conversion Mode:启用(Enabled)。这是多通道扫描的关键。
    • Continuous Conversion Mode: 根据需求选择。启用则自动连续转换;禁用则需要手动或定时器触发。
    • Discontinuous Conversion Mode: 通常禁用。
    • DMA Continuous Requests: 如果启用了连续转换并打算用DMA,必须启用此项,否则DMA只传输一次。
    • End Of Conversion Selection: 选择EOC flag after each conversion(每个通道转换后产生EOC)或EOC flag after sequence(整个序列转换后产生一个EOC)。对于DMA多通道传输,通常选后者。
  3. 规则通道配置
    • 切换到Regular Channels标签。
    • Rank中依次添加你的通道。Rank 1选择Channel 1Sampling Time选择一个时间(如Cycles 239.5,时间越长,抗噪性越好,但速度越慢)。然后添加Rank 2(Channel 2),Rank 3(Channel 3)。这个顺序就是ADC扫描采样的顺序。
  4. DMA配置(强烈推荐)
    • DMA Settings标签点击Add
    • DMA Request选择ADC1
    • Mode选择Circular(循环模式),这样DMA会不间断地自动搬运数据。
    • Data Width选择Word(32位),因为HAL库的ADC值存放在uint32_t类型的变量中。

代码要点与解析:

// 1. 定义缓冲区 uint32_t adc_buf[3]; // 存放3个通道的数据 // 2. 启动ADC的DMA转换 HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buf, 3); // 参数解释:&hadc1 - ADC1句柄 // adc_buf - 目标内存地址 // 3 - 需要转换的数据长度(等于通道数) // 此后,adc_buf数组就会被DMA自动更新,内容为[通道1值, 通道2值, 通道3值] // 无需在main循环中调用HAL_ADC_GetValue // 3. 将原始值转换为电压(假设Vref+ = 3.3V) float voltage_ch1 = (float)adc_buf[0] / 4095.0f * 3.3f; // 12位精度,满量程4095

实操心得Sampling Time(采样时间)的配置至关重要。对于高输出阻抗的传感器,如果采样时间太短,ADC内部的采样电容来不及充到稳定电压,会导致读数不准。一个简单的原则:信号源阻抗越高,需要的采样时间越长。如果不确定,可以先设一个较长的值(如239.5 Cycles)确保读数稳定,再尝试缩短以提升速度。

3.2 场景二:配置ADC1与ADC2同步采样不同通道

现在我们需要同时采集两个信号(比如电机的电流和电压),要求采样时刻严格对齐。这就需要使用ADC12的同步模式。

CubeMX配置步骤:

  1. 配置ADC1(主ADC)
    • 基本设置同上(分辨率、扫描模式等)。
    • 关键步骤:在Multimode Mode下拉框中,选择一种同步模式。例如Dual Regular simultaneous mode only(仅规则通道同步模式)。ADC1的DMA必须启用。
    • 配置ADC1的规则通道(例如Channel 1)。
  2. 配置ADC2(从ADC)
    • 启用ADC2。
    • Multimode Mode会自动关联,无需额外设置。
    • 注意:ADC2的Scan Conversion ModeContinuous Conversion Mode应与ADC1保持一致。
    • 配置ADC2的规则通道(例如Channel 2)。它的转换将由ADC1的触发事件来同步启动
  3. DMA配置
    • 只在ADC1下配置DMA。因为在这种模式下,ADC1和ADC2转换完成的数据会通过一个特定的数据寄存器(ADC_CDR)被ADC1的DMA统一读取。

代码要点与解析:

// 1. 定义缓冲区。在同步模式下,ADC1和ADC2的数据会交错存储。 uint32_t adc_sync_buf[2]; // 索引0放ADC1数据,索引1放ADC2数据 // 2. 启动同步转换。只需要启动主ADC1的DMA。 HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*)adc_sync_buf, 2); // 注意这里使用的是 `HAL_ADCEx_MultiModeStart_DMA` 而不是普通的 `HAL_ADC_Start_DMA` // 3. 数据处理 uint16_t adc1_value = adc_sync_buf[0] & 0xFFFF; // 低16位是ADC1数据 uint16_t adc2_value = adc_sync_buf[1] & 0xFFFF; // 高16位是ADC2数据(取决于模式,需查手册) // 更准确的获取方式应参考参考手册中关于双ADC模式数据寄存器的描述 // 对于F1系列,通常使用 `HAL_ADCEx_MultiModeGetValue` 函数来获取组合后的值并解析

踩坑记录:双ADC模式下的数据排列格式是最大的坑点之一。不同的同步模式(如SimultaneousInterleavedAlternate trigger),ADC1和ADC2的数据在ADC_CDR寄存器或DMA缓冲区中的排列顺序可能不同。务必查阅《参考手册》的“双ADC模式”章节,找到对应的数据格式图,否则解析出的数据全是错的。我建议在初始化后,用已知电压测试每个通道,打印出原始数据,确认排列顺序。

4. 时钟与采样率计算:让你的ADC跑在最佳状态

ADC的性能和采样率直接受到时钟频率的影响。STM32F103的ADC时钟(ADCCLK)由PCLK2(APB2时钟)分频而来。配置不当会导致采样率达不到要求,或者转换精度下降。

4.1 时钟树配置分析

在CubeMX的Clock Configuration标签页:

  1. 系统时钟(SYSCLK)通常设为72MHz(F103的最高频率)。
  2. APB2总线时钟(PCLK2)默认与SYSCLK同频,即72MHz。
  3. ADC时钟(ADCCLK)必须由PCLK2经过分频得到,且最大不能超过14MHz(这是STM32F103 ADC模块的极限)。

因此,最常用的配置是:将PCLK2的72MHz进行6分频,得到12MHz的ADCCLK。这个频率既安全,又能提供不错的转换速度。

4.2 单次转换时间与最大采样率计算

一次ADC转换所需的总时间(Tconv)由两部分组成:Tconv = 采样时间 + 转换时间

  • 采样时间(Tsampling):在CubeMX的Sampling Time中选择,例如239.5 Cycles。这个周期数是ADCCLK的周期数。Tsampling = 采样周期数 / ADCCLK
  • 转换时间(Tconversion):对于12位分辨率,固定为12.5个ADCCLK周期

举例计算

  • ADCCLK = 12 MHz
  • 采样时间选择 = 239.5 Cycles
  • 总周期数 = 239.5 + 12.5 = 252 Cycles
  • Tconv= 252 / 12 MHz ≈21 us
  • 对应的最大采样率≈ 1 / 21 us ≈47.6 kSPS(每秒千次采样)

注意事项:这是单个通道单次转换的理论极限。如果使用多通道扫描,总转换时间需要乘以通道数。如果使用DMA连续传输,实际可持续的采样率就是1 / Tconv。另外,12.5这个固定转换周期数很重要,很多人在计算时漏掉它,导致预期的采样率远高于实际值。

4.3 双ADC模式下的采样率提升

在交替采样模式(Interleaved)下,ADC1和ADC2轮流对同一通道采样。假设每个ADC的单次转换时间仍是21us,但由于它们交替工作,从系统角度来看,采样间隔就缩短到了约10.5us,等效采样率提升至约95.2 kSPS。这是利用ADC12模式提升单通道采样率的典型方法。

5. 常见问题排查与调试技巧

即使配置正确,ADC采样也常常会遇到各种“玄学”问题。下面是我总结的几个高频问题点和排查思路。

5.1 问题一:采样值不稳定,跳动大

  • 可能原因1:电源和参考电压噪声
    • 排查:确保模拟部分电源(VDDA)干净稳定,并与数字电源(VDD)通过磁珠或0Ω电阻隔离,在靠近芯片引脚处并联10uF和0.1uF的退耦电容。如果使用内部参考电压,需注意其精度和温漂。
    • 解决:为VDDA使用独立的LDO供电,并增加LC滤波。对于高精度应用,考虑使用外部基准电压源芯片。
  • 可能原因2:采样时间不足
    • 排查:信号源有较高的输出阻抗(如分压电阻、某些传感器),ADC的采样开关阻抗与之形成RC电路,充电需要时间。
    • 解决:在CubeMX中大幅增加Sampling Time(如设置为最大239.5 Cycles),观察跳动是否减小。如果是,则说明需要更长的采样时间,或者需要在信号源和ADC输入之间增加一个电压跟随器(运放)来降低输出阻抗。
  • 可能原因3:数字信号干扰
    • 排查:ADC输入引脚附近有高速数字信号(如PWM、SPI时钟)频繁翻转。
    • 解决:布线时让模拟走线远离数字走线。在软件上,可以在ADC采样期间短暂关闭附近不必要的高速外设。

5.2 问题二:DMA传输不工作或数据错位

  • 可能原因1:DMA缓冲区溢出或配置错误
    • 排查:检查DMA是否配置为Circular模式。检查缓冲区大小是否足够(Size参数应等于需要转换的总通道数)。在双ADC模式下,缓冲区大小和数据结构要匹配复杂的多ADC数据格式。
    • 解决:使用调试器查看DMA相关寄存器(如CNDTR)是否在递减。在DMA传输完成中断(HAL_ADC_ConvCpltCallback)中设置断点,看是否能进入。
  • 可能原因2:多ADC模式数据解析错误
    • 现象:双ADC模式能进DMA中断,但读出的数据明显不对,比如两个通道值相同或为0。
    • 解决:这是最经典的问题。回头仔细看《参考手册》!找到你所用同步模式(如“Dual Simultaneous Mode”)对应的数据寄存器(ADC_CDR)结构图。写一个简单的测试代码,让ADC1和ADC2采集两个已知的不同电压(如3.3V和GND),然后打印出DMA缓冲区里的原始32位数据,对照手册逐位分析,确认ADC1和ADC2的数据分别在哪几个比特位。

5.3 问题三:注入通道与规则通道冲突

  • 现象:规则通道在循环采样,但偶尔需要紧急采样一个关键信号(如过流保护),使用了注入通道。发现注入通道采样后,规则通道的序列被打乱或DMA错乱。
  • 原因:注入通道拥有更高优先级,会中断规则通道的转换。转换完成后,规则通道的序列是从中断点继续还是重新开始,取决于JAUTO位和DISCEN位的配置。
  • 解决:如果希望注入转换后规则序列继续,需禁用自动注入(JAUTO=0)并合理配置不连续模式。更稳妥的做法是,在注入通道转换完成后,手动重启规则通道的DMA转换(先Stop,再Start)。

5.4 调试利器:ADC的看门狗与中断

除了DMA,善用ADC的内部看门狗(Analog Watchdog)和中断能极大提升系统可靠性。

  • 模拟看门狗:可以为一个或一组通道设置电压阈值(高阈值和低阈值)。当采样值超出这个窗口范围时,会触发中断。非常适合用于电池电压监控、故障检测等场景,无需CPU不断轮询ADC值。
  • 转换完成中断(EOC):即使不用DMA,在单通道单次转换模式下,使能EOC中断,在中断服务程序里读取数据,也是一种简单可靠的异步采样方式,尤其适合低速、非连续的采样需求。

我个人在复杂项目中,通常会采用“DMA连续传输规则通道 + 看门狗监控关键注入通道”的组合方案。DMA负责高效搬运大量的常规采样数据,而看门狗则像一名忠诚的哨兵,只在异常发生时才打断CPU,实现了效率与安全性的平衡。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询