【ADC】模拟-数字转换器

一、ADC简介
  • ADC Analog-Digital Converter )模拟 - 数字转换器
  • ADC 可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
  • 12 位逐次逼近型 ADC(分辨率)(12位AD值表示范围=0~2^12-1=0~4095)
  • 1us 转换时间(AD转换需要一小段时间,1us表示从AD转换开始到产生结果需要1us时间,对应的转换频率就是1MHz)
  • 输入电压范围: 0~3.3V ,转换结果范围: 0~4095
  • 18 个输入通道,可测量 16 个外部和 2 个内部信号源
  • 规则组和注入组两个转换单元
//STM32可以列一个组,一次性启动一个组,连续转换多个值
//规则组:用于常规使用
//注入组:用于突发事件
  • 模拟看门狗自动监测输入电压范围
//模拟看门狗可以监测指定的某些通道,当AD值高于设定的上限阈值或者低于设定的下限阈值时,模拟看门狗会申请中断,就可以在中断函数中执行相应的操作
//不用不断地手动读值再用if进行判断了
  • STM32F103C8T6 ADC 资源: ADC1 ADC2 10 个外部输入通道(最多只能测量10个外部引脚的模拟信号)

二、逐次逼近型ADC内部结构原理(ADC0809:8位逐次逼近型ADC芯片)
  • 左上IN0~IN7是8路输入通道,通过通道选择开关选中一路,输入到【比较器】进行转换
  • 左下是地址锁存和译码,需要选中哪个输入通道,就用ADDx表示通道号,再给一个锁存信号ALE,就完成了通道选择的配置
//ADC0809是八位输入,所以用三位ADDA/B/C=2^3=8来表示
  • 如何知道输入信号电压对应的编码数据是多少呢?————用逐次逼近方法一一比较得到
//图中的三角形是【电压比较器】,它可以判断两个输入信号电压的大小关系,输出一个高低电平指示谁大谁小
//【电压比较器】的两个输入端:1)待测电压(外部通道输入,未知编码)
                                                  2)DAC(数模转换器)输出端的电压(DAC输出,已知编码)
  • 两个电压同时输入到电压比较器,进行大小判断
//如果DAC输出的电压>待测电压,则调小DAC数据
//如果DAC输出的电压<待测电压,则调大DAC数据
————最终DAC输出的电压和外部通道输入的待测电压近似相等,就可以得到外部电压的编码数据=DAC输入的数据
  • 电压调节过程(大小判断)由【逐次逼近寄存器SAR】完成
//为了最快找到未知电压的编码,通常使用【二分法】进行寻找(不断二分比较,选择合适的一半范围再比较)
//比如ADC0809是8位的ADC,编码范围就是0~255
EX:
//给DAC输入255的一半(128)并与待测电压进行比较
//如果DAC输出的电压>待测电压,则调小DAC数据,给DAC输入128的一半(64)并与待测电压进行比较
//如果DAC输出的电压<待测电压,则调大DAC数据,则给DAC输入128~255区间的一半(192)并与待测电压进行比较
//以此类推
  • AD转换结束后,【逐次逼近寄存器SAR】的输出数据就是【DAC】的输入数据,也就是待测电压的编码
  • 待测电压的编码通过【8位三态锁存缓冲器】输出
  • 最上面【EOC (End Of Convert)】就是转换结束信号
  • START是开始转换,给一个输入脉冲开始转换
  • CLOCK是ADC时钟,因为ADC内部是一步一步进行判断的,所以需要时钟来推动这个过程
  • 最下面【VERF+】和【VERF-】是DAC的参考电压
//比如给一个数据255,那么是对应5V还是3.3V呢?————由这个参考电压决定
//DAC的参考电压也决定了ADC的输入范围,所以它也是ADC参考电压
  • 左下是整个芯片电路的供电【VCC】和【GND】
//通常参考电压的正极和VCC是一样的(参考电压的负极和GND是一样的),会接在一起
//因此ADC输入电压的范围和ADC的供电是一样的

三、STM32的ADC框图
  • 总共18个输入通道,向右经过【模拟多路开关】(梯形),可以指定想要选择的通道
  • 进入【模拟至数字转换器】(执行逐次逼近过程),转换结果向上输出存放到【注入/规则通道数据寄存器】
  • 读取【注入/规则通道数据寄存器】就能知道ADC转换的结果
//普通的ADC【多路开关】只选中一个通道——开始转换——等待转换完成——取出结果
  • STM32中的ADC使用【模拟多路开关】可以同时选中多个通道,而且在转换时分成了两组(规则通道组、注入通道组)
  • 【规则组】一次性最多可以选中16个通道,规则组只有一个数据寄存器,只能存放一个数据,如果不想之前的数据被覆盖,那么在转换完成之后就要尽快把数据拿走(配合DMA使用)
//一般情况下使用【规则组】就完全足够
  • 【注入组】一次性最多可以选中4个通道,注入组有四个数据寄存器,可以同时存放四个数据,数据不会被覆盖
  • 【规则组】和【注入组】在转换完成之后会有一个转换完成的信号
//【EOC】是【规则组】的完成信号,【JECO】是【注入组】的完成信号
//这两个信号会在状态寄存器里置一个标志位,读取这个标志位就能知道转换是否结束
//同时这两个标志位也可以去到NVIC申请中断
//如果开启NVIC对应的通道,它们三个就会触发中断
  • 左下角的两个模块是【触发转换】(ADC的START开始转换信号)部分
  • 对于STM32的ADC触发ADC开始转换的信号有两种
