STM32之ADC模数转换知识回顾

最近又玩了一个小模块Pulsesensor心率模块,这个模块是由ADC采集的,ADC知识还是挺多的,想到第一次学习ADC已经是好久以前,感慨时光如梭,拾捣拾捣以前的知识,总会又收获许多,这回便来说说ADC吧

ADC转换过程:抽样、量化、编码

STM32F407ZGT6 3 ADC ,可配置 12 位、10 位、8 位或 6 位 分辨率(把一块蛋糕分成12块、10块,分的越多,就越精细), ADC 19 个 通道 (其中外部通道16 个)。各通道的 A/D 转换可以 单次、连续、扫描或间断模式 执行。 ADC 的结果可以 左对齐或右对齐方式存储在16 位数据寄存器中。
单次: 假如有10个引脚采集adc,单次的含义就是,从头到尾采集一次,但是不会重头再来采集第二遍,除非手动再触发一次。例如歌单的 列表单次循环
连续: 从头到尾采集完,继续从头到尾循环采集。 例如歌单的 列表连续循环
扫描: 假如有多通道需要采集, 使能 此模式,会把这几个通道都采集, 失能 此模式,只会采集这几个通道中的第一个;假如只有一个通道需要, 无论使能还是失能 ,那么直接采集这个单通道就行
间断: 间断转换模式是连续转换模式的一种变体,其中ADC在每次转换后不是立即开始下一次转换,而是等待一段时间。
左对齐右对齐:16位数据寄存器中存放最多12位分辨率的数值,所以可以选择左对齐,右对齐模数
ADC最大时钟:36Mhz
STM32F407ZGT6 包含有 3 ADC STM32F4 ADC 最大的转换速率为 2.4Mhz ,也就是 转换 时间为 0.41us (在 ADCCLK=36M, 采样周期为 3 ADC 时钟下得到),不要让 ADC 的时钟超过36M,否则将导致结果准确度下降。

 ADC参考电压

ADC 输入范围为: VREF- VIN VREF+ 。在设计原理图的时候一般把 VSSA (供电负电压) VREF- (参考负电压) 接地,把 VREF+ (参考正电压)和 VDDA (供电正电压) 3V3 ,得到 ADC 的输入电压范围为: 0~3.3V。

输入通道

我们确定好 ADC 输入电压之后,那么电压怎么输入到 ADC ?这里我们引入通道的概念, STM32 的 ADC 多达 19 个通道,其中外部的 16 个通道就是框图中的 ADCx_IN0 ADCx_IN1 ADCx_IN5 。 这 16 个通道对应着不同的IO 口,具体是哪一个 IO 口可以从手册查询到。
ADC123_IN0:ADC1、ADC2、ADC3的 通道 0 共用PA0引脚。
ADC 多达19 个通道: 16个外部通道+3个内部通道(温度传感器、VREFINT、VBAT),但是每次只能处理16个ADC通道,所以无法同时处理19个通道。

STM32F4ZGT6ADC引脚分布图

 规则通道和注入通道

