本章为大家带来模数转换器(ADC)的使用教学,按照惯例,我们先来说一下模数转换器本身。
首先是功能,模数转换器接收电压信号并输出一个数字信号,该数字信号是一个数字,这个数字指示了电压信号的大小。通常来说,想要判断大小就需要有对比,因此该数字指示的电压大小实际上是一个比较的结果。ADC将需要测量的电压信号Ut与已知电压的信号U作比较,并最终输出一个数字表示Ut相当于多少比例的U。
接下来就可以看看CW32的ADC外设结构框图了,图中按块划分了ADC外设的不同功能区。
ADC会将左侧红框中某一指定通道(由程序指定)所连接的电信号与下方红框中选定的参考电压(由程序选定)进行比较,完成紫色方框中的步骤后,最终输出一个数字(暂记为value)并存放在右侧红框中的寄存器里面。Value的范围取决于ADC的位数,若ADC为12位,则value最大为2^12=4096,最小值为0,value指示了相比于参考电压U,输入电压Ut的值,计算方法如下:可以认为ADC将参考电压分成了4096份,最终输出的结果反映了输入电压够得上其中多少份,例如参考电压选择2.5V,最终转换的结果数据为2048,那么就认定输入通道的实际电压值是2.5/4096*2048=1.25V,其他情况以此类推。由于参考电压的存在,ADC无法直接测量比参考电压值高的信号,输入通道连接的电压不能高于参考电压。
现在来简单说说紫色方框内的部分,这一部分是ADC的核心部分,根据ADC转换原理的不同,这一部分的电路结构也不一样,CW32的ADC是逐次逼近型ADC,它会先把通道中的电压信号采样并被内部的采样保持放大器输出且保持稳定(这一步叫采样保持),随后ADC用逐次逼近的方法得到一个12位的数字(这一步叫量化编码),需要重点关心的是采样保持阶段的持续时间,这个时间越久,最终用于量化编码阶段的采样电压值就越精确,我们就能得到更精确的转换结果。
从上述步骤来看,使用ADC需要进行如下操作:
1. 必要的IO初始化和外设时钟初始化;
2. 正确设置ADC的采样通道和参考电压;
3. 选择合适的ADC采样时间;
4. 启动ADC并等待转换完成;
5. 读取转换结果寄存器得到电压值;
首先需要说明的是IO初始化的问题。对于使用ADC功能的IO,它本质上并不是“将这个IO复用为ADC功能”,而是把这个IO设置为模拟输入,也就是不将IO上的电信号量化成数字信号,这一点在GPIO电路结构图里面可以看到。
这个模拟功能从结果上来看就是ADC复用,不过还是请大家理解其本质。
下一个要说的是采样通道。ADC一般都会有多个采样通道,开发者从中挑选一些通道接入电路来使用。ADC外设同一时间只能对某一个通道上的电压进行转换,所以如果需要采样四个通道的电压,只能顺序转换,这个转换顺序是可以手动设置的。ADC拥有4个可填入的配置项,暂且称为序列0~3,ADC会根据另外一个配置项(ADC_SQR寄存器的ENS位段)来判断该转换这4个序列中的哪些,序列里面需要填写的内容就是AD采样的通道号,配置完成之后ADC就会按照这4个序列内填的通道号按顺序进行AD转换。更具体的配置方法直接参考ADC_SQR寄存器描述即可
图中有一些前文没说到的配置项,因为这些配置项是一些ADC附带的特殊功能。具体的功能在手册ADC章节的寄存器描述中有详细说明,代码中的注释也已经详细标注。
该配置中,ADC被配置为单通道单次转换模式,也就是说ADC一次转换只能转换一个ADC通道,并且转换完成之后就会停下来等待CPU发出下一次转换开始的指令(相对的,还有连续模式和扫描模式)。
配置完成后,再编写一个启动ADC的函数就行了,该函数需要包含启动、等待转换完成、返回数据的功能,如图所示:
上图的具体步骤对应了手册中描述的步骤,详细说明见用户手册22.5.1章节。
ADC一般用法的介绍到此就结束了,但ADC还有很多其他功能,比如连续模式、扫描模式、硬件触发采集和DMA访问,这些模式可以帮助我们更好地使用ADC功能,后续的章节会介绍一种不消耗CPU资源的ADC采集方法,真正实现全自动采集。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !