STM32模拟-数字转换器ADC

ADC是什么

        ADC能将连续变化的模拟电压转化为数字变量,建立起了模拟电路到数字电路的桥梁。相对应的还有DAC,将数字变量转化为模拟电压,PWM就是这个功能的一个分支。

        简单来说STM32的ADC实际上就是一个电压表,把引脚的电压测量出来放到一个变量里。STM32的ADC是12位的,对应的最大数字为4095,也就是测量电压最大为3.3v。

STM32ADC的详细参数:

分辨率和转换频率

        STM32是12位逐次逼近型的ADC,需要1us的转化时间。12位表示分辨率,表示ADC的取值范围是0~(2^12-1),第二个参数1us是转换频率,表示需要1us的转换时间,对应频率为1MHz。

电压范围:

        输入电压范围为0~3.3V,这个输入电压一般要求在芯片供电的负极和正极之间变化。0V对应ADC为0,3.3V对应4095,中间都为线性关系。

通道:

        18个输入通道,STM32系列最多可测量16个外部信号源和2个内部信号源,内部信号源一个是温度传感器,一个是内部参考电压(1.2V),STM32F103C8T6有ADC1,ADC2两个ADC资源,只有10个外部输入通道。

ADC增强功能

        规则组和注入组两个转化单元,可以一次性转化多个值。

模拟看门狗自动监测输入电压范围

        这个ADC主要用于测量光线,温度,当高于低于某个阈值时候,执行一些操作,可以使用模拟看门狗自动执行,它可以监测某些指定的通道,当它的值高于或低于某个阈值时,它就会申请中断,执行响应的操作,不用程序手动读值进行if判断。

ADC工作原理(逐次逼近型)

        以ADC0809为例,选择通道通过地址锁存和译码进行,使用ADDA,ADDB,ADDC就能选择8个通道,对应上面的IN0~7这8个通道,再给一个ALE锁存信号,上面对应的通路开关就自动选择好了,通道就选择完成。选择哪个通道,哪个通道就连接到比较强的左上方。

        再通过电压比较器,与DAC(数字-模拟信号转换器)的电压输出端逐次比较电压信号,就能得到了模拟信号的电压值了。(DAC使用的是加权电阻网络来实现,感兴趣可以自行百度)。这个比较方法使用的是二分法比较,通过逐次逼近SAR来完成的,这里是8位ADC,编码就是从0~255,第一次比较与128进行比较,如果模拟信号电压小于DAC输出电压,第二次就与64进行比较,这样依次比较8次就能得到模拟信号的电压值。

        EOC是转化结束信号,START是开始信号,CLOCK是时钟信号,V_{REF(+)}V_{REF-)}是DAC的参考电压,也是ADC的参考电压,通常这两个与VCC与GND分别接在一起。

 STM32的ADC结构图

         如图中GPIO端口左侧为输入通道,STM32的ADC可以同时选择多路通道,在转换时,还分为了两个组,规则组和注入组。注入组可以选中四个通道,规则组可以选择16个通道。但是规则组通道只有1个寄存器,不能同时存放16个数据,如果使用规则组同时转换多个通道就需要配合DMA来实现。注入组的数据寄存器有四个,不用担心数据覆盖的问题。

        两种触发方式:软件触发,硬件触发。软件触发就是在程序中执行一条代码就可以触发。硬件触发如图中左下角的开始触发(注入组)和开始触发(规则组),它的触发源主要是来自左边TIM_定时器的各个通道和TRGO定时器主模式输出(定时器可以通向DAC/ADC用于触发转换)。由于ADC经常需要定时转换,正常思路是使用定时器,每隔一段时间申请一次中断。在中断里手动进行转换,由于需要经常进入中断程序,对程序有一定影响。针对这种频繁进入中断执行简单程序的情况,一般都会有硬件的支持。例如可以将TIM3定10ms的时间,并且将TIM3的更新事件选择为TRGO输出,在ADC这里选择开始触发信号为TIM3的TRGO信号,这样TIM3的更新信号就能通过硬件自动触发ADC转换,整个过程不需要进入中断,节省了中断资源。这里也可以采用外部中断引脚来触发中断。

       左边的V_{REF(+)}V_{REF(-)}为ADC的电压参考引脚,V_{DDA}V_{SSA}为ADC供电引脚。左边的V_{REF(+)}V_{REF(-)}通常分别接下面的V_{DDA}V_{SSA},在STM32中V_{DDA}V_{SSA}分别接3.3V和GND。

       如图DMA请求就是用于触发DMA转运的。

        如图模拟看门狗,里面可以存储阈值高限和阈值低限,如果启动了看门狗,这个看门狗就会关注它看门的通道,一旦超出阈值,就会在上面申请模拟看门狗中断最后通向NVIC。

        对与规则组和注入组,他们转化完成也会有一个EOC转化完成信号,EOC是规则组的完成信号,JEOC是注入组的完成信号。这两个信号会在状态寄存器里置一个标志位我们读取这个标志位就知道是否转换完成。同时这两个标志位也可以通向NVIC申请中断。

        如上图ADCCLK为ADC的时钟,供给它的是ADC预分频器,这个预分频器是来自RCC的APB2时钟,如下图时钟树中的红框部分,APB2的72MHz通过ADC预分频器得到ADCCLK时钟信号。注意这里的ADCCLK最大为14MHz,因此预分频器无法支持它的最大频率,因为ADC预分频器支持2、4、6、8分频,如果选择2分频,72MHz/2=36MHz,超出允许范围,4分频是18M,所以ADC预分频器只能选择6分频和8分频,也就是12MHz和9MHz。

        

 ADC基本结构:

 STM32的ADC引脚:

         如图ADC12表示ADC1和ADC2,对应的引脚如图所示,IN0为A0,IN1~IN7对应A1~A7,IN8为B0,IN9为B1。这个ADC1和ADC2可以组成双ADC模式,也就是ADC1和ADC2一起工作,可以配合成交叉模式、同步模式等等,交叉模式就是ADC1和ADC2交叉采样,可以提高ADC频率。

转换模式与扫描模式

        ADC可以配置为单次转换或连续转换,扫描模式或非扫描模式,这两种配合起来就有四种转换方式。

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

        非扫描模式就是只选择规则组里的1个通道进行ADC转换,转换完成将EOC置标志位。

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

        连续转换就是会一直转换下去,使用的时候不需要判断EOC的标志位,想要读AD值的时候,直接从寄存器取就可以。

3、单次转换,扫描模式

        可以选定多个通道进行转换,在结构体里选择几个通道,每次触发对选中的通道依次进行转换,为了防止数据被覆盖,就需要使用DMA及时将数据保存,所有通道都转换完成后产生EOC信号转换结束。

4、连续转换,扫描模式

        同理,也就是上个模式转换完成后继续进行转换。

触发控制

        如表64第七行,要区分是外部引脚/来自片上定时器的内部信号,需要用AFIO重映射来确定。这些触发可以通过设置右边寄存器的位置来完成。

数据对齐

        12位的ADC要存在16位的寄存器中,就要采用数据对齐,有两种方式,一种为数据右对齐,一种是数据左对齐。数据右对齐12位的数据向右靠,高位多出来的空位补0,数据左对齐同理。一般采用数据右对齐的方式,直接读取就是ADC数据,而数据左对齐直接读取读取到的数据是源数据的16倍。一般左对齐使用场景是在不需要很高的ADC分辨率的情况下,只读取前8位的数据,舍掉后4位的数据。

数据右对齐:

数据左对齐:

转换时间

步骤:采样,保持,量化,编码。

        采样保持是为了给后面量化编码提供稳定的电压,在量化编码之前,有一个采样开关,当这个开关打开时,小容量的电容就开始存储电压,存储好之后,断开采样开关,再进行后面的AD转换。这里就有一个采样时间。

        STM32 ADC的总转换时间为:T_{CONV} = 采样时间  + 12.5个ADC周期。

        采样时间可以再程序中配置,采样时间越大,越能避免毛刺信号的干扰,由于是12位ADC,那么就需要花费12个ADC周期,多出来的半个周期是ADC其他事情的时间。

        例如:最大当ADCCLK=14MHz,采样时间为1.5个ADC周期时:

        T_{CONV} = 1.5 + 12.5 = 14个ADC周期 = 1μs

        也可以将ADC的时钟频率设置为超14MHz,这样就是在超频运行,时间比1us还要短,只是无法保证稳定性。

校准

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

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

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

使用时只需要在ADC初始化最后加几条代码就可以了,不需要知道如何计算如何校准。

ADC采样电路

        第一个电路是电位器产生可调电压的电路,需要采用KΩ级的电阻,滑动电位器就可以产生3.3V~0V的电压了。

        第二个是串联电阻进行分压,N1为可变电阻,例如光敏电阻,热敏电阻等,这里一般串联一个与它电阻相等的电阻进行分压。这样这个电压就能反映这个电阻值。传感器阻值变小时,下拉作用变强,输出端电压下降,相反阻值变大时,输出端电压上升。

        第三个是如果想测量5V的电压时,采用这种方式进行分压,得到3.3V的电压就能进入ADC转换了。通常5V,10V可以采用这种方式,再高的高电压采集时,一般采用隔离放大器,做好高低电压隔离保证电路安全。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值