STM32外设AD/DA-基础及CubeMX配置
- 一,什么是AD/DA
- 二,基础概念
- 1,模拟 vs 数字
- 2,AD转换
- 1,分辨率 (Resolution)
- 2,参考电压 (Reference Voltage, Vref)
- 3,采样率 (Sampling Rate)
- 3,DA转换
- 1,分辨率 (Resolution)
- 2,参考电压 (Reference Voltage, Vref)
- 3,转换速率与建立时间 (Settling Time)
- 4,输出缓冲 (Output Buffer)
- 三,硬件连接:捕捉模拟信号
- 1,找到 ADC 输入引脚:
- 2,连接模拟信号源:
- 3,连接地线 (GND):
- 4,(可选)连接 Vref:
- 四,CobeMX配置
- 1,模式和分辨率相关
- 1,分辨率 (Resolution)
- 2,数据对齐 (Data Alignment)
- 3,转换模式 (Conversion Mode)
- 2,时钟配置相关
- 1,时钟来源与分频 (Clock Source & Prescaler)
- 2,ADCCLK 与转换时间
- 3,采样时间 (Sampling Time)
- 4,扫描模式相关
- 1,扫描转换模式 (Scan Conversion Mode)
- 2,规则通道配置 (Regular Conversion Launch)
- 3,扫描结束选择 (End of Conversion Selection - EOC)
- 4,不连续转换模式 (Discontinuous Conversion Mode)
- 5,外部触发配置
- 1,定时器触发 (Timer Trigger):
- 2,软件触发 (Software Trigger):
- 3,外部引脚触发 (EXTI line x event):
- 6,DMA 配置
- 1,添加 DMA 请求 (Add DMA Request)
- 2,DMA 通道配置 (DMA Request Settings)
一,什么是AD/DA
我们已经掌握了如何让单片机通过 UART 与外界"交流"。但是,现实世界充满了连续变化的模拟信号,比如温度、光线强度、声音大小等等。单片机内部处理的是离散的数字信号,如何让它们互相理解呢?
这时,ADC (Analog-to-Digital Converter, 模数转换器) 和 DAC (Digital-to-Analog Converter, 数模转换器) 就派上用场了!
ADC: 就像一位"翻译官",把现实世界的模拟语言(连续变化的电压)翻译成单片机能懂的数字语言(离散的数值)。
现实世界的模拟信号比如温度、光线强度、声音大小,其实都可以转化为连续的电压信号
DAC: 则反过来,把单片机的数字指令翻译成模拟世界的电压信号,用来控制模拟器件(比如驱动扬声器发出声音、控制电机速度等)。
这里A代表模拟,D代表数字,怎么记忆?
记住模拟和A的笔画相对数字和D多,就可以将二者关联起来,再记住AD就是A到D,DA就是D到A就行了
二,基础概念
1,模拟 vs 数字
想象一下调节收音机的音量旋钮和按计算器的数字键:
模拟 (Analog): 像音量旋钮,可以在一个范围内连续变化,有无限多个可能的音量值。现实世界的物理量大多是模拟的。
数字 (Digital): 像计算器的按键,只有有限的、离散的状态(0, 1, 2…)。计算机和单片机处理的是数字信号。
ADC 的任务就是把模拟信号"采样"并"量化"成数字值。
2,AD转换
1,分辨率 (Resolution)
分辨率决定了 ADC 能将模拟电压"切"成多少份,也就是它能区分多么细微的电压变化。通常用"位" (bits) 来表示。
例如,一个 12 位的 ADC,能表示 212=4096 个不同的数字级别。如果参考电压是 3.3V,那么它能分辨的最小电压变化大约是 3.3V/4096~~0.0008V或 0.8mV。
分辨率越高,测量越精确,但转换速度可能越慢,成本也越高。
2,参考电压 (Reference Voltage, Vref)
参考电压是 ADC 进行测量的"标尺"。它定义了 ADC 能够转换的模拟电压的最大值。输入的模拟电压不能超过参考电压。
ADC 输出的数字值通常与输入电压的关系是:
在很多 STM32 单片机中,Vref 通常连接到 Vdda (模拟电源电压),比如 3.3V。精确的 Vref 对于准确的 ADC 转换至关重要。
3,采样率 (Sampling Rate)
采样率表示 ADC 每秒钟进行多少次模数转换。单位通常是 SPS (Samples Per Second) 或 Hz。
根据奈奎斯特采样定理,采样率必须至少是被测模拟信号最高频率的两倍,才能无失真地还原原始信号。采样率越高,越能捕捉到快速变化的模拟信号。
3,DA转换
1,分辨率 (Resolution)
与 ADC 类似,DAC 的分辨率也决定了其输出精度的细腻程度,同样用"位" (bits) 表示。
一个 12 位的 DAC,可以将输入的数字值 (0 到
) 映射到输出电压范围内的 4096 个不同的模拟电压等级。分辨率越高,输出的模拟信号越平滑,越接近理想的模拟波形。
2,参考电压 (Reference Voltage, Vref)
DAC 的参考电压定义了其输出模拟电压的最大值。输出电压通常与输入的数字值成正比:
例如,对于 12 位 DAC,Vref = 3.3V:
输入数字值为 0 时,输出电压 ≈ 0V。
输入数字值为 4095 时,输出电压 ≈ 3.3V。
输入数字值为 2048 时,输出电压 ≈ 3.3V * (2048 / 4096) = 1.65V。
同样,稳定精确的 Vref 对 DAC 的输出精度至关重要。
3,转换速率与建立时间 (Settling Time)
DAC 将数字值转换为模拟电压需要一定的时间。建立时间是指从数字输入改变到模拟输出稳定在目标电压的一小段误差范围内所需的时间。这限制了 DAC 能够产生的模拟信号的最大频率。
4,输出缓冲 (Output Buffer)
许多 DAC 内部集成了一个输出缓冲器(运算放大器)。启用输出缓冲可以:
提高驱动能力: 使 DAC 能够驱动一定的负载(比如直接驱动小阻抗的负载或后续电路),而不会导致电压下降。
降低输出阻抗: 提供更稳定的输出电压。
在 CubeMX 中通常可以选择是否启用 DAC 通道的输出缓冲。
三,硬件连接:捕捉模拟信号
将模拟信号连接到 ADC 非常简单:
1,找到 ADC 输入引脚:
在你的 STM32 开发板上,通常会有标明如 PA0
, PC1
等,并且这些引脚在 CubeMX 中可以配置为 ADC 的输入通道 (如 ADC1_IN0
, ADC1_IN11
)。查阅开发板原理图或引脚定义是最好的方法。
2,连接模拟信号源:
将你的模拟信号源(比如电位器、温度传感器、光敏电阻分压电路的输出端)连接到选定的 ADC 输入引脚。
3,连接地线 (GND):
确保模拟信号源的地线 (GND) 与 STM32 开发板的地线 (GND) 共地连接。这是保证测量准确的基础。
4,(可选)连接 Vref:
确保 ADC 的参考电压引脚 (Vref+ 或 Vdda) 连接到稳定、精确的参考电压源(通常是开发板上的 3.3V)。
注意: 输入到 ADC 引脚的电压绝对不能超过其允许的最大范围(通常是 0V 到 Vdda/Vref+)。GND 必须连接!
四,CobeMX配置
我的主控芯片ADC输入引脚是PC0,所以CubeMX将PC0引脚配置为ADC-IN引脚
1,模式和分辨率相关
1,分辨率 (Resolution)
决定 ADC 能分辨的最小电压变化,通常以位 (bits) 表示。STM32 的 ADC 通常支持 12 位、10 位、8 位或 6 位分辨率。
12 bits (常用, 0-4095)
10 bits (0-1023)
8 bits (0-255)
6 bits (0-63)
说明: 分辨率越高,精度越高,但转换时间可能越长。通常选择 12 bits 以获得最佳精度
2,数据对齐 (Data Alignment)
ADC 转换结果是一个数字值(如 12 位),但它存储在 16 位或 32 位的数据寄存器 (ADC_DR) 中。数据对齐方式决定了有效数据位在寄存器中的位置。
Right alignment (右对齐)
Left alignment (左对齐)
Right Alignment: 推荐 有效数据位位于寄存器的低位 (LSB)。例如,12 位结果存储在 bit 11 到 bit 0。读取值即为 0-4095。
Left Alignment: 有效数据位位于寄存器的高位 (MSB)。例如,12 位结果存储在 bit 15 到 bit 4。这种方式在某些需要更高精度比例计算或与 8 位系统兼容时可能有用,但读取后通常需要右移 4 位。
3,转换模式 (Conversion Mode)
定义 ADC 如何进行转换。
Single Conversion Mode (单次转换): 轮询/中断基础 每次触发(软件或硬件)只进行一次转换,然后停止。需要再次触发才能进行下一次转换。常用于轮询法或简单的中断法。
Continuous Conversion Mode (连续转换): DMA常用 首次触发后,ADC 会自动连续不断地进行转换,每次转换完成后立即开始下一次转换,直到手动停止。常用于配合 DMA 进行高速连续采样。
注意: Scan Mode (扫描模式) 和 Discontinuous Mode (不连续模式) 的配置在 “扫描模式设置” 中详述。
配置建议:
分辨率通常选 12 bits。
数据对齐选 Right alignment。
转换模式根据应用选择:需要单次读取用 Single;需要连续采样(尤其配合DMA)用 Continuous。
2,时钟配置相关
1,时钟来源与分频 (Clock Source & Prescaler)
ADC 模块通常有一个独立的可配置时钟源。这个时钟源通常来自 APB2 总线时钟 (PCLK2) 或其他专用时钟 (如 HSI, PLL 输出等),然后经过一个预分频器 (Prescaler) 进一步分频后,才作为 ADC 的工作时钟 (ADCCLK)。
ADCCLK = ADC Clock Source / Prescaler
在 CubeMX 中,通常在 “Clock Configuration” 标签页可以查看和配置 ADC 的时钟来源和频率,而在 ADC 的 “Parameter Settings” 中选择预分频系数。
PCLK2 divided by 2
PCLK2 divided by 4
PCLK2 divided by 6
PCLK2 divided by 8
… (其他可能的时钟源和分频)
2,ADCCLK 与转换时间
ADC 的总转换时间由两部分组成:采样时间 (Sampling Time) 和 固定的转换位数时间。
Total Conversion Time = Sampling Time + N * (1 / ADCCLK)
其中 N 是 ADC 的分辨率 (例如 12 位时 N=12.5 或类似值,具体查阅芯片手册)。
因此,ADCCLK 频率越高,总转换时间越短,允许的最大采样率越高。但是,ADCCLK 不能超过芯片手册规定的最大值 (通常在几十 MHz 范围)。
重要限制: 必须确保配置后的 ADCCLK 频率不超过芯片数据手册 (Datasheet) 中规定的 ADC 最大工作频率 (fADC_max)。例如,对于很多 F1 系列是 14MHz,F4 系列可能高达 36MHz。超过此限制可能导致转换结果不准确或 ADC 工作异常。
配置建议: 在满足最大频率限制的前提下,选择一个能提供所需采样率的尽可能高的 ADCCLK 频率。通常选择中间的分频值 (如 /4, /6) 是比较稳妥的选择。
3,采样时间 (Sampling Time)
采样时间 (Sampling Time) 指 ADC 在转换前对输入信号进行采样保持的时间长度。这个时间需要足够长,以确保 ADC 内部的采样保持电容 (Csh) 完全充电到输入引脚的电压。
配置选项:
采样时间以 ADCCLK 周期数表示。CubeMX 为每个 ADC 通道提供了多个可选的采样时间值。
1.5 Cycles
7.5 Cycles
13.5 Cycles
28.5 Cycles
55.5 Cycles
71.5 Cycles
239.5 Cycles
… (其他可能值)
选择依据:
选择合适的采样时间主要取决于模拟信号源的输出阻抗 (Rsource) 和 ADC 输入引脚的特性(内部采样电容 Csh 和输入电阻 RADC)。
为了让采样电容 Csh 充电到足够接近输入电压(例如误差小于 1/2 LSB),需要的充电时间 Tcharge 与 RC 时间常数有关。粗略地说:
Tcharge ≈ k * (Rsource + RADC) * Csh
其中 k 是一个系数(通常取 7 到 10 左右以达到足够精度)。
我们选择的采样时间 (Sampling Time Cycles / ADCCLK) 必须大于 Tcharge。
简化规则:
低阻抗信号源 (如运放输出,< 1kΩ): 可以选择较短的采样时间 (如 1.5, 7.5, 13.5 Cycles)。
中阻抗信号源 (如电位器分压,1kΩ ~ 50kΩ): 需要选择中等的采样时间 (如 28.5, 55.5 Cycles)。
高阻抗信号源 (> 50kΩ): 需要选择较长的采样时间 (如 71.5, 239.5 Cycles),或者在 ADC 输入前添加一个电压跟随器(运放)来降低信号源阻抗。
配置建议:
对于不确定的信号源,或者为了保证兼容性,选择一个稍长的采样时间通常是安全的 (例如 28.5 Cycles 或 55.5 Cycles)。
选择过短的采样时间会导致转换结果偏低或不准确。
选择过长的采样时间会增加总转换时间,降低最大采样率。
在多通道扫描模式下,可以为每个通道配置不同的采样时间。
注意: 如果信号源阻抗非常高,即使选择最长采样时间也可能不够。此时必须考虑使用外部缓冲电路。
4,扫描模式相关
当需要测量多个模拟输入通道时,需要配置 ADC 的扫描模式。这些设置决定了 ADC 如何依次转换多个通道。
1,扫描转换模式 (Scan Conversion Mode)
Disabled: 单通道 ADC 只转换配置的第一个通道 (Rank 1)。
Enabled: 多通道 ADC 会按照配置的 Rank 顺序,依次转换多个通道。
2,规则通道配置 (Regular Conversion Launch)
当 Scan Mode 启用时,需要配置以下参数来定义转换序列:
Number Of Conversion: 定义在一次扫描序列中要转换的通道总数 (1 到 16 个)。
Rank 配置: 对于序列中的每一个 Rank (位置),需要指定:
Channel: 选择要在此 Rank 转换的 ADC 通道 (e.g., Channel 0, Channel 1, Temp Sensor, Vbat)。
Sampling Time: 为此通道设置采样时间(可以每个通道不同)。
示例: 转换 PA0 (Channel 0) 和 PA1 (Channel 1)
Number Of Conversion: 2
Rank 1: Channel 0, Sampling Time: 28.5 Cycles
Rank 2: Channel 1, Sampling Time: 55.5 Cycles
3,扫描结束选择 (End of Conversion Selection - EOC)
这个设置决定了何时产生 EOC (转换结束) 标志或中断。
End of single conversion (单个转换结束)
End of sequence conversion (序列转换结束)
End of single conversion: 每个通道转换完成后都会产生 EOC 标志。
End of sequence conversion: DMA常用 只有当整个扫描序列中的所有通道都转换完成后,才会产生 EOC 标志。这在使用 DMA 读取整个序列结果时非常有用。
4,不连续转换模式 (Discontinuous Conversion Mode)
这是一个可选的高级模式,允许将扫描序列分成几个小组进行转换。每次外部触发只会转换一个小组。
如果启用,需要设置 “Number Of Discontinuous Conversions” 来指定每个小组包含的通道数量。例如,扫描 6 个通道,分成 3 组,每次触发转换 2 个通道。
应用场景: 需要以较低频率交错采样多组通道,或者在特定时间点集中采样某几个通道。
配置建议:
测量单通道:Scan Mode: Disabled。
测量多通道:Scan Mode: Enabled,并配置好 Number Of Conversion 和每个 Rank 的 Channel/Sampling Time。
配合 DMA 读取整个序列:设置 EOC Selection: End of sequence conversion。
Discontinuous Mode 使用较少,仅在特定需求时启用。
5,外部触发配置
除了软件启动转换 (调用 HAL_ADC_Start()),ADC 还可以配置为由外部事件触发启动,这对于精确控制采样时刻至关重要,尤其是在配合 DMA 使用时。
选择相应的外部触发源 (External Trigger Conversion Source),可以启动ADC转换
常见的触发源包括:
1,定时器触发 (Timer Trigger):
最常用 可以选择多个定时器 (TIM1, TIM2, TIM3, …) 的不同事件作为触发源。常用的有:
Timer x Trigger Out event (TRGO): 定时器的主要触发输出信号,通常配置为由定时器的更新事件 (Update Event - UEV) 产生。这是实现固定频率采样的关键。
Timer x Capture Compare x event: 定时器的捕获/比较匹配事件。
2,软件触发 (Software Trigger):
默认/手动 通过调用 HAL_ADC_Start() 等函数来手动启动转换。
3,外部引脚触发 (EXTI line x event):
由外部 GPIO 引脚上的边沿事件触发。
这个边沿事件什么呢
是触发边沿 (External Trigger Conversion Edge)
选择触发事件的有效边沿。
Rising edge (上升沿)
Falling edge (下降沿)
Both edges (双边沿)
Disabled (如果选择软件触发)
说明: 对于定时器触发,通常选择 Rising edge。具体选择取决于触发源信号的特性。
配置建议:
轮询法/简单中断法: 通常使用 Software Trigger (保持默认设置)。
精确固定频率采样 (配合 DMA): 推荐 选择一个定时器 (如 TIM3) 的 Trigger Out event 作为触发源,并设置边沿为 Rising edge。同时需要配置对应定时器的 TRGO 输出 (详见 “触发定时器配置”)。
确保 ADC 的 Continuous Conversion Mode 设置为 Disabled,否则外部触发可能只在第一次生效。
6,DMA 配置
使用 DMA (Direct Memory Access) 可以让 ADC 转换结果自动传输到内存,无需 CPU 干预,极大提高效率,是处理连续采样或高速采样的关键。
1,添加 DMA 请求 (Add DMA Request)
在 CubeMX 的 ADC 配置页面下找到 “DMA Settings” 标签页。点击 “Add” 按钮,选择 ADC 对应的 DMA 请求 (例如 ADC1)。
2,DMA 通道配置 (DMA Request Settings)
为选定的 DMA 请求配置参数:
Stream/Channel: 选择一个可用的 DMA 通道/流 (CubeMX 通常会自动分配)。
Direction: 方向。Peripheral To Memory (由 CubeMX 自动设置)。
Priority: DMA 通道优先级 (Low, Medium, High, Very High)。当多个 DMA 请求冲突时,高优先级优先。
Mode: DMA 传输模式。
Normal: 传输完指定长度的数据后停止。
Circular: 常用 传输到缓冲区末尾后自动回到缓冲区开头继续传输,形成环形缓冲区。这是 ADC 连续采样配合 DMA 的核心配置。
Increment Address: 地址自增设置。
Peripheral: 不勾选 ADC 数据寄存器地址固定。
Memory: 勾选 内存缓冲区地址需要递增。
Data Width: 数据宽度(外设 Peripheral / 内存 Memory)。
推荐配置:
Peripheral: Word, Memory: Word。
原因:
STM32 ADC 数据寄存器 (DR) 通常是 32 位的,即使有效数据只有 12 位或 16 位。
DMA 以 Word (32位) 传输可以最高效地匹配硬件,减少配置复杂度,并保证内存对齐。
虽然 ADC 结果是 16 位或 12 位,但将其存入 uint32_t 类型的缓冲区数组通常是最佳实践(代码中读取时取低位即可)。
将 Memory Width 设为 Half Word (16位) 也可以工作(需配合 uint16_t 缓冲区),但 Word-Word 是更常见且通常推荐的配置。
可选配置:
Peripheral: Half Word, Memory: Half Word (需配合 uint16_t 缓冲区)。
不推荐配置: Byte 传输效率较低。
配置建议:
进行连续采样(如定时器触发)或高速采样时,必须启用 DMA。
Mode 设置为 Circular。
Increment Address 勾选 Memory,不勾选 Peripheral。
Data Width 推荐 Peripheral: Word, Memory: Word,并使用 uint32_t 类型的 DMA 缓冲区。
关联:
DMA 的配置与 ADC 的触发方式 (External Trigger)、连续转换模式 (Continuous/Single) 以及中断配置 (NVIC) 紧密相关,需要协同设置才能正确工作。