ADC模数转换器

1.ADC介绍(STM32)

ADC:模拟-数字转换,将引脚上的连续变化的模拟电压转化为内存中储存的数字变量,建立起模拟电路到数字电路的桥梁(DAC与之相反)

12位逐次逼近型ADC,1us转换时间(表示范围0~2^12-1=4095,位数越高量化结果越精细,对应分辨率越高;转换时间表示从转化开始到结束,需要1us的时间,对应AD转换的频率就是1MHz,这是STM32 ADC的最高转换频率)

输入电压范围:0~3.3V,转换结果范围:0~4095(电压和转换结果之间成正比)

18个输入通道,可测量16个外部单元(16个GPIO口,在引脚可直接接模拟信号直接测电压)和2个内部信号源(内部温度传感器可测量CPU温度,内部参考电压,读取基准电压对待测电压进行校准)

规则组和注入组两个转换单元(后续详解)

模拟看门狗自动检测输入电压范围(可设置高低阈值,可以检测指定的某些通道,当他们高于或低于设定上阈值或低于下阈值时,他就会申请中断,我们就可以在中断中执行相关操作)

STM32C8T6 ADC资源ADC1,ADC2,10个外部输入通道

2.逐次逼近型ADC

  • 此芯片是独立的8位逐次逼近型ADC芯片
  • 通过通道选择开关,选择一路,输入到比较器上端进行转换,下面的地址锁存和译码,就是你想选择哪个通道,就把通道号放在ADDA,ADDB,ADDC上,然后给一个锁存信号(ALE),通道就已经选择结束
  • 比较器上端是输入电压的大小,下端是DAC数模转换器输出的电压,逐次逼近是使用的二分法;如这里是8位的ADC,编码范围为0~255,第一次比较DAC输入255/2 = 128,进行比较,如果DAC电压大了,在输入64进行比较,如果还大,在输入32,如果这一次小了,下一次再给32~64的中间值,然后继续,这样依次进行。在这个过程用二进制表示的话,可以发现128,64,32这些数据分别是二进制每一位的位权,这个判断相当于对二进制从高位到底位依次判断是1还是0的过程,如果是大于就置1,如果是低于就置0,对于8位的ADC,就需要依此判断8次,对于12位ADC,就需要依此判断12次,这就是逐次逼近的过程。
  • AD转换结束后,DAC的输入数据就是比较器上端未知电压的编码,通过8位三态缓存寄存器输出(如果是12位就有12位的输出)
  • CLOCK:ADC的时钟
  • START:转换开始信号
  • EOC:转换结束信号
  • Vref(+),Vref(-):参考电压的正负极,DAC参考电压,例如数据255对应是5V还是3.3V,DAC的参考电压也决定了ADC的输入范围,也是ADC的参考电压
  • VCC,GND是芯片供电,分别跟Vref(+),Vref(-)连在一起

