赞
踩
电位器事实上就是滑动变阻器
STM32的ADC是12位的,所以AD结果最大值是4095,也就是2^12-1
使用ADC可以对高电平和低电平之间的任意电压进行量化,所以ADC其实就是一个电压表
*数字电路只有高低电平,没有几V电压的概念;ADC是模拟到数字,DAC、PWM是数字到模拟;同时PWM只有完全导通和完全断开两种状态,这两种状态都没有功率损耗,所以在直流电机调速这种大功率的应用场景,使用PWM来等效模拟量,是比DAC更好的选择;DAC则是在波形生成领域应用更多,比如信号发生器、音频解码芯片;STMF103C8T6也没有DAC的外设
*外部信号源就是16个GIO口,在引脚上直接接模拟信号,不需要额外的电路,引脚直接能测电压,2个内部信号源是内部温度传感器和内部参考电压,温度传感器可以测量CPU的温度,内部参考电压是一个1.2V左右的基准电压,这个基准电压是不随外部供电电压变化而变化的。如果芯片的供电不是标准的3.3V,那测量的外部引脚的电压可能就不对,这时可以读取这个基准电压进行校准,这样就可以得到正确的电压值了
*这个是STM32ADC的增强功能了,普通的AD转换流程是,启动一次转换、读一次值,然后再启动、再读值。而STM32的ADC可以列一个组,一次性启动一个组,连续转换多个值,规则组用于常规使用,注入组用于突发事件
*ADC一般用于测量光线强度、温度这些值,有些时候要求是,当光线强度或者温度高于或者低于某些阈值时执行某些判断,那么这个判断低于或者高于某阈值可以交给模拟看门狗来自动执行。模拟看门狗可以检测指定的某些通道,当AD值高于它设定的上阈值或者低于下阈值时,它就会申请中断,就可以在中断函数里执行相应的操作
ALE锁存信号,上面对应的通路开关就可以自动拨好了,左边部分相当于可以通过模拟信号的数据选择器
因为AD转化时间很短,只有几us,所以有多路信号时,只需要一个AD转换器,然后加一个多路选择开关,想转换哪一路,就先拨一下开关,选中对应通道,然后开始转换,这个AD0809只有8个输入通道,STM32内部ADC有18个输入通道
通过逐次逼近的方法,一一比较得到电压对应的编码数据
电压比较器,可以判断两个输入信号电压的大小关系,输出一个高低电平,指示谁大谁小,输入端一个是未知编码待测的电压,另一个是已知编码DAC的电压输出端(DAC内部是使用加权电阻网络来实现的转换)。如果DAC输出的电压比较大,就调小DAC数据,如果DAC输出电压比较小,就增大DAC数据,知道DAC输出电压和外部通道输入的电压近似相等,这样DAC输入的数据就是外部电压的编码数据。这个电压调节过程就是这个逐次逼近SAR来完成的,一般会使用二分法进行寻找未知编码的电压
EOC是End Of Convert,转换结束信号;START是开始转换,给一个输入脉冲,开始转换;CLOCK是ADC时钟,因为ADC内部是一步一步进行判断的,所以需要时钟来推动这个过程;VREF+和VREF-是DAC的参考电压,如一个数据是255,对应5V还是3.3V,由这个参考电压决定;DAC这个参考电压也决定了DAC的输入范围,所以它也是ADC参考电压;最左边是整个芯片电路的供电,VCC和GND,通常参考电压的正极和VCC、参考电压的负极和GND是一样的,会接在一起,所以一般情况下,ADC输入电压范围就和ADC供电是一样的
这里模拟至数字转换器就是执行上张图所说的逐次比较功能,结果会放在注入通道数据寄存器里
规则组虽然有16个通道,但只有一个规则通道数据寄存器,为了避免数据被覆盖,可以配合DMA(数据转运小帮手)来实现
注入组有四个注入通道数据寄存器,就不用担心数据被覆盖的问题了
左下角是触发转换的部分,也就是上张图的START的部分。对于STM32的ADC,开始转换的信号有两种,一种是软件触发,程序中手动调用一条代码,就可以启动转换了,另一种是硬件触发,就是这些触发源。上面一部分是注入组的触发源,下面这些是规则组的触发源,这些触发源最主要来自于定时器,有定时器的各个通道,还有TRGO定时器主模式的输出。之前介绍过,定时器可以通向ADC、DAC这些外设,用于触发转换
ADC经常需要过一个固定时间段转换一次,这里如果用定时器频繁进中断(可能因为优先级还得不到及时响应),会阻碍主程序的运行。这里可以给TIM3定一个1ms的时间,并且把TIM3的更新事件选择为TRGO输出,然后在ADC这里,选择触发信号为TIM3的TRGO,这样TIM3的更新事件就可以通过硬件自动触发ADC转换了,整个过程不需要进中断,节省了中断资源,这就是这里定时器触发的作用
还可以选择外部中断引脚来触发转换
VREF+和VREF-是ADC的参考电压,VDDA和VSSA是ADC的供电引脚,在现在所用的芯片上,没有VREF+和VREF-的引脚,在内部VREF+和VREF-就已经和VDDA和VSSA接在一起了
VDDA和VSSA是内部模拟部分的电源,比如ADC、RC振荡器、锁相环等
ADC预分频器来自于RCC(时钟树的那张图),只能选择6分频满足后面的ADCCLK,ADCCLK是相当于上张图的CLOCK
模拟看门狗里面可以存一个阈值高限和阈值低限,如果启动了模拟看门狗,并指定了看门通道,那么这个看门狗就会关注它看门的通道,一旦超过了这个阈值范围,它就会乱叫,就会在上面,申请一个模拟看门狗的中断,最后通向NVIC
对于规则组和注入组而言,转换完成了之后也会有一个EOC和JEOC的完成信号,这两个信号会在状态寄存器里置一个标志位
ADC1和ADC2的通道相同,涉及的功能是双ADC模式,ADC1和ADC2一起工作,可以配合组成同步模式、交叉模式等等,比如交叉模式,ADC1和ADC2交叉地对一个通道进行采样,这样可以提高采样率
现在所使用的芯片没有ADC3,也没有PC0~PC5
规则组的四种转换模式
是外部引脚还是定时器需要由外部引脚重映射来决定
这些触发信号怎么选择,可以通过设置右边寄存器/库函数给个参数来完成
目前的ADC是12位的,转换结果就是一个12位的数据,但数据寄存器是16位的,所以存在数据对齐的问题
一般使用的都是数据右对齐,这样读取16位的寄存器,直接就是转换结果
选择左对齐,直接读会得到比实际结果大16倍的数据,因为数居左对齐实际上就是把数据左移了4次,二进制的特点就是数据左移一次,就等效于把这个数据乘2
左对齐的作用是减少精度,比如不需要右对齐0~4095的分辨率,就用左对齐,只取高八位,舍弃了后面四位的精度,那么这样12位的ADC就退化成了8位的ADC
AD转换是需要一定时间的
量化编码:ADC逐次比较的过程,一般位数越多花得时间越长
采样保持:在量化编码前,先打开采样开关,收集一下外部的电压,比如用小容量的电容存储一下这个电压,存储好后断开采样开关,再进行后面AD转换。这样在后面量化编码期间的电压始终保持不变,这样才能精确定位未知电压的位置。这收集到断开需要一段时间,叫做采样时间。采样时间可以配置,采样时间越大,越能避免一些毛刺信号的干扰
ADC周期就是从RCC分频过来的ADCCLK(最大14MHz)
校准模式是固定的,只需要在ADC初始化的最后,加几条代码就行了
ADC的外围电路
第一个是电位器产生一个可调的电压,中间的滑动端可以输出一个0~3.3V可调的电压输出了,这里电阻的阻值不应该太小,至少要接K欧级别的电阻
中间是传感器输出电压的电路,一般光敏电阻、热敏电阻、红外接收管、麦克风等等都可以等效为一个可变电阻,电阻阻值无法直接测量,所以这里可以通过和一个固定电阻串联分压来得到一个反应电阻值的电路
最后一个是电压转换的电路,根据分压公式,中间的电压就是VIN/50K*33K,最后的电压范围就是0~3.3V就可以进行ADC转换了,这里使用的电压范围应该在5到10V左右,高电压采集最好使用一些专用的采集芯片,比如隔离放大器等,做好高低电压隔离保证电路安全
参考手册中,这节对应数字模拟转换
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。