STM32_ADC_模数转换器
文章目录一、ADC简介二、 逐次逼近型ADC三、STM32ADC框图四、 ADC基本结构图五、 输入通道六、规则组的4种转换模式1、单次转换、非扫描模式2、连续转换、非扫描模式3、单次转换、扫描模式4、连续转换、扫描模式5、触发控制6、数据对齐7、转换时间8、校准9、硬件电路一、ADC简介ADCANalog-Digital Converter模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转化为内存中存储的数字变量建立模拟电路到数字电路的桥梁12为逐次逼近型ADC1us的转换时间转换频率为1MHZ输入电压范围0~3.3V,转换结果范围0 ~ 4095;STM32F1系列单片机 最多有18个输入通道最多可以测量16个外部GPIO口和两个内部信号源内部温度、内部基准电压该电压是不随外部供电电压的变化而变化的当外部供电不是标准的3.3v可以使用这个参考电压 STM32F1系列单片机的规则组和注入组两个转换单元普通AD转换流程是启动一次转换就读取一次值循环往复操作STM32可以一次性启动一个组连续转换多个值模拟看门狗自动检测输入电压范围模拟看门狗可以检测指定某些通道当AD值高于它设定的上阈值或者低于下阈值时就会申请中断此时可以在中断函数里执行相应的操作二、 逐次逼近型ADC地址锁存和译码详单与一个数据选择器ADDA、ADDB、ADDC用于控制八路INx信号的输入ALE是一个锁存信号信号通路配置完成后会经过电压比较器电压比较器可以判断两个输入信号电压的大小这里比较电压是DAC数模转换器的输出端数模转换器DAC的作用是给定一个数值它可以输出对应的电压DAC的内部是通过加权电阻网络实现的当DAC输出的电压比较大就调小DAC数据反之就增大DAC数据直到DAC数据和输入电压数据近似相等比较过程可以采用2分法来实现假如ADC的数值是0~255每次使用2分法比较的数可以为128、64、32…对应二进制数的位权也就是说比较过程相当于对二进制数从高位到地位判断是0还是1的过程对于8位的ADC从高位到低位依次判断8次就可以找到未知电压的编码了而对于STM32F1系列的单片机由于其ADC是12位则需要依次判断12位才可以得到未知电压的编码ADC转换结束后输出得到的数值存储到地址锁存器其中地址锁存器对于8位的ADC就是8位的对于12位ADC就是12位的EOFEnd Of Convert转换结束信号START开始转换给一个输入脉冲开始转换CLOCK是ADC时钟因为ADC内部是一步一步进行判断的需要时钟来推动这个过程VREF与VREF-是DAC的参考电压比如给定一个数值255是对应5V还是3.3v由参考电压决定DAC的参考电压也决定了ADC的输入范围所以这个电压也是ADC的参考电压VCC是整个芯片电路的供电通常参考电压的正极和VCC是接在一起的参考电压的负极VREF-和GND是接在一起的三、STM32ADC框图左边是ADC的输入通道包括16个GPIO口IN0~IN15 和两个内部二点通道一个是内部温度传感器另一个是VREFINTV Reference Internal内部参考电压总共是18个输入通道然后到达模拟多路开关可以指定我们想要选则的通道右边是多路开关的输出进入到模数转换器。这里模数转换器就是执行刚刚上面讲的逐次比较的过程。转换结果会直接放在数据寄存器里我们读取寄存器就能直到ADC转换的结果了。对于普通的ADC多路开关一般是只选中1个的就是选中某个通道、开始转换、等待转换完成、取出结果、这是普通的流程。但是STM32上就比较高级了它可以同时选中多个而且在转换的时候还分成了两个组规则通道组和注入通道组其中规则组可以一次性最多选择中16个通道注入组最多可以选中4个通道。这有什么作用呢举个例子就像是去餐厅点菜、普通的ADC是指定一个菜老板做完后送给自己这里就是指定一个菜单这个菜单最多可以填16个菜老板按照菜单的顺序依次做好一次性端上来这样就大大提高效率当然菜单也可以只写一个菜就简化成普通的模式了。对于这个菜单也有两种1种是规则组可以同时上16个菜但是有个尴尬的地方就是规则组只有一个数据寄存器就是这个桌子比较小只能放一个菜如果上16个菜前15个菜就会被挤掉。所以对于规则组来说如果使用这个菜单的话最好配合DMA来实现。DMA是一个数据转运小帮手它可以在每上一个菜之后把这个菜挪到其它地方去防止被覆盖。规则组虽然可以同时转换16个通道但是数据寄存器只能存一个结果如果不想之前的结果被覆盖那就转换完成之后要尽快把结果拿走。注入组这个组就比较高级相当于是餐厅的VIP座位在这个座位上一次性最多可以点4个菜并且数据寄存器有4个是可以同时上4个菜的对于注入组而言就不用担心数据覆盖的问题了。这就是规则组和注入组的介绍。一般情况下使用规则组就完全足够了如果要使用规则组的菜单那就再配合DMA转运数据。模数转换器外围电路左下角是触发转换的部分也就是ADC0809的START。对于STM32的ADC触发ADC开始转换的信号有两种一种是软件触发就是再程序中手动调用一条代码就可以启动转换了另一种是硬件触发就是左下角的触发源。上面是注入组的触发源下面是规则组的触发源这些触发源主要是来自定时器有定时器的各个通道还有TRGO定时器主模式的输出。之前讲定时器的时候也介绍过定时器可以通过ADC、DAC这些外设用于触发转换。那因为ADC经常要过一个固定时间段转换一次比如每隔1ms转换一次正常的思路就是用定时器每隔1ms申请1次中断在中断里手动开始一次转换这样也是可以的。但是频繁进中断对程序是有一定影响的比如有很多中断都需要频繁进入肯定会影响主程序的执行并且不同中断之间由于优先级的不同也会导致某些中断不能及时得到响应如果触发ADC的中断不能及时响应那我们ADC的转换频率就肯定会产生影响了所以对于这种需要频繁进中断并且在中断里只完成了简单工作的情况一般都会有硬件的支持。比如这里就可以给TIM3定一个1ms的时间并且把TIM3的更新事件选择位TRGO输出然后在ADC这里选择开始触发信号为TIM3的TRGO这样TIM3的更新事件就能通过硬件自动触发ADC转换了整个过程不需要进中断节省了中断资源。这就是这里定时器触发的作用。当然这里还可以选择外部中断引脚来触发转换都可以在程序中配置这就是触发转换的部分。左上角是VREF、VREF-、VDDA和VSSA上面两个是ADC的参考电压决定了ADC输入电压的范围下面两个是ADC的供电引脚一般情况下VREF要接VDDA、VREF-要接VSSA在这款芯片上没有VREF和VREF-的引脚它在内部就已经和VDDA和VSSA接在一起了。VDDA和VSSA在引脚定义里就可以看到。VDDA和VSSA是内部模拟部分的电源比如ADC、RC振荡器、锁相环等等在这里VDDA接3.3V、VSSA接GND、所以ADC的输入电压范围就是0~3.3V。右边ADCCLK是ADC的时钟也就是ADC0809上的CLOCK是用于驱动内部逐次比较的时钟。这个是来自ADC预分频器这个ADC预分频器是来源于RCC的。如下图RCC时钟树框图所示APB272MHz通过预分频器进行分频得到ADCCLKADCCLK最大是14MHz所以这个预分频器就有点尴尬它可以选择2、4、6、8分频如果选择2分频72M/236M超出允许范围了4分频之后是18M也超了所以对于ADC预分频器只能选择6分频结果是12M和8分频、结果是9M这两个值。DMA请求是用于触发DMA进行数据转运的。两个数据寄存器是用于存放转换结果的上面还有一个模拟看门狗里面可以存一个阈值高限和阈值低限如果启动了模拟看门狗并指定了看门的通道那这个看门狗就会关注它看门的通道、一旦超过这个阈值范围了它就会乱叫就会在上面申请一个模拟看门狗的中断最后通向NVIC。然后对于规则组和注入组而言它们转换完成后也会有一个EOC转换完成的信号在这里EOC是规则组的完成信号JEOC是注入组完成的信号这两个信号会在状态寄存器里置一个标志位读取这个标志位就能知道是不是转换结束了同时这两个标志位也可以去到NVIC申请中断如果开启了NVIC对应的通道它们就会触发中断。四、 ADC基本结构图左边是输入通道16个GPIO口、外加两个内部的通道然后进入AD转换器、AD转换器里有两个组、一个是规则组、一个是注入组。规则组最多可以选中16个通道、注入组最多可以选择4个通道然后转换的结果可以存放在AD数据寄存器里其中规则组只有一个数据寄存器注入组有4个下面有触发控制、提供了开始转换这个START信号触发控制可以选择软件触发和硬件触发硬件触发主要来自于定时器当然也可以选择外部中断的引脚。右边是来自RCC的ADC时钟CLOCKADC逐次比较的过程就是由这个时钟推动的。然后上面可以布置一个模拟看门狗用于监测转换结果的范围如果超出设定的阈值就通过中断输出控制向NVIC申请中断另外、规则组和注入组转换完成后会有个EOC信号它会置一个标志位当然也可以通向NVIC。最后右下角还有一个开关控制在库函数种就是ADC_Cmd函数用于给ADC上电的。五、 输入通道总共有18个通道、通道16对应ADC1的温度传感器通道17对应ADC1的内部参考电压。我们使用的这款芯片没有ADC3这颗芯片也没有PC0到PC5。上表从引脚定义表也可以看出来下图所示ADC12_IN0的意思是ADC1和ADC2的IN0都是在PA0上的。而且下面也是全都是ADC12这说明ADC1和ADC2的引脚全都是相同的既然都相同ADC2还有啥用呢这就是因为ADC的另一个高级功能了就是双ADC模式这个模式比较复杂双ADC模式就是ADC1和ADC2一起工作它两可以配合组成同步模式、交叉模式等等模式比如交叉模式、ADC1和ADC2交叉地对一个通道进行采样这样就可以进一步提高采样率。就像打拳一样左手一拳右手一拳快速交叉地打拳打击地频率就比一个拳头快。这就是ADC1和ADC2配合使用的双ADC模式了。ADC1和ADC2也是可以分开使用的可以分别对不同的引脚进行采样也是可以的。六、规则组的4种转换模式在ADC初始化的结构体里会有两个参数一个是选择单次转换还是连续转换的另一个是选择扫描模式还是非扫描模式的。这两个参数组合就是以下4种转换方式。1、单次转换、非扫描模式上图所示列表相当于规则组里的菜单可以在这里“点菜”就是写入要转换的通道在非扫描的模式下这个菜单就只有第一个序列1的位置有效这是菜单同时选中1组的方式就退化为简单地选中一个的方式了在这里我们可以在序列1的位置指定我们想要转换的通道比如通道2然后就可以触发转换ADC就会对这个通道2进行模数转换过一小段时间后转换完成转换结果放在数据寄存器里同时给ROC标志位置1整个转换过程就结束了。我们判断这个EOC标志位如果转换完了那我们就可以在数据寄存器里读取结果了如果想再启动一次转换就需要再触发一次转换结束置EOC标志位读结果。如果想换一个通道转换那在转换之前把第一个位置的通道2改成其它通道然后再启动转换就行了。2、连续转换、非扫描模式还是非扫描模式所以菜单列表只选择一个。与单次转换不同的是在一次转换后不会停止而是立刻开始下一轮的转换然后一直持续下去。这样就可以只需要最开始触发一次之后就可以一直转换了。这个模式的好处就是开始转换之后不需要等待一段时间的因为它一直都在转换所以就不需要手动开始转换了也不用判断是否结束的想要读AD值的时候直接从数据寄存器取就是了。3、单次转换、扫描模式这个模式也是单次转换所以每转换一次转换结束后就会停下来 下次转换就得再触发才能开始然后它是扫描模式这就会用到菜单列表了可以在菜单里点菜比如第一道是通道2第二道是通道5等等这里每个位置是通道几可以任意指定并且也是可以重复的然后初始化结构体里还会有个参数就是通道数目因为这16个位置可以不用完只用前几个那就需要再给一个通道数目的参数高速它我有几个通道比如这里指定通道数目为7那它就只看前7个位置。然后每次触发之后就依次对这前7个位置进行AD转换转换结果都放在数据寄存器里这里为了放在之数据被覆盖就需要用DMA及时讲数据挪走那7个通道转换完成之后产生EOC信号转换结束然后再触发下一次就又开始新一轮的转换。4、连续转换、扫描模式在扫描模式的情况下还可以有另一种模式叫间断模式它的作用是在扫描的过程中每隔几个转换就暂停一次需要再次触发才能继续。5、触发控制上图是规则组的触发源 也就是下图标注部分。有来自定时器的信号还有来自外部引脚或定时器的信号这个具体是引脚还是定时器需要用AFIO重映射来确定最后是软件控制位也就是我们之前说的软件触发这些触发信号的选择可以通过设置右边所示的寄存器来完成使用库函数的话直接给一个参数就可以了。6、数据对齐我们这个ADC是12位的它的转换结果就是一个12位的数据但是这个数据寄存器是16位的所以就存在一个数据对齐的问题。一般使用数据右对齐这样读取的16位寄存器直接就是转换结果。选择左对齐得到的结果会比实际的大因为数据左对齐就是把数据左移了4次。二进制有个特点就是数据左移一次就等效于把这个数据乘2左移4次就相当于把结果乘16了直接读的话会比实际值大16倍。左对齐的作用就是如果不想要这么右对齐这么高的分辨率觉得0~4095数太大了就做个简单的判断不需要这么高分辨率就可以选择左对齐然后再把这个数据的高8位取出来这样就舍弃了后面4个精度这样12位的ADC就退化成了8位的ADC了。数据右对齐数据左对齐7、转换时间转换时间这个参数一般不太敏感因为一般AD转换都很快若果不需要非常高速的转换频率那转换时间就可以忽略了。AD转换是需要一小段时间的。AD转换的步骤采样保持量化编码采样保持可以放在一起量化编码可以放在一起总共是这两大步。量化编码就是之前讲过的ADC逐次比较的过程这个是需要花一段时间的一般位数越多花的时间就越长采样保持这是因为AD转换就是后面的量化编码需要一小段时间的如果在这一小段时间里输入的电压还在不断变化、那就没办法定位输入电压到底是在哪里了所以在量化编码之需要设置一个采样开关先打开采样开关收集一下外部的电压比如可以用一个小容量的电容存储一下这个电压存储好了之后断开采样开关再进行后面的AD转换这样在量化编码期间电压始终保持不变这样才能精确定位未知电压的位置这就是采样保持电路。采样保持的过程需要闭合采样开关、过一段时间再断开这里就会产生一个采样时间。STM32 ADC的总转换时间为TCONV 采样时间 12.5个ADC周期采样时间就是采样保持花费的时间这个时间可以在程序中进行配置采样时间越大越能避免一些毛刺信号的干扰不过转换时间也会相应延长。12.5个ADC周期是量化编码所花费的时间因为是12位的ADC所以需要花费12个ADC这里多半个周期可能是做一些其它东西花的时间。ADC周期就是从RCC分频过来的ADCCLK这个ADCCLK最大是14MHz。例如当ADCCLK14MHz采样时间为1.5个ADC周期TCONV 1.5 12.5 14个ADC周期 1μs这就是最快1us时间的来源如若过采样周期再长一些它就达不到1us了。 也可以把ADCCLK的时钟设置超过14MHz这样ADC就是在超频了那转换时间可以比1us还短不过这样稳定性就没办法保证了。8、校准ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间在每个电容器上都会计算出一个误差修正码(数字值)这个码用于消除在随后的转换中每个电容器上产生的误差。建议在每次上电后执行一次校准。启动校准前 ADC必须处于关电状态超过至少两个ADC时钟周期。这个校准过程是固定的我们只需要在ADC初始化的最后加几条代码就行了。9、硬件电路如何设计ADC的外围电路上图第1个是电位器产生1个可调的电压这里电位器的两个固定端、一端接3.3V、另一端接GND这样中间的滑动段就可以输出一个0~3.3V可调的电压输出了。右边可以接ADC的输入通道比如PA0口当滑动端往上滑时电压增大往下滑时电压减小。注意电阻的阻值不要给太小因为这个电阻两端也是直接跨接在电源正负极的如果阻值太小这个电阻就会比较费电再小就有可能发热冒烟了。一般至少要接KΩ级的电阻比如这里接的10K的电阻。第2个是传感器产生输出电压的电路一般来说像光敏电阻、热敏电阻、红外接收管、麦克风等等。都可以等效为一个可变电阻电阻值没办法直接测量所以可以通过和一个固定电阻串联分压来得到一个反应电阻值电压的电路这里传感器阻值变小时下拉作用强输出电压就下降传感器阻值变大时下拉作用变弱输出端受上拉电阻的作用电压就会升高。这个固定电阻一般可选择和传感器阻值相近的电阻这样可以得到一个位于中间电压区域比较好的输出。传感器和固定电阻的位置也可以缓过来这样输出电压的极性就反过来了。第3个电路是一个简单的电压转换电路比如想要测一个05V的VIN电压但是ADC只能接收03.3V的电压就可以搭建这样的简易转换电路。在这里还是使用电阻进行分压上面阻值17K下面阻值33K加一起50K中间的电压就是0~3.3V就可以进入ADC转换了。如果采集的是5V、10V就可以采用这个电路1了。比这个还高就不能使用了高电压采集最好还是使用一些专用的采集芯片比如隔离放大器等等做好高低电压的隔离保证电路的安全。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2433527.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!