32F1系列的ADC介绍

简介

简单的对ADC的学习做到一个学习汇总。

ADC的工作简单讲就是:外部引脚(通常用的是各式传感器)上的模拟电压,这个模拟电压可以是外部的各种物理变量来改变的,通过ADC来转换为数字变量。所以ADC为:模拟/数字转换器,全称:Analog-to-Digital Converter,毕竟它架起了模拟电路到数字变量的桥梁。

1.ADC的常见类型:

1.1并联比较型:

原理:输入的模拟电压Vx与分压出的电压VREF/x相等,就输出到编码器,编码器经过编码,得到数据量,从而知晓电压。

原理图:

分辨率是3位,那么需要的比较器是2^3-1,需要的电阻的数量是2^3。 而stm32F1系列ADC是12位分辨率的, 那么就需要2^12-1个比较器, 需要2^12个电阻。

优点:转换快。缺点:成本高、功耗高

1.2逐次逼近型:

逐次逼近型示意图:

比较过程:

主要是电压比较器,可以判断两个输入信号电压的大小关系,输出一个高低电平指示谁大谁小,有两个输入端,一个是待测的电压Vx,另一个是DAC电压输出端。这样一个是未知编码的电压和一个DAC输出的已知编码的电压,他两同时输入到电压比较器,进行大小判断,如果DAC输出电压比较大,就调小DAC数据,如果DAC输出的电压比较小,就增大DAC数据,直到DAC输出的电压和外部通道输入的电压近似相等,这样DAC输入的数据就是外部电压的编码数据了。

例子:

首先将数码寄存器编码为100,通过D/A转换成电压与输入电压相比,如果大于,那就增大D2D1D0为:101,直到逼近为止,如果小于,那就减小,直到逼近为止。里面的数据取舍采用四舍五入。类似天平。

优点:结构简单、低功耗。缺点:转换速度较慢

特点:分辨率和采样速度相互矛盾,分辨率越高,采样速率越低

当然还有其他类型的ADC,CADN上搜搜就能找到了。

ADC的特性参数:

分辨率:表示ADC能辨别的最小模拟量,用二进制位数表示,比如:8、10、12、16位等。对于F1系列的:12的分辨率最小模拟量计算1/4096 = 3.3v/x。x =0.0008056640625。1模拟量对应的电压0.000805。

转换时间:表示完成一次A/D转换所需要的时间,转换时间越短,采样率就可以越高。

精度:最小刻度基础上叠加各种误差的参数,精度受ADC性能、温度和气压等影响

量化误差:用数字量近似表示模拟量,采用四舍五入原则,此过程产生的误差为量化误差。0.0008,取0.001。

2.32F1系列ADC框图介绍:

F1系列这个框图里面的ADC资源有  ADC1、ADC2、ADC3。

ADC1的模拟输入通道的16和通道17在芯片内部分别连到了温度传感器和VREFINT。

ADC2的模拟输入通道的16和通道17在芯片内部分别连到了VSS。

ADC3的模拟输入通道的14、15、16和通道17在与VSS相连。

1.VREF+和VREF-是参考电压,决定了ADC输入电压的范围,内部和VDDA和VSSA接在一起的。VDDA和VSSA是内部模拟部分的电源(比如ADC、RC振荡器、锁相环等)。

2.这部分是ADC的输入通道,包括16个GPIO口,IN0~IN15。和一个内部温度传感器、一个内部参考电压VREFINT,通过模拟多路开关(可以指定选择的通道,选择规则通道还是注入通道),进入到模数转换器(逐次比较)转换结果会直接放在上面的数据寄存器里,读取寄存器就能知道ADC转换的结果。

这里可以选择多个通道进行转换,普通只能选择一个通道,在转换过程中,还分成了两个组,规则通道组和注入通道组。规则组可以选16个通道(就是它外面可以挂15个传感器,和一共内部温度传感器),注入组可以选中4个通道。 由于规则通道寄存器只能有一个,只能存一个结果。所有同时上传16个转换数据是接收不到得,(这里可以配合使用DMA来实现,DMA把得到的数据挪到其他地方去,防止被覆盖。)如果不想数据被覆盖,那就在转换完成之后尽快把结果拿走。注入组:这个组厉害,一次可以转换4个数据,有4个16位寄存器,可以同时上4个数据。注入组和规则组的优先级是:注入组的ADC转换可以打断规则组,当注入组转换完成后,规则组在接着转换。

