目录
前言
一、ADC模数转换器
1.简介
2.ADC的结构
3.输入通道
4.转换模式
5.触发控制
6.数据对齐
7.转换时间
8.校准
前言
本期就开始学习ADC模数转换器,这个大家在学习51单片机的时候应该就接触过了,实际上就是把模拟电压转换为内存上的数字变量实现模拟数据到数字数据的转换,这个还是很长用到的,所以本期就从ADC模数转换器的理论部分开始,下一期再进行相关的项目实操。(视频:[7-1] ADC模数转换器_哔哩哔哩_bilibili)
一、ADC模数转换器
1.简介
- ADC(Analog-Digital Converter)模拟-数字转换器
- ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
- 12位逐次逼近型ADC,1us转换时间
- 输入电压范围:0~3.3V,转换结果范围:0~4095
- 8个输入通道,可测量16个外部和2个内部信号源
- 规则组和注入组两个转换单元
- 模拟看门狗自动监测输入电压范围
- STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道
stm32中是自带有模数转换器的外设的,在早期单片机还刚刚起步的时候,很多单片机是没有带ADC模数转换器的功能,基本上都是需要去外接一个ADC的芯片,现在我们学习的stm32是自带有ADC功能而且还是12位的有16个通道。对于ADC的转换方式是这样子的,首先把当前输入的电压数字信号进行模拟信号的划分,也就是电压数字信号比如为0~3.3V,那么根据当前的转换位12位对应的十进制也就是0~4095 ,所以0~3.3V的电压划分为0~4095份。
下图展示的是逐次逼近型ADC,这个是8个输入通道的,在51单片机的时候我们就了解过下面这个ADC,通道选择开关是根据三位地址锁存执行的二进制数从IN0~IN7中选择一个开关,然后进入到比较器,与DAC进行比较,DAC是跟ADC反过来的,把数字信号(输入的电压)转换为模拟信号,DAC的输入电压部分为 VERF+和VREF- 在单片机内部基本上这二者对应的是接VCC和GND的,在这二者会在SAR进行二分法比较,也就是对应的找到此时电压对应的模拟信号量进行确定转换。
2.ADC的结构
从下面输入时钟图可以看出,虽然ADC最大输入时钟位14MHz,但是随机数预分配器只有2,4,6,8这几个选择,而内部时钟是72MHz,所以实际上分频的最大值只有12MHz。
下图是stm32中ADC的基本结构图,也是最主要的部分,我们可以看到数字信号的输入口GPIO有16个,然后还有两个可选的额外温度和内部电压输入通道,之后就进入到了AD转换器那里,这里可以去选择两者方式分别是规则组和注入组,这两者转换方式都有多种输入通道,规则组是有16个通道可以选择,但是进行转换的存放结果只能是其中的一个,因为其转换后的数据寄存器只有一个16位的也就只能存放一个,但是如果有多个要进行转换的话前面的会被覆盖掉,这里如果不想前面的数据被覆盖就需要用到一个DMA搬运到其他地方保存起来,关于DMA后继我们会学到;注入组是一次性可以选择4个输入通道,然后4个通道都可以进行转换,转换后的结果都能放入到注入组的AD数据寄存器刚刚好也是4个16位寄存器,这里就不会涉及到覆盖的问题了,相较于规则组更加高级一些。下面我们主要以规则组作为示例进行讲解。
3.输入通道
下面展示的是ADC是输入通道,其中ADC1和ADC2的前16个通道是一样的,但是ADC1是有另外两个温度传感器和内部电压输入的通道,而其他的就没有了,我们用到的stm32是没有ADC3的这里就不需要搭理太多。
通道 | ADC1 | ADC2 | ADC3 |
通道0 | PA0 | PA0 | PA0 |
通道1 | PA1 | PA1 | PA1 |
通道2 | PA2 | PA2 | PA2 |
通道3 | PA3 | PA3 | PA3 |
通道4 | PA4 | PA4 | PF6 |
通道5 | PA5 | PA5 | PF7 |
通道6 | PA6 | PA6 | PF8 |
通道7 | PA7 | PA7 | PF9 |
通道8 | PB0 | PB0 | PF10 |
通道9 | PB1 | PB1 | |
通道10 | PC0 | PC0 | PC0 |
通道11 | PC1 | PC1 | PC1 |
通道12 | PC2 | PC2 | PC2 |
通道13 | PC3 | PC3 | PC3 |
通道14 | PC4 | PC4 | |
通道15 | PC5 | PC5 | |
通道16 | 温度传感器 | ||
通道17 | 内部参考电压 |
4.转换模式
ADC的转换模式是根据转换次数和扫描模式来确定的,所以有4种转换模式。
(1)单次转换,非扫描模式
这种模式是最简单的,也就是把药转换的通道放到序列1里面,触发ADC后就开始转换,转换后的结果放到数据寄存器,同时EOC置为1表示转换结束,当读取到EOC为1时就可以去数据寄存器拿转换后的结果了。当想再次进行转换的时候就只能重新触发一次,重新开始转换,如果想换通道的话,这里序列1在转换之前就要去设置好通道然后再去触发转换操作。
(2)连续转换,非扫描模式
这个对比与上面那个不同的是为连续转换,相同的是都是非扫描模式,因此非扫描模式对应的序列都是只有一个的。不同的是为连续转换,当开始触发的时候这个转换就会自动进行下去,不需要我们去重新触发转换,这就是其最大的好处,当我们想要数据的时候直接去数据存储器读取就行了。
(3)单次转换,扫描模式
这个模式是单次转换,也就跟第一个一样的,不同的是扫描模式,这就可以实现存放多个通道(最多不超过16个),这些通道是可以重复的,而且这里还需要去说明通道数目,这样转换的时候就会去看前面指定数目的通道,转换后的结果都会放到数据存储器,但是数据存储器是有限的,这里就需要用DMA及时取走数据,免得被下一个给覆盖了。
(4)连续转换,扫描模式
这个模式也就是在第三个模式变了一点,也就是跟第二个一样,在触发之后会自动触发执行下一个转换,不需要去手动执行触发操作。
5.触发控制
6.数据对齐
因为我们这里ADC转换是12位的,那出来的数据也是同样12位的,但是数据寄存器是16位的,也就是说会多出来两位,那下面有两者处理方式。
- 数据右对齐
高四位补零
- 数据左对齐
低四位补零
这里我们一般都是用数据右对齐的方式,其数据是0~4095 ,而左对齐的方式读出来的数据会比较大,毕竟是在右对齐的基础上左移4位也就是在原来的数据乘上了16,分辨率没有右对齐的那么高
7.转换时间
- AD转换的步骤:采样,保持,量化,编码
- STM32 ADC的总转换时间为
TcoNv=采样时间 +12.5个ADC周期
- 例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期
TcoNv=1.5+12.5=14个ADC周期=1us
8.校准
- ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差
- 建议在每次上电后执行一次校准
- 启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期
以上就是本期的全部内容了,我们下次见!
今日壁纸: