当前位置: 首页 > news >正文

STM32-ADC模数转换器(7)


对GPIO来说,它只能读取引脚的高低电平,使用了ADC模数转化器之后,就可以对高电平和低电平之间的任意电压进行量化,最终用一个变量来表示,读取这个变量,就能得到引脚输入的具体电压是多少了。

ADC模数转化器就相当于一个电压表,把引脚的电压值测出来,放入一个变量中,这就是ADC的作用。

一、ADC简介

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

数字-模拟转换器简称DAC,可以将数字变量转化成模拟电压,主要应用于波形生成(信号发生器、音频解码芯片)等。
PWM的功能与DAC相似,它只有完全导通和完全断开两种状态,在这两种状态上都没有功率损耗,所以在直流电机调速这种大功率的应用场景,使用PWM来等效模拟量,是比DAC更好的选择,且PWM电路更简单,而且更常用。

STM32中的ADC是12位逐次逼近型ADC,1us转换时间。


ADC还有两个关键参数,分别是分辨率和转换时间(转换频率)
分辨率就是用多少位来表示,这里12位,分辨率的表示范围就是0~2^(12-1),即量化结果的范围是0~4095,位数越高,量化结果越精细,对应分辨率就越高。
AD转换是需要一小段时间的,这里1us表示从AD转换开始到产生结果,需要花费1us的时间,对应AD的转换频率是1MHz,这个就是STM32的最快转换频率。

输入电压范围:0~3.3V,转换结果范围:0~4095
输入电压一般要求是在芯片供电的正极和负极之间变化,输入0-3.3V,经过AD转换后,就得到最小值0,最大值4095,中间也都是一一对应的线性关系。

ADC模数转换器共有16个输入通道,可测量16个外部和2个内部信号源
16个外部信号源就是16个GPIO口,在引脚上直接接模拟信号就可以,不需要任何额外的电路,引脚就可以测量电压值。
两个内部信号源分别是内部温度传感器和内部参考电压。
温度传感器可以测量CPU的温度,内部参考电压是一个1.2V左右的基准电压,这个基准电压不会随外部供电变化而变化,如果芯片的供电不是标准的3.3V,测量外部引脚的电压就会错误,这时就可以读取基准电压进行校准,就能得到正确的电压值了。

STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道,两个内部信号源温度传感器和内部参考电压都在ADC1上。
ADC12_IN0的意思是ADC1和ADC2的IN0都在PA0引脚上。

二、逐次逼近型ADC

输入部分:给地址锁存和译码一个通道的地址,就能让通道选择开关,选择其中一个通道打开。

比较部分:通过电压比较器,它可以判断两个输入信号电压的大小关系,输出一个高低电平,指示电压谁大谁小。它的两个输入端,一个是外部通道输入未知编码的电压,一个是DAC输出已知编码的电压,它俩同时输入到比较器,进行大小判断。如果DAC输出的电压比较大,就调小DAC数据;如果DAC输出电压比较小,就调大DAC数据,直到DAC输出电压和外部通道输入的电压近似相等,这样DAC输入的数据就是外部电压的编码数据了,这个电压调节的过程就是逐次逼近寄存器SAR来完成的。

为了最快找到未知电压的编码,通常是采用二分法来进行查找,比如8位的ADC,那编码就是0~255,第一次输入时,就给255的一半128进行比较,如果DAC大了,第二次比较就给128的一半64进行比较,以此类推。这些比较数据正好是二进制的每一位位权,这个判断过程就相当于是从高位到低位依次判断是1还是0的过程。

三、ADC基本结构图

左边是输入通道,包括16个GPIO外部输入通道和两个内部通道。

进入AD转换器后,里面有两个组,分别是规则组和注入组,规则组最多可以同时选中16个通道进行比较,但是只能转换输出其中一个通道内的数据,因此规则组可以配合DMA数据转运来使用,DMA可以转运选中的其他多个通道内的数据,防止数据被覆盖。
注入组最多可以同时选择4个通道进行比较,也能同时输出4个通道内的数据到AD数据寄存器。

触发控制提供开始转换信号,它有软件触发(调用函数)和硬件触发(定时器和外部中断)。

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

规则组和注入组转换完成后,会有一个EOC信号,它会置一个标志位,最终也可以向NVIC申请中断。

最后右下角还有一个开关控制,在库函数中就是ADC_Cmd函数,用于给ADC上电。

AD初始化步骤:
(1)开启RCC时钟,包括ADC和GPIO;
(2)ADC的时钟,ADCCLK需要配置一下;
(3)配置GPIO,改成输入模式;
(4)配置多路开关,把左边通道接入到右边的规则组列表中;
(5)配置ADC转换器;
(6)调用ADC_Cmd函数,开启ADC;
(7)对ADC进行校准,来减少误差。


四、规则组的四种转换模式


1、单次转换,非扫描模式

上图列表就是规则组里能选中的通道,在非扫描模式下,这个列表只有第一个序列1的位置有效,规则组同时选中一组(16个通道)就退化为简单地选中一个地方式了,序列1的位置可以指定想要转换的通道,触发后,ADC就会对这个通道2进行模数转换,过一小段时间后,转换结果就会放在数据寄存器中,同时给EOC标志位置1。如果需要再转换,就得再次触发ADC进行模数转换。

2、连续转换,非扫描模式

它与上一种方式的不同之处在于,在一次转换结束之后,它的转换不会停止,而是立刻开始下一轮的转换,一直持续下去。

3、单次转换,扫描模式

这里也是单次转换,因此再每次转换后,都会停下来,需要触发才能开始。
这个扫描模式可以同时选择多个通道,通道数量也是可以指定的,触发之后,它就会依照序列号,依次对通道进行AD转换,转换结果都放在数据寄存器了,为了防止数据被覆盖,需要用DMA及时将数据挪走。7个通道转换完成后,才会产生EOC标志位置1,转换结束。然后需要转换,得再次触发ADC进行模数转换。


4、连续转换,扫描模式

这个模式功能跟上个模式一致,就是触发一次就会自动一直触发,会一直连续转换。

在扫描模式得情况下,还有一种模式,叫间断模式,它的作用是在扫描过程中,每隔几个转换,就暂停一次,需要再次触发,才能继续。


ADC1和ADC2的外部触发方式,其中包括定时器触发、外部引脚触发和软件触发,选择哪种触发方式,通过控制最右边寄存器可以选择对应方式。

五、转换时间

AD转换的步骤包括采样保持、量化编码两步。

采样保持:在量化编码前,需要设置一个采样开关,打开采样开关,收集外部电压,比如可以用一个小容量的电容存储这个电压,存储好了以后,断开采样开关,再进行后面的量化编码,这样在量化编码期间,电压就能够始终保持不变,这样才能精确地定位未知电压的位置;
采样保持的过程中,需要闭合采样开关,过一段时间再断开,这里就会产生一个采样时间。

量化编码:是ADC逐次比较(AD模数转换)的过程,这个需要花一段时间,位数越多,花费的时间就越长。

STM32 ADC的总转换时间为:T_CONV = 采样时间 + 12.5个ADC周期
采样时间就是采样保持花费的时间,采样时间越大,越能避免一些毛刺信号的干扰,转换时间也会相应延长;
12.5个ADC周期是量化编码花费的时间,ADC是12位的,因此需要花费12个周期,这里0.5个周期是一些其他事情花费的时间。

例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期。T_CONV = 1.5 + 12.5 = 14个ADC周期 
ADC周期就是从RCC分频过来的ADCCLK,ADCCLK最大为14MHz。
转换时间= N个ADC周期/ADCCLK = 14/14MHz = 1us

相关文章:

  • 数据链共享:从印巴空战到工业控制的跨越性应用
  • Axure :基于中继器的列表删除 、 列表编辑
  • 深入理解 TCP:重传机制、滑动窗口、流量控制与拥塞控制
  • arXiv2025 | TTRL: Test-Time Reinforcement Learning
  • CDGP数据治理主观题评分标准与得分策略
  • Linux平台下SSH 协议克隆Github远程仓库并配置密钥
  • ui组件二次封装(vue)
  • Android 关闭Activity切换过渡动画
  • uniapp-商城-50-后台 商家信息
  • C++ 命令模式详解
  • .Net Mqtt协议-MQTTNet(一)简介
  • Ubuntu22.04怎么退出Emergency Mode(紧急模式)
  • 【许可证】Open Source Licenses
  • 两个数组的交集(暴力、set、哈希)
  • 【C++】红黑树
  • [RoarCTF 2019]Easy Calc1
  • 怎么免费下载fbx格式模型、和blender格式文件模型,还可以在线编辑修改
  • MySQL的Order by与Group by优化详解!
  • 算法-贪婪算法
  • 【Web前端开发】HTML基础
  • 沃尔玛上财季净利下滑12%:关税带来成本压力,新财季价格涨幅将高于去年
  • 美国务卿鲁比奥抵达会场,将参加俄乌会谈
  • 经济日报评外卖平台被约谈:行业竞争不能背离服务本质
  • 联合国秘书长欢迎中美经贸高层会谈成果
  • 中美是否计划讨论美方以芬太尼为由对华征收的特别关税?外交部回应
  • 广东省人大教科文卫委原主任委员梁万里被开除党籍:退休后受贿仍不知止