3.STM32芯片ADC电路

  • 此图左边的ADCx_IN0一直到ADCx_IN15再加上温度传感器和Vrefint(内部参考电压)共18个输入通道,之后进入模拟多路开关,右边是多路开关的输出,进入到模数转换器(在模数转换器中进行逐次逼近,逐次比较的过程)转换结果放到数据寄存器中,我们直接读取数据寄存器就可以得到模拟值,就可以得到ADC转换的值了
  • 对于普通的ADC多路开关一般都是只选中一个,选中某个通道开始转换,等待转换完成取出结果,这是普通的流程,但是这里比较高级,它可以同时选中多个,而且在转换的时候还分成了两个组,规则通道组和注入通道组,其中规则组可以一次性最多选16个通道,注入组最多可以选中4个通道,这样可以大大提高效率。当然也可以只选择一个通道,再这样就是普通的模式。但是规则组存在一个问题,他每次只能储存一个数据,如果不及时转移走,就会被覆盖掉,这个模式最好配合DMA来配合数据搬运,防止数据被覆盖。对于注入组来说就不存在这样的问题,注入组数据寄存器可以同时输出4个数据。
  • 所以如果要使用规则组,那就再配合DMA,这样就不用担心数据覆盖的问题了
  • ADCCLK:是ADC的时钟是用与驱动内部比较的时钟,来自ADC预分频器,ADC预分频器是来源于RCC的,对于ADC预分频器只能选择6分频或者8分频,不然频率会超过最大频率14MHz

  • DMA请求:是用来触发DMA转换的

  • 数据寄存器:数据寄存器是用来存放转换结果的
  • 模拟看门狗:模拟看门狗里面可以存一个阈值高限和一个阈值低限,如果启动看门狗,并且指定了看门的通道,一旦超过或者低于阈值通道就会在上面申请一个模拟看门狗的中断,最后通向NVIC
  • 对于规则组和注入组来说,当转换结束后,也会产生EOC转换完成的信号,这里EOC是规则租的完成信号,JEOC是注入组的完成信号,这两个信号会在状态寄存器里置一个标志位,读取标志位就知道转换是否结束,同时这两个标志位也可以去NVIC申请中断。

  • ADC触发转换有两种,一种是软件触发,只需要一条代码即可实现;另一种是硬件触发。
  • 注入组和规则组的触发源主要是各个定时器的通道还有TRGO主模式定时器的输出,当然也可以选择外部触发中断引脚来触发转换(EXTI_15注入组EXTI_11规则组)

4.ADC基本结构图

  •  左边是16个GPIO口加上两个内部通道,温度传感器和Vrefint(内部参考电压)共18个通道
  • 之后进入AD转换器,转换器分为注入组和规则组,注入组可以选择4个通道,规则组可以选择16个通道
  • 转换后的结果储存在数据寄存器中,注入组有4个数据寄存器,规则组只有一个数据寄存器
  • 下面这里有触发控制,触发控制有软件触发和硬件触发,软件触发只需要调用一串代码,硬件触发可以有定时器的一些通道和还有TRGO主模式定时器的输出,当然也可以选择外部触发中断引脚来触发转换(EXTI_15注入组EXTI_11规则组)
  • 右边是来自于RCC的内部时钟CLOCK,ADC逐次逼近时是由这个时钟推动的,在配置时需要注意,对于ADC预分频器只能选择6分频或者8分频,不然频率会超过最大频率14MHz
  • 上面,可以配置一个模拟看门狗,模拟看门狗里面可以存一个阈值高限和一个阈值低限,如果启动看门狗,并且指定了看门的通道,一旦超过或者低于阈值通道就会在上面申请一个模拟看门狗的中断,最后通向NVIC
  • 规则组和注入组当转换结束后,也会产生EOC转换完成的信号,EOC是规则组的完成信号,JEOC是注入组的完成信号,这两个信号会在状态寄存器里置一个标志位,读取标志位就知道转换是否结束,同时这两个标志位也可以去NVIC申请中断。
  • 最后,右下角有一个开关控制,这个就是指库函数种的ADC_Cmd函数,用于给ADC上电

5.输入通道

以上是ADC通道和引脚复用的关系,对应关系也可以通过引脚定义表来看

  • 对于此单片机来说,只有10个外部输入通道
  • ADC12_IN0含义表示ADC1和ADC2的IN0口都在PA0口上,其余含义相同,之所以ADC1和ADC2的引脚相同是因为ADC的高级功能双ADC模式,这里不做讲解

6.转换模式

在ADC初始化结构体里,会有两个参数;一个是选择单次转换还是连续转换,一个是选择扫描模式还是非扫描模式。两个组合就出现了4种模式。

6.1 单次转换,非扫描模式

  • 这里有16个通道,可以在序列里写入你想检测的通道;在非扫描模式下,只有序列1位置有效,选中一组的方式就简化成选中一个的方式了,在这里我们可以在序列1的位置写入我们想转化的通道;
  • 然后我们就可以触发转换,过一小段时间后,转换完成,转换结果放在数据寄存器中,同时给EOC标志位置1,整个转换结束
  • 我们判断这个EOC 标志位,如果转换完了,我们就可以去数据寄存器中读取结果了
  • 如果我们想在启动一次转换,就需要再触发一次转换
  • 如果我们想更换一个通道,则需要在转换前,更改序列1的通道,之后再启动触发转换