3.这部分就是ADC触发源的触发源了,就是满足什么条件ADC会转换,触发ADC开始转换的信号有两种,一种是软件触发:在程序中手动调用一条代码,就可以启动转换,另一种是硬件触发,就是这里的触发源,这些触发源主要是来自于定时器,有定时器的各个通道

以下是规则组硬件启动触发选项:

以下是注入组硬件启动触发选项:

这其中还有TRGO定时器主模式的输出,定时器可以通向ADC、DAC这些外设,用于触发转换,因为ADC经常需要过一个固定时间段转换一次,比如定时器每隔1ms申请一次中断,在中断里手动开启一次转换,但不能频繁进中断,由于中断之间,优先级也不同,会导致某些中断不能及时得到响应,如果触发ADC的中断不能及时响应,那ADC转换频率就肯定会产生影响,对于这种需要频繁进中断,并且在中断里只完成了简单的工作的情况,一般都会有硬件的支持,定一个1ms的时间,定时器的更新事件选择位TRGO输出,然后在ADC这里,选择开始触发信号为TIM3的TRGO,这样TIM3的更新事件就能通过硬件自动触发ADC转换了,整个过程不需要进中断,这就是定时器触发的作用。

5.ADCCLK是驱动输出比较的时钟,这个时钟来自于RCC只能6分频和8分频,最大14MHZ。外面的F1系列的最大就是12分频。

7.关于中断的:ADC转换完之后,也有一个转换完成的信号(EOC是规则组的完成信号,JEOC是注入组完成的信号),这些信号在状态寄存器里,转换完成后置标志位,读取标志位就知道是不是转换结束了。通向后面的NVIC,申请中断。

这里的模拟看门狗AWD原理:就是可以用于ADC的值判断,高于多少,低于多少,反正不正常之后停止喂狗触发中断。因为ADC多数用于检测某些阈值,比如温度:当温度高于阈值、低于阈值时,执行某些操作,这个操作,模拟看门狗可以检测指定的某些通道,当AD值高于它设定的上阈值或者低于下阈值时,它就会申请中断,在中断函数里执行相应的操作。这样就不用手动读值,再用if进行判断了。

*3.ADC时钟设置:

首先我们得知道STM32里面ADC的转换时间等于什么?然后再讨论它怎么得出来。

ADC转换时间: TCONV = 采样时间 + 12.5个周期。这两个变量的设置如下:

ADC的时钟频率设置

上图是截取F1系列时钟树框图的关于ADC时钟频率怎么得来的一块图。

对F1系列的单片机来说,APB2也就是是72MHz 经过6分频之后,ADC时钟频率为12MHz,时钟周期就是1/12M。当然也可以选择8分频,ADC的时钟频率就是9MHz,一般选的是6分频,要注意就是ADC时钟频率最大就是14MHz,也就是不能是2,和4分频。

ADC采样时间设置:

对F1系列的单片机来说,APB2也就是是72MHz 经过6分频之后,ADC时钟频率为12MHz

ADC转换时间: TCONV = 采样时间 + 12.5个周期

采样时间:采样时间可通过SMPx[2:0]位设置,x=0~17

SMP = 000:1.5个ADC时钟周期          SMP = 001:7.5个ADC时钟周期

SMP = 010:13.5个ADC时钟周期        SMP = 011:28.5个ADC时钟周期

SMP = 100:41.5个ADC时钟周期        SMP = 101:55.5个ADC时钟周期

SMP = 110:71.5个ADC时钟周期        SMP = 111:239.5个ADC时钟周期

简单计算一下:ADC最短转换时间是:TCONV = 采样时间 + 12.5个周期 = 1.5个周期 + 12.5个周期 = 14个周期 = (1/12000000)∗14 s = 1.17us。

*4.转换模式

转换模式就是我们的ADC它以什么姿态去转换数据的,是只转换一次存到寄存器里面就停止吗?还是能一直转换,不断覆盖新的数据到我们的寄存器里面吗等等。那么就引出单次转换模式,连续转换模式,还有与这两个模式搭配的扫描模式的概念。

