stm32ad
好的!STM32 中的 ADC (Analog-to-Digital Converter, 模数转换器) 是将模拟信号(如电压)转换为数字信号的核心外设。下面是关于 STM32 ADC 的中文详解:
1. 什么是 ADC?
- 功能: 将连续变化的模拟信号(例如来自传感器、电位器、麦克风的电压)转换成计算机(单片机)可以处理的离散数字值(0 和 1)。
- 重要性: 现实世界充满模拟信号,STM32 需要 ADC 来“感知”这些信号(如温度、光照、压力、声音),进而进行处理或控制。
2. STM32 ADC 的关键特性
- 分辨率 (Resolution):
- 表示 ADC 能将输入的模拟电压细分成的步数 (Steps)。
- 通常以 位数 (Bits) 表示(例如 12-bit, 10-bit)。
- 12-bit ADC 最常见: 意味着输入电压范围 (VREF) 被分成
2^12 = 4096个离散电平。 - 分辨率越高,能区分的电压变化越小,精度越高。
- 转换时间 (Conversion Time):
- 完成一次模拟到数字转换所需的时间。
- 包括采样时间和转换时间本身。
- 受 ADC 时钟频率和配置(采样周期、转换周期数)影响。
- 对于快速变化的信号,需要较短的转换时间。
- 通道 (Channels):
- 每个 ADC 外设有多个输入引脚(通道),可以轮流采集多个模拟信号源。
- 数量取决于具体的 STM32 型号(可能从几个到二十几个)。
- 扫描模式 (Scan Mode):
- ADC 可以自动按顺序(根据配置好的通道列表)转换多个通道。
- 连续转换模式 (Continuous Conversion Mode):
- ADC 在完成一次转换后,立即开始下一次转换,形成连续的数据流。
- 单次转换模式 (Single Conversion Mode):
- 由软件触发或硬件触发一次,只完成一次转换后停止。
- 触发源 (Trigger Sources):
- 控制 ADC 何时开始一次转换或一个序列的转换。
- 软件触发: 通过程序指令启动转换。
- 硬件触发: 由其他外设(如定时器 TIM1/2/3/4/5/8, EXTI 线)产生的信号自动启动转换。这对于需要精确采样时刻的应用(如电机控制、音频采样)至关重要。
- 数据对齐 (Data Alignment):
- 转换结果(数字值)在结果寄存器中是左对齐还是右对齐。影响编程时如何读取和处理数据(可能需要移位)。
- 参考电压 (Reference Voltage - VREF ):
- ADC 测量的基准电压范围。
数字值 = (模拟输入电压 / V<sub>REF</sub> ) * (2<sup>分辨率</sup> - 1)- 常用参考源:
V<sub>REF+</sub>:外部引脚输入的高精度参考电压(推荐用于高精度测量)。V<sub>DDA</sub>:单片机的主模拟供电电压(通常在 PCB 上需干净稳定)。
- 接地参考通常是
V<sub>SSA</sub>/V<sub>SS</sub>(0V)。
- 模拟看门狗 (Analog Watchdog - AWD):
- 可以监控某个特定通道或所有通道的转换结果。
- 如果结果低于设定的低阈值或高于设定的高阈值,就会产生中断。用于监控传感器是否超出安全范围。
- 独立/双重/三重模式 (Independent/Dual/Triple Mode):
- 某些系列(如 F1, F4)有多个 ADC 内核。
- 独立模式: 每个 ADC 独立工作。
- 双重/三重模式: 多个 ADC 内核协同工作(例如,同时采样同一通道、交替采样、交错采样),显著提高有效采样率或实现同步采集。
- 注入通道 (Injected Channels):
- 优先级高于规则通道的通道组。可以在规则通道序列转换过程中被“插队”转换(例如响应紧急事件)。有自己的结果寄存器队列。
- 规则通道 (Regular Channels):
- 按顺序转换的常规通道组。配置好序列后,ADC 按顺序扫描它们。
3. 使用 STM32 ADC 的一般流程
- 初始化:
- 使能 ADC 时钟 (通过 RCC 寄存器)。
- 配置 ADC 使用到的 GPIO 引脚为模拟输入模式。
- 配置 ADC 基本参数:分辨率 (
ADC_Resolution)、数据对齐 (ADC_DataAlignment)、扫描模式 (ADC_ScanConvMode)、连续转换模式 (ADC_ContinuousConvMode)。 - 配置触发源 (
ADC_ExternalTrigConv)。 - 配置通道序列:为规则通道 (
ADC_RegularChannelConfig) 和/或注入通道 (ADC_InjectedChannelConfig) 指定转换顺序(通道号)和每个通道的采样时间 (ADC_SampleTime)。 - 配置参考电压(通常依赖电路设计)。
- 可选:配置模拟看门狗 (Threshold, Channel)。
- 可选:配置中断 (EOC - 转换结束, AWD - 看门狗)。
- 校准 (Calibration):
- 启动校准过程 (
ADC_Cmd(ADCx, ENABLE),ADC_StartCalibration(ADCx))。 - 等待校准完成 (
while (ADC_GetCalibrationStatus(ADCx));)。校准是提高精度的关键步骤!
- 启动校准过程 (
- 启动转换:
- 软件触发:
ADC_SoftwareStartConvCmd(ADCx, ENABLE)(规则通道) 或ADC_SoftwareStartInjectedConvCmd(ADCx)(注入通道)。 - 硬件触发: 配置好触发源(如定时器)后,触发器会自动启动 ADC。无需软件干预。
- 软件触发:
- 读取结果:
- 查询法: 在适当的位置(如主循环或等待循环)使用
ADC_GetFlagStatus(ADCx, ADC_FLAG_EOC)检查转换结束标志,然后用ADC_GetConversionValue(ADCx)读取规则通道结果,用ADC_GetInjectedConversionValue(ADCx, ADC_InjectedChannel_x)读取注入通道结果。 - 中断法: 在 ADC 中断服务程序 (ISR) 中根据中断标志 (
ADC_IT_EOC,ADC_IT_JEOC,ADC_IT_AWD) 读取相应的结果寄存器。通常配合 DMA 进行多通道高速连续采样。
- 查询法: 在适当的位置(如主循环或等待循环)使用
- DMA (直接内存访问 - 强烈推荐用于连续扫描模式):
- 在扫描模式+连续转换模式下,转换完成会非常频繁。
- 配置 ADC 的 DMA 请求。每次规则组转换完成 (
EOC) 或注入组转换完成 (JEOC),都会触发 DMA 自动将结果寄存器的数据搬运到你指定的内存数组 (Buffer) 中。 - 大幅减轻 CPU 负担,避免数据丢失,实现高速连续采集。
- DMA 传输完成(半满或全满)时会产生中断,此时 CPU 可以批量处理采集到的数据。
4. 示例代码片段 (伪代码,基于标准外设库/HAL 库概念)
// 1. 使能时钟 & 配置 GPIO (模拟输入)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 假设通道0在 PA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 2. 初始化ADC基本结构体
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE; // 使能扫描(多通道)
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 软件触发
ADC_InitStructure.ADC_DataAlignment = ADC_DataAlignment_Right; // 右对齐
ADC_InitStructure.ADC_NbrOfChannel = 2; // 规则组使用2个通道
ADC_Init(ADC1, &ADC_InitStructure);
// 3. 配置规则组通道及其采样时间
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // 通道0(PA0)放在规则序列第1位
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); // 通道1(PA1)放在规则序列第2位
// 4. 使能ADC并校准
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1));
// 5. 配置DMA (简化示例)
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; // 源地址:ADC结果寄存器
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCBuffer[0]; // 目标地址:内存数组
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 2; // 每次扫描2个通道,搬运2个结果
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 半字(16bit, 对应12bit结果)
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循环模式,不断覆盖
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_Init(DMA1_Channel1, &DMA_InitStructure); // 假设通道1对应ADC1
DMA_Cmd(DMA1_Channel1, ENABLE);
// 6. 使能ADC的DMA请求
ADC_DMACmd(ADC1, ENABLE);
// 7. 启动ADC转换(软件触发)
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
// 此时,ADCBuffer 数组会源源不断地被ADC采集到的[通道0数据, 通道1数据]所填充。
// 可以在DMA传输完成中断或者主循环中访问 ADCBuffer 来处理数据。
5. 重要提示
- 库选择: 现代开发主要使用 HAL (Hardware Abstraction Layer) 库 或 LL (Low-Layer) 库。上面的伪代码结构体名和函数名源自较老的标准外设库 (SPL),主要是为了说明概念。实际项目应使用 STM32CubeMX 工具生成 HAL/LL 初始化代码。
- 参考电压 (VREF): 务必保证
V<sub>REF+</sub>或V<sub>DDA</sub>的稳定性。噪声或不准确会直接影响所有通道的测量精度。使用外部精密基准源是最佳实践。 - 采样时间: 对于高源阻抗的信号源(如某些温度传感器、长导线连接的传感器),需要足够长的采样时间
(ADC_SampleTime),让采样电容能充分充电到信号电压。 - PCB 布局: 模拟信号走线要远离数字噪声源(如时钟线、开关电源),适当使用滤波电容,良好的接地设计对 ADC 精度至关重要。
- 校准: 每次上电后进行校准 (
ADC_StartCalibration()) 能显著提高精度。器件内部有校准系数存储。 - 抗噪: 可以配置 ADC 的时钟分频器 (
ADC_Prescaler) 来选择合适的 ADC 时钟速度。有时降低速度可提高抗噪能力(但转换时间变长)。
希望这个详细的中文解释能帮助你理解和使用 STM32 的 ADC 功能!在实际开发中,务必结合你使用的具体 STM32 型号的参考手册 (Reference Manual RMxxxx) 和数据手册 (Datasheet DSxxxx)。
STM32F103RCT6
1970-01-01 08:00:00 至 1970-01-01 08:00:00
stm32ad采样测电压范围
的电压的范围。在本文中,我们将详细介绍STM32AD采样测电压范围及其相关的知识。 一、STM32AD转换模块简介: STM32系列微控制器广泛
2023-12-29 10:35:37
stm32L编程手册
本参考手册面向应用程序开发人员。 它提供了有关的完整信息如何使用STM32L151xx,STM32L152xx和STM32L162xx微控制器存
资料下载
姚小熊27
2021-04-28 16:00:38
STM32F429NIH6 一款STM32位控制MCU
1970-01-01 08:00:00 至 1970-01-01 08:00:00
STM3210B-PFSTICK
STM32 Hitex STM32-PerformanceStick STM32F1 MCU 32-Bit ARM® Cortex®-M3 Em
STM32-PRIMER
STM32-PRIMER - Raisonance STM32 Primers for fun, easy evaluation and development with
函数发生器输出电压值与设定值不同的原因
我是在做STM32AD采样时发现的这个问题,明明输出的信号峰峰值1V,通过单片机计算过幅值之后,却翻了一倍。加上直流偏移量之后,就变得无规律可循。本以为是程序的问题,后来放到示波器上验证了一下,发现结果和我用STM32
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览