STM32固件库(标准外设库)入门学习 第七章 ADC数模转换(一)

STM32固件库(标准外设库)入门学习 第七章 ADC数模转换(一)



前言

本学习教程,参考B站江科大自化协STM32视频,型号为STM32F103C8T6。

ADC(Analog-Digital Converter)模拟-数字转换。ADC可以将引脚上连续变化的模拟电压转换为内存(寄存器)中存储的数字变量,建立模拟电路到数字电路的桥梁。

(1)STM32是12位逐次逼近型ADC,分辨率一般用多少位来表示,12位AD值,表示的范围就是0—2^12-1即0~4095,位数越高,量化结果越精细,对应分辨率就越高。STM32的ADC是1us转换时间,就是转换频率,即AD从开始到出结果的时间,对应的AD转换频率就是1MHz。

(2)输入电压范围:0—3.3V,转换结果范围:0—4095,这是一一对应的线性关系。

(3)系列最多有18个输入通道,可测量16个外部(GPIO口)和2个内部信号源(内部温度传感器、内部参考电压1.2V的基础电压),基准电压不随外部供电电压变化而变化,如果芯片的供电不是标准的3.3V,测量外部引脚的电压可能就不对,此时可以读取基准电压进行校准,得到正确的电压值。

(4)规则组和注入组两个转换单元,STM32ADC的增强功能,普通的AD转换流程是,启动一次转换、读一次值,然后再启动、再读值,这样的流程。而STM32的ADC可以列一个组,一次性启动一个组,连续转换多个值,这里有两个组,一个是用于常规使用的规则组,一个是用于突发事件的注入组。

(5)模拟看门狗自动监测输入电压范围,此ADC可以用于测量光线强度、温度这些值,并且经常有个需求,如果光线高于某个阈值、低于某个阈值,或者温度高于某个阈值、低于某个阈值时,执行一些操作,这个判断就可以用模拟看门狗自动执行。模拟看门狗可以监测指定的某些通道,当AD值高于它设定的上阈值或者低于下阈值时,就会申请中断,就可以在中断函数里执行相应的操作,这样就可以不用不断地手动读值,再用if进行判断了。

(6)STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道


一、逐次逼近型ADC内部结构

此图为ADC0809的内部结构图,是独立的8位逐次逼近型ADC芯片。
在这里插入图片描述

1 通道选择电路:

(1)通道选择开关,选择一路输入到这个点进行转换;

(2)地址锁存和译码,想选择哪路通道,就把通道号放在ADDA\ADDB\ADDC这三个脚上,给一个ALE锁存信号,上面通道选择开关的对应通路开关就可以自动拨好,这就是相当于一个可以通过模拟信号的数据选择器。因为ADC数据转换是一个很快的过程,从开始信号,过几个us就转换完成了,所以想转换多路信号,那不必设计多个AD转换器,仅需一个AD转换器,然后增加一个多路选择开关,想转换哪一路,拨一下开关,选中对应通道,然后再开始转换就行了。这个ADC0809有8路输入通道,而STM32有18路输入通道,所以就有18路选择。

2 逐次逼近寄存器SAR部分电路

逐次逼近寄存器SAR通过比较来知道电压对应的编码数据。

(1)电压比较器,判断两个输入信号电压的大小关系,输出一个高低电平指示谁大谁小,两个输入端,一个是待测的电压,另一个是DAC的电压输出端。

(2)DAC是数模转换器,给其一个数据,就可以输出数据对应的电压,DAC内部是使用加权电阻网络来实现的转换。如果DAC输出的电压比较大,就调小DAC数据,反之亦然。一直到DAC输出的电压和外部通道输入的电压近似相等,这样DAC输入的数据就是外部电压的编码数据。

(3)逐次逼近寄存器SAR,完成上述电压的调节过程。为了最快找到未知电压的编码,通常我们会使用二分法进行寻找。

(4)EOC是End of Convert,转换结束信号。

(5)START是开始转换,给一个输入脉冲,开始转换。

(6)CLOCK是ADC内部时钟,因为ADC内部是一步一步进行判断的,所以需要时钟来推动此过程。

(7)VREF(+)和VREF(-)是DAC的参考电压,比如给一个数据255,是对应5V还是3.3V就由参考电压决定,这个DAC的参考电压也决定了ADC的输入范围,所以也是ADC参考电压。

(8)Vcc和GND为整个芯片电路的供电。通常VREF(+)与Vcc会接在一起,VREF(-)与GND接在一起。

二、STM32ADC

1 STM32ADC框图

在这里插入图片描述
(1)左边是ADC的输入通道,包括16个GPIO口,IN0~IN15,2个内部信号源(内部温度传感器、VREFINT内部参考电压1.2V的基础电压)。

