文章目录
- ADC模数转换器
- ADC简介
- 逐次逼近型ADC
- STM32的ADC
- ADC基本结构
- 输入通道
- 转换模式
- 单次转换,非扫描模式
- 连续转换,非扫描模式
- 单次转换,扫描模式
- 连续转换,扫描模式
- 触发控制
- 数据对齐
- 转换时间
- 校准
- 硬件电路
- 电位器产生可调电压的电路
- 传感器输出电压的电路
- 电压转换电路
ADC模数转换器
ADC简介
有ADC也有DAC数字模拟转换器,使用DAC可以将数字变量转化为模拟电压,与PWM相比较,PWM也有DAC的功能,同时PWM只有完全导通和完全断开两种状态,没有功率损耗,在直流电机调速这种大功率的应用场景使用PWM来等效模拟量比DAC更好。DAC的应用主要在波形生成,比如信号发生器、音频解码芯片等。
AD转换需要花一小段时间,1us表示从AD转换开始到产生结果需要1us,对应AD转换的频率就是1MHz,是STM32ADC的最快转换频率。
两个内部信号源是内部温度传感器和内部参考电压,温度传感器可以测CPU温度,内部参考电压是1.2V左右的基准电压,不随外部供电电压变化而变化,如果芯片的供电不是标准3.3V,测量外部引脚的电压可能不对,这时可以读基准电压进行校准。
普通的AD转换流程是启动一次转换读一次值,再启动再读值,但STM32的ADC可以列一个组,一次性启动一个组,连续转换多个值,并且有两个组,一个用于常规使用的规则组,一个用于突发事件的注入组。
ADC一般可以用于测量光线强度、温度这些值,并且经常有需求,如果高于某个阈值或低于某个阈值执行一些操作,判断高于或低于可以用模拟看门狗来自动执行,模拟看门狗可以监测指定的某些通道,当高于或低于它设定的阈值时申请中断,就可以在中断函数里执行相应的操作,这样就不用不断手动读值再if判断了。
逐次逼近型ADC
地址锁存和译码的作用是,想选中哪一路就把通道号放在ADDA、ADDB、ADDC这三个脚上,然后给一个锁存信号,上面对应的通路开关就自动拨好了。
之后看电压比较器,它可以判断两个输入信号电压的大小关系,输出一个高低电平指示谁大谁小,两个输入端,一个是待测电压,另一个是DAC的电压输出端,DAC内部是使用加权电阻网络来实现的转换,当输入一个未知编码的电压,和一个DAC输出的已知编码的电压,两个同时输出到电压比较器进行大小判断,如果DAC输出的电压比较小,就增大DAC数据,直到DAC输出的电压和外部通道输入的电压近似相等,这样DAC输入的数据就是外部电压的编码数据了。电压调节的过程就是逐次逼近SAR来完成的,通常用二分法进行寻找电压,比如这里八位DAC,编码0-255,第一次比较给255的一半128,如果DAC电压大了,第二次比较给128的一半64…,对于8位ADC,依次判断8次就能找到未知电压的编码,对于12位的ADC判断12次。这就是逐次逼近的过程。
EOC是End of Convert转换结束信号,START是开始转换,给一个输入脉冲开始转换CLOCK是ADC时钟,因为ADC内部是一步一步进行判断的,需要时钟进行推动,VREF+和VREF-s是DAC的参考电压,DAC的参考电压也决定了ADC的输入范围,所以也是ADC参考电压
STM32的ADC
规则通道组最多选16个通道,但是规则通道取出结果时前15个数据会被覆盖掉,依次只能留一个数据,需要配合DMA进行数据转运。注入通道最多选4个通道,而且有四个数据寄存器,不用担心数据覆盖
左下角是触发转换的部分,也就是START信号开始转换。对于STM32的ADC,触发转换的信号有两种,一种是软件触发,在程序中手动调用一条代码启动转换,另一种是硬件触发,就是左下角这些触发源,主要来自于定时器,有定时器的各个通道还有TRGO定时器主模式的输出,定时器可以通向ADC、DAC这些外设用于触发转换,因为ADC经常需要过一个固定时间段转换一次,比如每隔1ms转换一次,如果正常用定时器每隔1ms申请一次中断会频繁进中断对程序有影响,像这种需要频繁进中断,并且在中断只完成了简单工作的情况,用硬件进行支持,比如这里给TIM3定1ms时间,并且把TIM3的更新事件选择为TRGO输出,然后在ADC选择开始触发信号为TIM3的TRGO(Trigger Output),这样TIM3的更新事件就能通过硬件自动触发ADC转换,这就是定时器触发的作用。
V R E F + V_{REF+} VREF+和 V R E F − V_{REF-} VREF−是ADC的参考电压,决定了ADC输入电压的范围,下面VDDA和VSSA是ADC的供电引脚,一般情况下 V R E F + V_{REF+} VREF+接VDDA,但我们学的这款芯片没有,在内部已经和VDDA连接在一起了,VDDA接3.3V 、VSSA接GND,所以ADC的输入电压范围就是0-3.3V。
右边的ADCCLK是ADC的时钟,也就是上面的CLOCK,用于驱动内部逐次比较的时钟,来源于以ADC预分频器,来源与APB2时钟。
模拟看门狗里面可以存一个阈值高限和阈值低限,如果启动了模拟看门狗,并且指定了看门的通道,那这个看门狗就会关注它看门的通道,一旦超过阈值范围就是申请看门狗的中断,最后通向NVIC。对于规则组和注入组而言,转换完成后,也会有一个EOC转换完成的信号,EOC是规则组的完成信号,JEOC是注入组完成的信号,这两个信号会在状态寄存器里置一个标志位,读取标志位就能知道是不是转换结束了,同时这两个标志位也可以去NVIC申请中断,如果开启了NVIC对应的通道,它们就会触发中断
ADC基本结构
输入通道
ADC12_IN0的意思是ADC1和ADC2和IN0都是在PA0上,下面全是ADC12说明ADC1和ADC2的引脚全都是相同的,作用是双ADC模式,ADC1和ADC2一起工作,他俩可以配合组成同步模式、交叉模式等,交叉模式就是ADC1和ADC2交叉对一个通道进行采样,进一步提高采样率,ADC1和ADC2也可以分开使用,分别对不同的引脚进行采样
转换模式
单次转换,非扫描模式
非扫描模式下只有序列一的通道有效,触发转换ADC就会对通道2进行模数转换,过一小段时间转换完成,结构放在数据寄存器,同时给EOC标志位置置1,判断EOC标志位来决定什么时候读数据寄存器。如果想要再一次转换,就需要再触发一次,如果想换一个通道转换,转换之前把第一个位置的通道2改成其他通道,然后再启动转换
连续转换,非扫描模式
非扫描模式还是只用序列1,但连续转换,转换结束后不会停止,而是立刻开启下一轮转换,一直持续下去,这样只需要一开始触发一次,之后就可以一直转换了。这个模式的好处是开始转换之后不需要等待一段时间,因为一直在转换,想要读AD值的时候直接从数据寄存器读就是了。
单次转换,扫描模式
单次转换,没触发一次,转换结束后停下来。扫描模式会用到“菜单列表”,可以在菜单里点菜,第一个菜是通道2,第二个菜是通道5…初始化结构体力多了一个通道数目参数,告诉主机用到了几个序列,比如指定通道数目为7,就只看前7个位置,每次触发后依次对前7个位置进行AD转换,转换结果都放在数据寄存器里,为了防止数据被覆盖需要用DMA及时将数据挪走。7个通道转换完成之后产生EOC信号转换结束,然后再触发下次,开始新一轮转换。
连续转换,扫描模式
一次转换后立刻开始下一次的转换。另外注意扫描模式的情况下还有一种模式是间断模式,它的作用是在扫描的过程中每隔几个转换就暂停一次,需要再次触发才能继续
触发控制
具体是引脚还是定时器,需要用AFIO重映射来确定。软件控制位是我们之前说的软件触发,这些触发信号可以通过设置右边寄存器来选择
数据对齐
数据右对齐,高位补0,数据左对齐,低位补0。一般用数据右对齐,因为右对齐直接读出寄存器的值就是转换结果,如果选择左对齐,直接读得到的数据会比实际的大,因为数据左对齐实际上是把数据左移了四次,相当于把结果乘以16。左对齐的作用是如果不想要很高的分辨率,可以选择左对齐,再把数据的高8位取出,这样就舍去了后四位的精度,12位的ADC退化为8位ADC。
转换时间
为什么需要采样和保持?
AD转换就是后面的量化编码,需要一小段时间,如果这一小段时间里输入的电压还在不断变化,就无法定位输入电压到底在哪,所以在量化编码之前设置一个采样开关,先打开采样开关收集外部的电压,比如可以用一个小容量的电容存储一下电压,存储好之后断开采样开关再进行后面的AD转换。这样在量化编码的期间,电压始终保持不变,这样才能精确定位未知电压的位置,这就是采样保持电路,采样保持的过程中需要闭合采样开关,过一段时间再断开。
采样时间是采样保持花费的时间,可以在程序中配置,采样时间越大越能避免毛刺信号的干扰,不过转换时间也会相应延长,12.5个ADC周期是量化编码花费的时间,因为是12位ADC,所以花费12个周期,ADC周期就是从RCC分频过来的ADCCLK,最大是14MHz,下面是最快1us时间计算来源。
校准
校准过程是固定的,只需要在ADC初始化的最后加几条代码就行了。
硬件电路
电位器产生可调电压的电路
电位器产生一个可调的电压,电位器两个固定端一个接3.3V一个接GND,中间滑动端电压在这之间,一般接KΩ级的电阻,比如这里10k的电阻,这就是电位器产生可调电压的电路。
传感器输出电压的电路
中间是传感器输出电压的电路,一般像光敏电阻、热敏电阻、红外接收器、麦克风等,都可等效为一个可变电阻,电阻阻值没法直接测量,通过和一个固定电阻串联分压来得到一个反应电阻值电压的电路,传感器阻值变小,下拉作用变强,输出端电压就下降…固定电阻一般选和传感器阻值相近的电阻,这样可以得到一个位于中间电压区域比较好的输出。
电压转换电路
使用电阻进行分压,上面阻值17K,下面33K,加一起50K,根据分压公式,中间电压是VIN/50K*33K,最后得到的电压范围就是0-3.3V,就可以进入ADC转换了,如果电压再高不建议使用这个电路,高电压采集最好使用专门的采集芯片,比如隔离放大器等等,做好高低电压的隔离,保证电路安全