6.2 连续转换,非扫描模式

  • 首先它是非扫描模式,所以只有序列1位置有效
  • 但他与上一个转化模式不同的是,他在进行完一次转换结束后不会停止,而是立刻进行下一次转换,然后一直持续下去
  • 这样只需要在第一次转换时触发一次,之后就可以一直转换
  • 这个模式的好处是在开启转换后不需要再等待一段时间了,因为他在一直转换,也不需要去判断转换是否结束,想要读取AD值直接去数据寄存器中读取即可

6.3 单次转换,扫描模式

  • 这个模式也是单次转换,所以每触发一次,转换结束后,就会停下来,下次转换需要再触发才能开始。
  • 然后他是扫描模式, 会用到这个序列表,我们就可以在列表中填写多个通道,每个位置是通道几可以任意指定,并且也可以重复。在初始化结构体中有个参数可以配置通道数目,比如参数是7,触发后就会依次对前7个位置进行转换,转换结果都放在寄存器中,为了防止数据被覆盖,我们需要用DMA及时将数据移走;当7个通道转换完成后,产生EOC信号,转换结束;要想再次转换,需要再一次的触发。

 6.4 连续转换,扫描模式

  • 与单次转换,扫描模式相比,他的特点是在上一次转换结束后,不需要手动触发即可继续进行转换

7.触发控制

  • 触发信号的选择可以通过右边的EXTSEL寄存器选择
  • 对于库函数来说,直接给一个参数即可

8.数据对齐

  • 我们的转换器是12位的,但数据寄存器是16位的,存在一个数据对齐的问题
  • 数据右对齐:12位的数据右靠,多出来的高位补0
  • 数据左对齐:12位的数据左靠,多出来的低位补0
  • 一般选择数据右对齐,这样在读取寄存器结果时,直接就是转换结果;数据左对齐的话,直接读出的数据会比实际值大16倍。

9.转换时间

  • 采样,保持:在进行ADC转换时,是需要一段时间的(量化编码的过程),如果我们的输入电压在不停的变化,就没法定位输入电压的大小,所以需要采样,保持;所以在量化编码之前我们要设置一个采样开关,在 量化编码前,先打开采样开关,收集一下外部电压,储存起来,储存好之后断开开关,在进行量化编码;这样可以保证在量化编码期间,电压始终保持不变,这样才能精确的定位电压的位置。在采样保持的过程,闭合采样开关再断开所需要的时间就是采样时间
  •  采样时间可以在程序中配置,采样时间越大,越能避免一些毛刺信号的干扰,同样转换时间也会延长。
  • 12.5个ADC周期是量化编码所需的时间,12是因为是12位的ADC,所以花费12个周期,0.5是做其他东西需要的时间
  • ADC周期就是从RCC分频来的ADCCLK,ADCCLK最大是14Hhz,当ADCCLK=14Hhz,采样时间是1.5个ADC周期,1.5+12.5=14个ADC周期=1us,这就是最快1us的原因

10.校准

  • 这个校准是固定的,我们只需要在ADC初始化的最后加几条代码即可

11.硬件电路

对于第一种电路,根据电位器产生一个可调电压,滑动端上滑,电压升高,滑动端下滑,电压降低(需注意,电阻不能给太小 )

第二种电路是传感器产生可调电压的电路,传感器阻值越小,产生电压越小,传感器阻值越大,产生电压越大(这里可以类比为串联电路分压问题,输出端测量接地端的电压,根据分压理论来分析)

第三种是简单的电压转换电路,输入5V电压,单片机只能接入3.3V电压,所以采用分压电路去接,让他去产生3.3V的电压(如果电压太高还是建议使用专业的采集芯片,如隔离放大器,做好高低电压的隔离,保证电路安全)

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值