(2)模拟多路开关,可指定想要选择的通道。

(3)黑框里是多路开关的输出,进入到模数转换器,这里模数转换器就是执行的我们刚才讲过的逐次比较的过程,转换结果会直接放在这个数据寄存器里,读取寄存器就可以知道ADC转换的结果了。对于普通ADC,多路开关只选中一个,即选中某个通道、开始转换、等待转换完成、取出结果。而STM32的ADC可以同时选中多个,而且转换的时候还分成两组,规则通道组(最多4个通道)和注入通道组(最多16通道)。
例子,去餐厅点菜,普通ADC是,指定一个菜,老板做给你,然后做好了送给你,而STM32的ADC是你指定一个菜单,菜单可以填16个菜,你直接递菜单给老板,老板就按照菜单的顺序依此做好,一次性给你端上来,大大提高效率,当然菜单只写一个菜,就是普通的ADC。这个菜单也分两种,一个是规则组,同时上16个菜,但规则组只有一个数据寄存器,就是桌子比较小,只能放1个菜,如果上16个菜,前15个菜都会被挤掉,只能得到最后一个菜,所以对于规则组转换来说,如果使用这个菜单的话,最好配合DMA来实现,DMA是一个数据转运小帮手,可以再每上一个菜之后,把菜挪到其他地方去,防止被覆盖。另一个是注入组,相当于VIP座位,在这一次可点四个菜,并且数据寄存器有四个,是可以同时上4个菜的。

(4)触发转换部分,也就是普通ADC的START信号。对于STM32,触发ADC开始转换的信号有两种,一种是软件触发,就是在程序中手动调用一条代码,就可以启动转换了;另一种是硬件触发,就是左下角这些。上面是注入组触发源,下面是规则组触发源。这些触发源主要来自于定时器各个通道,还有TRGO定时器主模式的输出,定时器可以通向ADC\DAC这些外设,用于触发转换。
ADC经常需要过一个固定时间转换一次,比如1ms转换一次,正常思路是用定时器,每隔1ms申请一次中断,在中断里手动开启一次转换。但是频繁进中断对我们的程序是有一定的影响的,比如有很多中断都需要频繁进入,会影响主程序的执行,不同中断之间,由于优先级的不同,也会导致某些中断不能及时得到响应,如果触发ADC的中断不能得到响应,ADC转换频率就肯定会产生影响。所以对于需要频繁进中断,并且在中断里只完成了简单工作的情况,一般都会有硬件支持。
比如给TIM3定一个1ms的时间,并且把TIM3的更新事件选择为TRGO输出,然后在ADC里,选择开始触发信号为TIM3的TRGO,这样TIM3的更新事件就可以通过硬件自动触发ADC转换了,整个过程不需要进中断,节省中断资源。
还可以选择EXTI_11、EXTI_1外部中断引脚来触发转换。

(5)VREF+和VREF-是DAC的参考电压,这个DAC的参考电压也决定了ADC的输入范围,所以也是ADC参考电压。VDDA和VSSA为整个芯片电路的供电。通常VREF+与VDDA会接在一起,VREF-与VSSA接在一起。

(6)ADCCLK是ADC的时钟,也就是普通ADC的CLOCK,用于驱动内部逐次比较的时钟,来自ADC预分频器,来源于RCC。而ADCCLK最大频率为14MHz,所只能选择6分频为12MHz,或者8分频到9MHz。

(7)DMA请求,用于触发DMA进行数据转运。

(8)两个不同通道的数据寄存器,用于存放转化结果。

(9)模拟看门狗,可以存一个阈值高限和阈值低限,如果启动模拟看门狗,并指定了看门的通道,看门狗一旦发现超过阈值范围就会“乱叫”,申请一个模拟看门狗的中断,通过标志位AWD、中断使能位AWDIE,通向NVIC。

(10)对于规则组和注入组,ADC转换完成后,也会在标志位有EOC转化完成的信号,EOC为规则组的转化信号,JEOC是注入组的完成信号,它们在状态寄存器里置一个标志位,读取这个标志位,就可以知道是不是转换结束。这两个标志位也可以去NVIC申请中断,若开启NVIC对应的通道,就会触发中断。

2 STM32ADC基本结构图

在这里插入图片描述
左边为输入通道,16个GPIO口,外加2个内部通道;

进入AD转换器,AD转换器有2个组,一个是规则组,一个是注入组,规则组最多可选择16个通道,注入组最多可选择4个通道;

转化的结果存放在AD数据寄存器,规则组只有1个,注入组有4个;

触发控制提供START信号,触发控制可以选择软件触发和硬件触发(主要来自于定时器,也可以选择外部中断的引脚)。