1)软件触发:在程序中手动调用代码启动转换
2)硬件触发:由来自定时器的触发源进行触发
  • ADC经常需要过一个固定时间段转换一次,用定时器每隔一段时间申请一次中断,在中断里手动开始一次转换
//频繁进中断对程序有不良影响
  • 解决方法:比如给TIM3定个1ms的时间,并且把TIM3的更新事件选择为TRGO输出,在ADC【硬件触发】这里选择开始触发信号为TIM3_TRGO,这样TIM3的更新事件就能通过硬件自动触发ADC转换了,整个过程不需要进中断
  • 左上角有【VREF+】、【VREF-】、【VDDA】、【VSSA】
  • 【VREF+】、【VREF-】是ADC的参考电压,决定了ADC输入电压的范围
  • 【VDDA】、【VSSA】是ADC的供电引脚
//一般情况下【VREF+】要接【VDDA】,【VREF-】要接【VSSA】
  • 【模拟至数字转换器】右边是【ADCCLK】是ADC的时钟(ADC中的时钟CLOCK),用于驱动内部逐次比较的时钟
  • 【ADCCLK】来自ADC预分频器,ADC预分频器来源于RCC
//在RCC时钟树中可以知道:APB2时钟72MHz通过ADC预分频器进行分频,得到ADCCLK
//规定ADCCLK最大14MHz,但是ADC预分频器对72MHz只能进行2,4,6,8分频,用2或4分频后得到的频率超出允许范围
//所以对于ADC预分频器只能选择6分频(结果为12MHz)或者8分频(结果为9MHz)
  • 在数据寄存器上面就是【模拟看门狗】
  • 【模拟看门狗】可以存一个阈值高限和阈值低限,如果启动了模拟看门狗,并指定了看门的通道,看门狗就会关注它看门的通道,一旦超过这个阈值范围,看门狗就会乱叫,产生一个模拟看门狗事件,在上面申请一个中断,最后通向NVIC
流程图

四、输入通道(ADC通道和引脚复用的关系)

五、规则组转换模式
  • 单次转换,非扫描模式
单次转换:每触发一次,转换结束后就会停下来,下次转换就得再触发才能开始
非扫描模式:只有第一个序列1的位置有效,可以在序列1的位置指定需要转换的通道
菜单从【同时选中一组】的方式————退化为【简单地选中一个】的方式
  • 触发转换,ADC就会对通道2进行模数转换
  • 转换完成,转换结果放在【数据寄存器】里,同时给【EOC】标志位置1
  • 判断【EOC】标志位,如果转换完了就可以在【数据寄存器】里读取结果了
  • 如果要再启动一次转换,就需要再触发一次
  • 连续转换,非扫描模式
连续转换:在一次转换结束后不会停止,而是立刻开始下一轮转换,并一直持续下去
//只需要最开始触发一次,之后就可以一直转换了
非扫描模式:只有第一个序列1的位置有效,可以在序列1的位置指定需要转换的通道
  • 开始转换之后不需要等待一段时间,因为其一直在转换,不需要手动开始转换
  • 不用判断是否转换结束,需要读取时直接从【数据寄存器】取就行了
  • 单次转换,扫描模式
单次转换:每触发一次,转换结束后就会停下来,下次转换就得再触发才能开始
扫描模式:每个序列的位置都有效,可以任意指定每个的序列的通道,并且可以重复指定
//通道数目:16个通道可以不用完,用几个就给通道数目参数写几个
  • EX:
每次触发之后,依次对前7个位置进行AD转换,转换结果放在数据寄存器里
//为了防止数据被覆盖,需要用DMA及时将数据挪走
7个通道转换完成后产生【EOC】信号,转换结束
再触发下一次,就会开始新一轮的转换
  • 连续转换,扫描模式
连续转换:在一次转换结束后不会停止,而是立刻开始下一轮转换,并一直持续下去
//只需要最开始触发一次,之后就可以一直转换了
扫描模式:每个序列的位置都有效,可以任意指定每个的序列的通道,并且可以重复指定

六、触发控制
  • 图表为规则组的触发源

七、数据对齐
ADC是12位的,经过AD转换之后的结构就是12位的数据,但【数据寄存器】是16位的,因此存在【数据对齐】的问题
  • 数据右对齐:
12位的数据向右靠,高位多出来的几位补0
//一般使用【数据右对齐】
  • 数据左对齐:
12位的数据向左靠,低位多出来的几位补0

八、转换时间
  • AD 转换的步骤:采样,保持,量化,编码
  • STM32 ADC 的总转换时间为: TCONV = 采样时间 + 12.5个ADC周期
EX:当 ADCCLK=14MHz ,采样时间为 1.5 ADC 周期
T CONV = 1.5 + 12.5 = 14 ADC 周期 = 1μs
时间为( 1/14Mhz ) * 14个ADC周期 = 1 μs
EX:当ADC分频器为6分频,ADCCLK=72MHz/6=12MHz,采样时间为55.5个ADC周期
T CONV = 55.5 + 12.5 = 68 ADC 周期 = 5.6μs
时间为( 1/12Mhz ) * 68个ADC周期 = 5.6 μs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值