外部的 16 个通道在转换的时候又分为规则通道和注入通道,其中规则通道最多有 16 路,注入通 道 最多有4 路。那这两个通道有什么区别?在什么时候使用?
规则通道
平时一般使用的就是这个通道,它们的优先级较低,通常用于常规的采样任务。
注入通道
注入,可以理解为插入,注入通道则用于在规则通道的基础上提供更高的优先级采样。注入通道的 数据采样可以在规则通道采样进行的同时进行,具有更高的优先级。通常用于对某些事件或条件的快 速响应,例如紧急事件采样或高优先级传感器的采样。
如果在规则通道转换过程中,有注入通道插队,那么就要先转换完注入通道,等注入通道转换完 成后,再回到规则通道的转换流程。这点跟中断程序很像,所以,注入通道只有在规则通道存在时才会出现
举例: 假设你正在使用STM32控制一个温度传感器。你需要定期地(每1秒)采集温度数据,并且有时候需要在突发事件发生时(比如温度快速升高)立即采集更多的数据。
对于规则通道 :你会设置 ADC 在每秒钟采样一次,通过规则通道来获取温度数据。这是一种周期性的采样方式,对于大多数情况下的温度监测来说是足够的。
对于注入通道 :你可以设置 ADC 来在检测到温度突然升高时,立即进行更高优先级的采样,以获取更频繁的温度数据,以便更快地做出响应。
总结: 注入通道拥有更高的优先级,可以近似理解成中断
触发源
触发方式:普通触发 和 外部触发 ,规则通道和注入通道都是这样
普通触发:
ADC 转换可以由ADC 控制寄存器2 ADC_CR2 的ADON 这个位来控制,写1 的时候开始转换,写0 的时候停止转换,这个 是最简单也是最好理解的开启ADC 转换的控制方式
外部触发:要使能外部触发模式
TIM定时器定时转换
外部中断触发转换包括选择 禁止触发检测、上升沿检测、下降沿 检测以及上升沿和下降沿均检测

ADC 时钟
ADC 输入时钟 ADC_CLK PCLK2 经过分频产生, 最大值是 36MHz ,分频 因子由 ADC 通用控制 寄存器ADC_CCR ADCPRE[1:0] 设置,可设置的分频系数有 2 4 6 8
对于我们的芯片来说, APB2=84Mhz ,而 ADC 最大时钟频率为 36Mhz ,如果分频系数为 2 ,则84Mhz/2=42Mhz>36Mhz , 所以一般情况下为4分频,即84/4=21Mhz。

采样时间 

 