右边是来自于RCC时钟的CLOCK,ADC逐次比较的过程就是由这个时钟推动的;

上面布置一个模拟看门狗用于监测转换结果的范围,超出阈值,就通过中断输出控制,向NVIC申请中断。

规则组和注入组转换完成后会有EOC信号,置一个标志位,通向NVIC。

开关控制,在库函数中就是ADC_Cmd函数,用于给ADC上电

3 输入通道

从引脚定义表可查,STM32F1系列ADC12_IN0到ADC12_IN9所对应的引脚,所以此芯片只有10个外部通道,ADC12的意思是ADC1和ADC2的IN0都是在PA0上。这就涉及到双ADC模式,即ADC1和ADC2一起工作,组成同步模式、交叉模式等等,交叉模式ADC1和ADC2交叉对一个通道进行采样,进一步提高采样率。
在这里插入图片描述
注:此处借用VET6版本的表格,C8T6类似。

4 ADC转换模式

4.1 单次转换,非扫描模式

ADC初始化结构体中,会有两个参数,一个选择单次转换还是连续转换,另一个选择扫描模式还是非扫描模式。

在非扫描模式下,这个菜单就只有第一个序列1的位置有效,菜单同时选中一组的方式就退化为简单地选中一个地方式,在序列1位置指定想转换地通道,比如通道2写到这个位置,我们就可以触发转换,ADC就会对这个通道2进行模数转换,过一小段时间后,转换完成,转换结果放在数据寄存器里,同时给EOC标志位置1,转换完成。在数据寄存器中读取结果。

想再启动一次转换,那就需要再触发一次,转换结束,置EOC标志位,读结果。如果想换一个通道转换,那在转换前把第一个位置地通道2改成其他通道,在启动转换。
在这里插入图片描述

4.2 连续转换,非扫描模式

还是非扫描模式,菜单列表就只用序列1,但是在一次转换结束后不会停止,而是立刻开始下一轮的转换,然后一直持续下去,只要最开始触发一次,就可以一直转换了。这个优势是在于开始转换后不需要等待,一直在转换,所以不需要手动开始转换,也不用判断是否结束,想要读AD值的时候,直接从数据寄存器取即可。
在这里插入图片描述

4.3 单次转换,扫描模式

单次转换,每触发一次,就会停下来,下次转换,就需要再次触发。菜单里由若干通道,可重复,在初始化结构体里还会有个参数,就是通道数目,因为16位可以不用完,只用前几个,这就需要通道数目参数,确定几个通道。7个转化结果都放在数据寄存器里,为了防止数据被覆盖,就需要用DMA及时将数据挪走,所有通道转换完成后,禅师EOC信号,转换结束,再触发下一次,开始新一轮的转换。
在这里插入图片描述

4.4 连续转换,扫描模式

再上一个基础上,一次转换完成后,立刻开启下一次的转换。
在这里插入图片描述

5 触发控制

此表位规则组触发源
在这里插入图片描述

6 数据对齐

ADC是12位的,转换结果就是一个12位的数据。但是数据寄存器是16位的,所以存在一个数据对齐的问题。一般用数据右对齐的方式。左对齐一般觉得0~4095数分辨率过大时,就左对齐,将数据的高8位取出,舍弃后面4位精度,12位ADC退化为8位ADC。
在这里插入图片描述

7 转换时间

AD转换的步骤:采样,保持,量化,编码。量化、编码时ADC逐次比较的过程,位数越多,花的时间就越长。采样、保持,是AD抓换需要时间的,在这时间里,输入的电压还在不断变化,就无法定位输入电压在哪。所以在量化编码之前,需要设置一个采样开关,先打开开关,利用小容量电容存储电压,然后断开开关,再进行后面的AD转换,在量化编码期间,电压始终保持不变,这样才能精确地定位未知电压的位置,这就是采样保持电路。而开关打开、断开的间隔就产生一个采样时间:

STM32 ADC的总转换时间为:
TCONV = 采样时间 + 12.5个ADC周期

采样时间是采样保持花费的时间,这个可以在程序中进行配置,采样时间越大,越能避免一些毛刺信号的干扰,不过转换时间也会相应的延长。12.5个ADC周期是量化编码花费的时间,因为是12位的ADC所以需要花费12个周期,而多了的0.5个周期,可能是做其他一些东西花的时间。ADC周期就是从RCC分频过来的ADCCLK,ADCCLK最大14MHz。

例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期
TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs

8 校准

ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。

建议在每次上电后执行一次校准;

启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期;

校准是固定的,只需要在ADC初始化后加几行代码即可


总结

ADC的基础知识

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZRob

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值