STM32模数转换器 (ADC)介绍

stm32f4xx系列提供的12位adc是逐次逼近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部源、两个内部源和 v bat 通道的信号。这些通道的 a/d 转换可在单次、连续、扫描或不连续采样模式下进行。adc 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。
adc 具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或下限。
单个adc框图
adc 引脚
adc开关控制
可通过将adc_cr2寄存器中的 adon 位置1来为 adc 供电。首次将 adon 位置1时,会将adc从掉电模式中唤醒。
swstart 或 jswstart 位置 1 时,启动 ad 转换。
可通过将 adon 位清零来停止转换并使 adc 进入掉电模式。在此模式式下,adc 几乎不耗电(只有几 μa)。
adc时钟
adc 具有两个时钟方案:
● 用于模拟电路的时钟:adcclk,所有 adc 共用
此时钟来自于经可编程预分频器分频的 apb2 时钟,该预分频器允许 adc 在 f pclk2 /2、/4、/6 或 /8 下工作。有关 adcclk 的最大值,请参见数据手册。
● 用于数字接口的时钟(用于寄存器读/写访问)
此时钟等效于 apb2 时钟。可以通过 rcc apb2 外设时钟使能寄存器 (rcc_apb2enr)分别为每个 adc 使能/禁止数字接口时钟。
通道选择
有 16 条复用通道。可以将转换分为两组:规则转换和注入转换。每个组包含一个转换序列,该序列可按任意顺序在任意通道上完成。例如,可按以下顺序对序列进行转换:adc_in3、adc_in8、adc_in2、adc_in2、adc_in0、adc_in2、adc_in2、adc_in15。
● 一个规则转换组最多由 16 个转换构成。必须在 adc_sqrx 寄存器中选择转换序列的规则通道及其顺序。规则转换组中的转换总数必须写入 adc_sqr1 寄存器中的 l[3:0] 位。
● 一个注入转换组最多由 4 个转换构成。必须在 adc_jsqr 寄存器中选择转换序列的注入通道及其顺序。注入转换组中的转换总数必须写入 adc_jsqr 寄存器中的 l[1:0] 位。
如果在转换期间修改 adc_sqrx 或 adc_jsqr 寄存器,将复位当前转换并向 adc 发送一个新的启动脉冲,以转换新选择的组。
温度传感器、v refint 和 v bat 内部通道
● 对于 stm32f40x 和 stm32f41x 器件,温度传感器内部连接到通道 adc1_in16。
内部参考电压 vrefint 连接到 adc1_in17。
● 对于 stm23f42x 和 stm32f43x 器件,温度传感器内部连接到与 vbat 共用的通道
adc1_in18。一次只能选择一个转换(温度传感器或 vbat)。同时设置了温度传感器和 vbat 转换时,将只进行 vbat 转换。
内部参考电压 vrefint 连接到 adc1_in17。
vbat通道连接到通道adc1_in18。该通道也可转换为注入通道或规则通道。
单次转换模式
在单次转换模式下, adc 执行一次转换 。cont 位为 0 时,可通过以下方式启动此模式:
● 将 adc_cr2 寄存器中的 swstart 位置 1(仅适用于规则通道)
● 将 jswstart 位置 1(适用于注入通道)
● 外部触发(适用于规则通道或注入通道)
完成所选通道的转换之后:
● 如果转换了规则通道:
— 转换数据存储在 16 位 adc_dr 寄存器中
— eoc(转换结束)标志置 1
— eocie 位置 1 时将产生中断
● 如果转换了注入通道:
— 转换数据存储在 16 位 adc_jdr1 寄存器中
— jeoc(注入转换结束)标志置 1
— jeocie 位置 1 时将产生中断
然后,adc 停止。
连续转换模式
在连续转换模式下, adc 结束一个转换后立即启动一个新的转换 。cont 位为 1 时,可通过外部触发或将 adc_cr2 寄存器中的 swstrt 位置 1 来启动此模式(仅适用于规则通道)。
每次转换之后:
● 如果转换了规则通道组:
— 上次转换的数据存储在 16 位 adc_dr 寄存器中
— eoc(转换结束)标志置 1
— eocie 位置 1 时将产生中断
时序图
adc 在开始精确转换之前需要一段稳定时间 t stab 。adc 开始转换并经过 15 个时钟周期后,eoc 标志置 1,转换结果存放在 16 位 adc 数据寄存器中。
扫描模式
此模式用于扫描一组模拟通道。
通过将 adc_cr1 寄存器中的 scan 位置 1 来选择扫描模式。将此位置 1 后,adc 会扫描在 adc_sqrx 寄存器(对于规则通道)或 adc_jsqr 寄存器(对于注入通道)中选择的所有通道。为组中的每个通道都执行一次转换。每次转换结束后,会自动转换该组中的下一个通道。如果将 cont 位置 1,规则通道转换不会在组中最后一个所选通道处停止,而是再次从第一个所选通道继续转换。
如果将 dma 位置 1,则在每次规则通道转换之后,均使用直接存储器访问 (dma) 控制器将转换自规则通道组的数据(存储在 adc_dr 寄存器中)传输到 sram。在以下情况下,adc_sr 寄存器中的 eoc 位置 1:
● 如果 eocs 位清零,在每个规则组序列转换结束时
● 如果 eocs 位置 1,在每个规则通道转换结束时
从注入通道转换的数据始终存储在 adc_jdrx 寄存器中。
数据对齐
由于stm32的adc是12位的,结果存储在16位的数据寄存器中,有4位用不到,所以adc存在左对齐或右对齐的方式。为方便读数,一般都选择右对齐。
可独立设置各通道采样时间
adc 会在数个 adcclk 周期内对输入电压进行采样,可使用 adc_smpr1 和 adc_smpr2寄存器中的 smp[2:0] 位修改周期数。每个通道均可以使用不同的采样时间进行采样。
总转换时间的计算公式如下:
t conv = 采样时间 + 12 个周期
快速转换模式
可通过降低 adc 分辨率来执行快速转换。res 位用于选择数据寄存器中可用的位数。每种分辨率的最小转换时间如下:
● 12 位:3 + 12 = 15 adcclk 周期
● 10 位:3 + 10 = 13 adcclk 周期
● 8 位:3 + 8 = 11 adcclk 周期
● 6 位:3 + 6 = 9 adcclk 周期
温度传感器和vrenfint通道框图
要使用传感器,请执行以下操作:
选择 adc1_in16 或 adc1_in18 输入通道。选择一个采样时间,该采样时间要大于数据手册中所指定的最低采样时间。在 adc_ccr 寄存器中将 tsvrefe 位置 1,以便将温度传感器从掉电模式中唤醒。通过将 swstart 位置 1(或通过外部触发)开始 adc 转换读取 adc 数据寄存器中生成的 v sense 数据使用以下公式计算温度:温度(单位为 °c)= {(v sense — v 25 ) / avg_slope} + 25
其中:
— v 25 = 25 °c 时的 v sense 值
— avg_slope = 温度与 v sense 曲线的平均斜率(以 mv/°c 或 μv/°c 表示)
由于adc寄存器的相关配置相对比较简单,这里直接附上测量温度相关的adc初始化和中断程序:
void adc_init(){ u32 prigroup = 0; u32 priority = 0; rcc- >apb2enr |= 1< ccr = 0; adc- >ccr |= 1< ccr |= 1< cr1 = 0;//分辨率12位 adc1- >cr2 = 0; //数据右对齐 adc1- >cr2 |= 1< smpr1 =0; //通道16采样时间3t adc1- >sqr3 |= 16< cr1 |= 1< sr &=~ (1< cr2 |= 1< cr2 |= 1< sr & (1< sr &=~ (1< dr; //按行依次存入各通道的转换结果 adc1_ok = 1; //采集完成结束标记置1 }}接着编写主函数测试
#include stm32f4xx.h#include usart.h#include delay.h#include stdio.h#include adc.hextern u8 adc1_ok;extern u16 adc1_value;int main(){ float wendu = 0; nvic_setprioritygrouping(7-2); usart1_init(115200); adc_init(); while(1) { if(adc1_ok == 1) { adc1- >sr &=~ (1< cr2 |= 1< cr2 |= 1< <30; //触发一次转换 } delay_ms(1000); }}从串口可以看到adc读取的温度值,adc温度测量成功。
对于电池电压或者其他外部模拟量的测量,配置方法与温度测量类似,这里不再赘述。如果想要让cpu更多地用于算法或者其他功能的处理,同样可以配置dma进行数据传输。

你了解linux device tree源代码?
助焊剂的喷头堵了怎么办,可有什么处理方法
iPhone11系列首批用户如何评价该手机
魅族旗舰 PRO 6采用了 Synaptics 压感触控技术
在自动驾驶中,如何进行汽车毫米波雷达测试?(一)
STM32模数转换器 (ADC)介绍
声纹识别应用于智能锁 安全性能否得到保证还未可知
DC-DC的COT反馈控制模式
OPPO正式发布第二颗自研芯片——马里亚纳MariSilicon Y
一加5什么时候上市?一加5最新消息:一加5流畅度完虐三星S8
Mycobot机械臂各关节的运动(三)
一氧化碳气体检测仪性能如何?详细介绍
苹果13pro发布时间
目前锂电池支持的充电倍率只有多少C?
TA7325P引脚功能及电压资料参数
并联机器人的应用
vivox9、vivoxplay6日常小问题的解决方法
东睦股份2022业绩预告出炉 净利润同比增长462%-539%
百大案例 | 华为高品质万兆医疗园区解决方案,助力浙江省中医院加速信息化、数字化
中国移动将力争在2020年底实现30万个5G基站建设