ADC 需要若干个 ADC_CLK 周期完成对输入的电压进行采样,采样的周期数可通过 ADC 采样时 间 寄存器ADC_SMPR1 ADC_SMPR2 中的 SMP[2:0] 位设置, ADC_SMPR2 控制的是通道 0~9 , ADC_SMPR1 控制的是通道 10~17 。每个通道可以分别用不同的时间采样。其中采样周期最小是 3 个。 ADC 的总转换时间跟 ADC 的输入时钟和采样时间有关,公式为:
Tconv = 采样时间 + 12 个周期
其中: Tcovn 为总转换时间,采样时间是根据每个通道的 SMP 位的设置来决定的。例如,
ADCCLK=21Mhz 的时候,并设置 3 个周期的采样时间,则得到 Tcovn=3+12=15 个周期 =0.71us 。 (为什么要加12 个周期呢?这个额外的 延迟周期 是指 ADC 转换开始时, ADC 开始进行样本保持,直 到样本保持电路中的电压稳定下来,以确保所采集的数据是准确的,这个过程需要一定的时间
总结: Tconv = 采样时间 + 12 个周期        例如:3 + 12
3(3个时钟周期触发采样) + 12(需要12个时钟周期稳定电路,也就是转换过程需要时间)

数据寄存器  

规则数据寄存器ADC_DR
ADC 规则组数据寄存器ADC_DR 只有一个 ,是一个 32 位的寄存器,只有 16 位有效 并且只是 用 于独立模式存放转换完成数据。因为ADC 的最大精度是 12 位, ADC_DR 16 位有效,这样 允许 ADC 存放数据时候选择左对齐或者右对齐,具体是以哪一种方式存放,由 ADC_CR2 11 ALIGN 设置。假如设置ADC 精度为 12 位,如果设置数据为左对齐,那 AD 转换完成数据存 放在 ADC_DR 寄 存器的[4:15] 位内;如果为右对齐,则存放在 ADC_DR 寄存器的 [0:11] 位内。 规则通道可以有16 个这么多,可规则数据寄存器只有一个,如果使用多通道转换,那转换的数 据 就全部都挤在了DR 里面,前一个时间点转换的通道数据,就会被下一个时间点的另外一个通 道转换 的 数据覆盖掉 ,所以当通道转换完成后就应该把数据取走,或者开启 DMA 模式,把数据 传输到内存里 面,不然就会造成数据的覆盖。最常用的做法就是开启DMA 传输。
注入数据寄存器ADC_JDRx
ADC 注入组最多有4个通道 ,刚好注入数据寄存器也有 4 个,每个通道对应着自己的寄存器,不 会跟规则寄存器那样产生数据覆盖的问题。ADC_JDRx 32 位的,低 16 位有效,高 16 位保留, 数据同样分为左对齐和右对齐,具体是以哪一种方式存放,由ADC_CR2 11 ALIGN 设置。

中断  

数据转换结束后,可以产生中断,中断分为四种:
①规则通道转换结束中断 : 跟我们平时接触的中断一样,有相应的中断标志位和中断使能位
②注入转换通道转换结束中断: 有相应的中断标志位和中断使能位
③模拟看门狗中断 :当被ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断,前提是我们开启了模拟看门狗中断,其中低阈值和高阈值由ADC_LTR 和ADC_HTR 设置。例如我们设置高阈值是 2.5V,那么模拟电压超过2.5V 的时候,就会产生模拟看门狗中断,反之低阈值也一样。
④溢出中断: 如果发生DMA 传输数据丢失,会置位ADC 状态寄存器ADC_SR 的OVR 位,如果同时使能了溢出中断,那在转换结束后会产生一个溢出中断。(相当于错误处理
 
 DMA请求
规则和注入通道转换结束后,除了产生中断外,还可以产生 DMA 请求,把转换好的数据直接存储 在内存里面

ADC 初始化结构体

 ADC_InitTypeDef 结构体

typedef struct
5 {
       uint32_t ADC_Resolution;                     //ADC 分辨率选择 
7      FunctionalState ADC_ScanConvMode;            //ADC 扫描选择
8      FunctionalState ADC_ContinuousConvMode;      //ADC 连续转换模式选择
9      uint32_t ADC_ExternalTrigConvEdge;           //ADC 外部触发极性
10     uint32_t ADC_ExternalTrigConv;               //ADC 外部触发选择 
11     uint32_t ADC_DataAlign;                      //输出数据对齐方式 
12     uint8_t ADC_NbrOfConversion;                 //转换通道数目
13 }ADC_InitTypeDef;
ADC_Resolution 配置ADC 的分辨率,可选的分辨率有12 位、10 位、8 位和6 位。分辨率越高,AD 转换数据 精度越高,转换时间也越长;分辨率越低,AD 转换数据精度越低,转换时间也越短。
ScanConvMode:可选参数为ENABLE 和DISABLE,配置是否使用扫描。如果是单通道AD 转换 使用 DISABLE,如果是多通道AD 转换使用ENABLE。
ADC_ContinuousConvMode: 可选参数为ENABLE DISABLE,配置是启动自动连续转换还是单次转换。使用 ENABLE 配置为使能自动连续转换;使用DISABLE 配置为单次转换,转换一次后 停止需要手动控制才重新启动 转换。
ADC_ExternalTrigConvEdge: 外部触发极性选择,如果使用外部触发,可以选择触发的极性,可 选有禁止触发 检测、上升沿触发检测、下降沿触发检测以及上升沿和下降沿均可触发检测。
ADC_ExternalTrigConv: 外部触发选择,ADC 功能框图中列举了很多外部触发条件,可 根据项目需求配置触发 来源。实际上,我们一般使用软件自动触发。
ADC_DataAlign: 转换结果数据对齐模式, 可选右对齐 ADC_DataAlign_Right 或者左对齐
ADC_DataAlign_Left:一般我们选择右对齐模式。
ADC_NbrOfChannel: ADC 转换通道数目。
ADC_CommonInitTypeDef 结构体
typedef struct 
2 {
3     uint32_t ADC_Mode; 
4     uint32_t ADC_Prescaler; 
5     uint32_t ADC_DMAAccessMode; 
6     uint32_t ADC_TwoSamplingDelay; 
 
7 }ADC_CommonInitTypeDef;
ADC_Mode: ADC 工作模式选择,有独立模式、双重模式以及三重模式。
ADC_Prescaler: ADC 时钟分频系数选择,ADC 时钟是有PCLK2 分频而来,分频系数决定ADC 时钟频率,可 选的分频系数为246 8ADC 最大时钟配置为36MHz ADC_DMAAccessMode: DMA 模式设置,只有在双重或者三重模式才需要设置,可以设置三种 模式,具体可参 考参考手册说明。
ADC_TwoSamplingDelay: 2 次采样阶段之前的延迟,对双重和三重采样有效。

独立采样(Independent Sampling):独立采样是指ADC对每个转换周期的输入信号只进行一次采样。这种模式下,ADC在每个采样周期的开始时读取一次模拟输入信号,并将其转换为数字值。独立采样是最简单的采样方式,但它可能容易受到噪声和干扰的影响,因为只有单一的采样点。


双重采样(Dual Sampling):双重采样是指ADC在每个转换周期内对输入信号进行两次采样,然后对这两个采样值进行处理。第一次采样可能受到噪声的影响,而第二次采样则在稍后的时间进行,可以提供另一个测量点。通过比较或平均这两个采样值,可以减少噪声的影响,提高测量的准确性。双重采样通常用于需要提高信号稳定性和减少随机噪声的应用。


三重采样(Triple Sampling):三重采样是双重采样的扩展,其中ADC在每个转换周期内对输入信号进行三次采样。与双重采样类似,三次采样可以进一步减少噪声和干扰的影响,提高测量精度。三次采样得到的值可以进行平均或选择最接近其他两个值的中间值,以减少异常值的影响。三重采样适用于对精度要求更高的应用,但会增加转换时间。这些采样技术可以减少由于外部噪声、电源波动或信号本身的不稳定性导致的误差。然而,增加采样次数也会增加转换所需的时间,这可能会降低ADC的采样率。在设计系统时,需要根据应用的具体要求来平衡采样精度和速度。此外,一些ADC还支持更高级的采样技术,如数字滤波、过采样和噪声整形,这些技术可以在数字域内进一步改善信号的质量。 

  • 34
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32 ADC模数转换实验中,可能会遇到以下问题: 1. ADC采样值不正确 如果ADC采样值不正确,可能是因为ADC参数配置不正确或者采样时序不正确导致的。需要确认以下几点: - 确认ADC参数配置正确,包括采样时间、采样通道、采样分辨率等参数 - 确认ADC时钟已经使能 - 确认ADC采样时序正确,包括采样开始时间、采样保持时间和转换时间等参数 2. ADC采样速率不稳定或者出现噪声 如果ADC采样速率不稳定或者出现噪声,可能是因为ADC参考电压不稳定或者ADC输入信号不稳定导致的。需要确认以下几点: - 确认ADC参考电压稳定,可以使用稳压器等设备来提供稳定的参考电压 - 确认ADC输入信号稳定,可以使用滤波电路等方法来滤除噪声和干扰信号 解决方法: 在使用STM32 ADC模数转换时,可以采用以下步骤进行配置和编程: 1. 配置ADC参数 使用ADC_Init函数对ADC进行配置,设置相应的采样时间、采样通道、采样分辨率等参数。 2. 开启ADC采样 在程序中开启ADC采样,使得程序能够读取ADC转换结果。 3. 编写中断服务函数 根据需要编写中断服务函数,并在函数中进行相应的处理。需要注意的是,中断服务函数应该尽可能的简单,避免长时间占用CPU资源,否则可能会影响其他重要任务的执行。 4. 烧录程序 将程序烧录到STM32芯片中,通过读取ADC转换结果,观察ADC采样值的情况和中断服务函数的执行情况。 需要注意的是,在编写程序时需要遵循一些规范和最佳实践,如使用宏定义等方法来定义常量和变量,避免使用硬编码方式;使用滤波器等技术来提高ADC采样值的精度和稳定性等。同时,建议使用示波器等工具来观察ADC采样值的情况和中断服务函数的执行情况,以便进行调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值