单次转换模式:

单次转换模式就是它就只触发一次转换就完,单次转换模式在注入组和规则组的转换流程都一样,转换结果存入寄存器里面,规则组是ADC_DR,注入组是ADC_DRJx。转换结束后相应的中断标志位也会被置1,规则组的标志位是EOC,注入组的标志位是JEOC。如果你设置了相应的标志位那么该中断就中断,没设置就不管。规则组是EOCIE,注入组是JEOCIE。之后ADC转换停止

连续转换模式:

连续转换模式就是它会自动触发下一次转换,值得注意的是只有规则组才能触发该模式。注入想继续转换,只能自己将JAUTO位置1,这个位在ADC_CR1的位10。流程和单次转换一样,只不过最后ADC转换不停止。

我们选择单次还是连续是由ADC_CR2寄存器中的位1 CONT位来决定的。

扫描模式:

扫描模式是由SCAN位来控制的,0:关闭扫描模式,1:开启扫描模式

不用扫描模式就是:只转换放入注入组或规则组序列选择的第一个通道。

使用扫描模式就是:扫描注入组或规则组序列所以被选中的通道。

注:注入组有4个序列号即序列1~序列4,规则组有16个序列号即序列1~序列16。这个序列号的功能就是设置我们选中的转换通道。可以是通道0~通道17。

单次转换模式(非扫描)

在这个非扫描模式下:如下图,这个组序列里只有第一个序列1的位置有效,菜单同时选中一组的方式就退化为简单选中一个的方式了,通道2,写到这个位置,然后就可以触发转换,ADC就会对这个通道2进行模数转换,过一段时间就转换完成,把转换的数据存在寄存器里,然后给EOC标志位置1,判断这个这个标志位,如果转换完了,那就可以在数据寄存器里读取数据结果了,如果想在启动一次转换,那就再触发一次。

单次转换模式(扫描)

每次触发之后,如下图,依次对选中的所有通道进行AD转换,转换结果都放在寄存器里(需要DMA),想要用扫描模式实现多通道,最好配合DMA来实现。 在组序列表中,里面的每一个单独的通道转换完之后,不会产生任何的标志位,也不会产生中断,我们是不知道是不是转换完成的,他只有整个列表转换完成之后,才会产生一次EOC标志位,才能触发中断。几微秒产生一个数据,想手动转运数据,要求太高了。但这里可以使用间断模式,每扫描一次就间断一次,转运一个通道的数据走之后,再继续触发,继续下一次转换。没有标志位,只能用Delay(不如DMA)。

连续转换模式(非扫描)

与单次转换不同的是:他在转换结束后不会停止,而是立刻下一轮转换,然后持续下去,这样就需要最开始触发一次,之后就可以一直转换了。

连续转换模式(扫描)

补充:还有一共手册上提到的:间断模式。

32手册原话:此模式通过设置ADC_CR1寄存器上的DISCEN位激活。它可以用来执行一个短序列的n次转换 (n<=8),也就是我们设置n,每隔n转换,就暂停一次(暂停过程可以搬运数据),再进行菜单中下一个通道的转换。

5.数据对齐和ADC校准

数据对齐分左对齐和右对齐,因为我们ADC的分辨率是12位的,我们的数字模拟量的范围是0~4096,而我们的寄存器是16位的。就有4位空出。一般习惯选右对齐。

ADC校准,这个是ADC它自己内带的校准模式。

标准库里面的使用表示分4步(ADC1转换为例):

    ADC_ResetCalibration(ADC1);//1.复位校准
    while (ADC_GetResetCalibrationStatus(ADC1) == SET);//2.等待复位校准完成
    ADC_StartCalibration(ADC1);//3.开始校准
    while (ADC_GetCalibrationStatus(ADC1) == SET);//4.获取开始校准状态

hal库里面的使用表示:

HAL_ADCEx_Calibration_Start(&句柄);//开始校准

两种都有各自的好处,当然校准是建立在ADC的工作参数、ADC通道等配置完成之后的。

感谢江协大和正点原子的老师们。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值