本文主要是介绍STM32学习笔记---ADC模数转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、STM32-ADC模数转换概述
1、ADC简介
- ADC的概念
Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。 - ADC的作用
采集传感器的数据,测量输入电压,检查电池电量剩余,监测温湿度等。
典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。
2、ADC的性能指标
- 量程:能测量的电压范围
- 分辨率:ADC的分辨率通常以输出二进制数的位数表示,位数越多,分辨率越高,一般来说分辨率越高,转化时间越长。
- 转化时间:模拟输入电压在允许的最大变化范围内,从转换开始到获得稳定的数字量输出所需要的时间称为转换时间
3、STM32F4-ADC配置
- STM32F40X有3个ADC,每个可配置 12 位、10 位、8 位或 6 位分辨率
- 每个ADC 有16个外部通道。另外还有两个内部 ADC 源 和 V BAT 通道挂在 ADC1上
- 这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。
- ADC具有独立模式、双重模式和三重模式,对于不同 AD转换要求几乎都有合适的模式可选
- ADC 的结果可以左对齐或右对齐方式存储在 16位数据寄存器中。
4、ADC的功能框图
1、输入电压范围
2、输入通道
3、转换顺序
4、转换时间
5、数据寄存器
6、中断
7、触发源
4.1、电压输入范围
- ADC 输入范围为:V REF- ≤ V IN ≤ V REF+ 。由 V REF- 、V REF+ 、V DDA 、V SSA 、这四个外部引脚决定。
- 我们在设计原理图的时候一般把 V SSA 和 V REF- 接地,把 V REF+ 和 V DDA 接 3.3V,得到ADC的输入电压范围为:0~3.3V
- 如果我们想让输入的电压范围变宽,去到可以测试负电压或者更高的正电压,我们可以在外部加一个电压调理电路,把需要转换的电压抬升或者降压到0~3.3V,这样 ADC 就可以测量了
4.2、输入通道
每个ADC 有16个外部通道。另外还有两个内部 ADC 源 和 V BAT 通道挂在 ADC1上
4.3、转换顺序
- 规则通道组:
顾名思意,规则通道就是很规矩的意思,我们平时一般使用的就是这个通道。相当正常运行的程序。最多16个通道。
规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的L[3:0]中 - 注入通道组:
注入,可以理解为插入,插队的意思,是一种不安分的通道。相当于中断。最多4个通道。
注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组里转化的总数应写入ADC_JSQR寄存器的L[1:0]中
4.4、转换时间
- ADC 时钟
ADC 输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大值是 36MHz,典型值为30MHz。对于 STM32F407我们一般设置PCLK2=HCLK/2=84MHz。所以程序一般使用 4分频或者 6分频。
- ADC 的总转换时间
Tconv = 采样时间 + 12个周期
最小采样时间: T = 3 + 12 = 15个周期 =0.42us(ADC时钟=36MHz下得到)
4.5、数据寄存器
- 规则数据寄存器 ADC_DR
ADC_DR只有一个,是一个 32 位的寄存器,只有低 16 位有效并且只是用于独立模式存放转换完成数据。因为 ADC 的最大精度是 12 位,ADC_DR 是16 位有效,这样允许 ADC存放数据时候选择左对齐或者右对齐,具体是以哪一种方式存放,由 ADC_CR2的 11 位 ALIGN 设置。 - 使用 DMA
由于规则通道组只有一个数据寄存器,因此,对于多个规则通道的转换,使用 DMA 非常有帮助。这样可以避免丢失在下一次写入之前还未被读出的 ADC_DR 寄存器中的数据。
在使能 DMA 模式的情况下(ADC_CR2 寄存器中的 DMA 位置 1),每完成规则通道组中的一个通道转换后,都会生成一个 DMA 请求。
4.6、中断
- 转换结束中断
规则通道和注入通道的数据转换结束后,都可以产生中断 - 模拟看门狗中断
当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断 - 溢出中断
如果发生 DMA传输数据丢失,会置位 ADC 状态寄存器 ADC_SR的 OVR位,如果同时使能了溢出中断,那在转换结束后会产生一个溢出中断。 - DMA 请求
规则和注入通道转换结束后,除了产生中断外,还可以产生 DMA请求,把转换好的数据直接存储在内存里面。
4.7、触发源
- 软件触发
ADC转换可以由ADC 控制寄存器 2: ADC_CR2的 ADON这个位来控制,写 1的时候开始转换,写 0 的时候停止转换 - 外部事件触发
触发包括内部定时器触发和外部 IO触发。触发源有很多,具体选择哪一种触发源,由 ADC控制寄存器ADC_CR2的 EXTSEL[2:0]和 JEXTSEL[2:0]位来控制
5、ADC的工作模式
二、单通道采集实例
利用ADC采集FSM4中电位器的数据
1、CubeMx配置
1、将引脚配置为ADC
2、使能串口
3、使能时钟
4、ADC配置
5、中断使能
2、代码实现
1、初始化
2、数据采样
轮询方式实现
通过中断采集
采集完成触发中断
三、多通道采集实例
利用ADC采集电位器及STM32内部温度传感器的数据
1、CubeMx配置
1、配置电位器和温度通道
2、配置串口
3、使能时钟
4、ADC配置,使用轮询方式:扫描模式,因为有两个通道
2、代码实现
1、使能ADC,然后轮询检测
ADC轮流获取电位和温度,每启动一次会自动轮询两个通道。
这篇关于STM32学习笔记---ADC模数转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!