ADC全称Analog Digital Convertor,中文名称是模拟数字转换器。ADC的主要功能是将外界的模拟形式的连续信号转换成易于数字处理的,数字形式的离散信号。目前ADC主要是将外界输入的模拟电压信号经过采样保持和内部量化形成数字信号。
YTM32B1Lx系列芯片内置12bit采样率1MSPS的ADC,在YTM32B1Mx系列芯片,内置ADC采样频率最高可以到2MSPS,采样精度同样为12bit,可以满足汽车上大部分的模拟信号转换需求。L和M系列中的ADC主要是采样速率上有一定差异,在使用方式上基本是一致的,所以后续都统一介绍。
YTM MCU内部ADC采用逐次逼近结构的ADC, Successive-approximation register ADC(SAR ADC), 这种结构的ADC总体面积比较小,功耗比较低,非常适合MCU中的应用场合,典型的SAR ADC结构如下:
ADC SAR框图 From White Flye
在图中:
SAR ADC是通过内部DAC重建一个逐次逼近于采样保持电路的电压,经过比较器之后产生数字结果,由寄存器保存该结果,并生成下个周期需要的重建电压。经过多次比较之后,我们就得到了ADC的转换结果。
实际设计中,为了灵活适应各种应用,ADC的输入级一般会有一个MUX模块,用于实现多通道的时分复用。
YTM32 MCU ADC模块包含SAR ADC转换核心、ADC输入通道复用模块(Channel MUX)、转换控制数字逻辑几个部分。ADC模块的系统框图如下:
ADC模块框图
ADC的模拟通道复用模块相当于一个多选一的开关,开关选通之后,对应的外部通道和内部ADC转换核心连接,这个时候就可以对该通道进行转换。ADC有一部分外部通道是直接连到一些内部模块的输入。比如说内部的一些参考电压,温度传感器的电压输出等等。ADC可以通过这些通道,实现对芯片内部模块的一些监测。
SAR ADC的结构特性使得ADC完成采样之后,外部信号的输入就可以和ADC断开。这对于ADC的时间计算是比较重要的。比如当使用ADC做电机控制的电流采样的时候,我们只需要保证在ADC采样时间内信号是稳定的,而不用将转换时间考虑在内。实际上当ADC完成采样之后,即使外部信号出现波动或者出现噪声,对ADC的转换也是没有影响的。
ADC的数字控制逻辑,主要实现对ADC的转换控制和结果保存等相关操作。在ADC中我们内置了一个FIFO可以用于缓存ADC的转换结果。ADC转换结果的读取有中断、DMA和轮询等几种方式。ADC内部还有一个Watch Dog模块, 可以实现对某个或者所有通道电压的持续监测,当通道电压超出预定范围之后,ADC会产生一个特殊的中断上报系统。
另外这个ADC还支持通过降低转换精度提高采样率的方式。这个实际上也是SAR ADC的一个特性。YTM32 MCU中ADC支持12bit、10bit、8bit几种转换精度。
嵌入式应用中一般对ADC的转换时间比较敏感,因为涉及到软件的周期调度,如果ADC不能在给定的时间内转换结束,那么整个系统调度可能会出现问题。
决定ADC转换时间的主要因素有ADC的时钟选择、ADC的时钟分频以及ADC采样精度、采样时间等有关系。
从SAR ADC的结构框图可以看出,ADC需要依赖一个时钟基准,ADC模块支持通过IPC来选择转换的时钟和分频。而ADC内部还有额外的分频,所以ADC的实际工作频率为:
这里计算的时候分频均代表模块实际分频。
ADC每次转换所需要的时钟数量=ADC的转换精度+ADC采样时间+2,比如ADC转换精度为12,采样时间为2个时钟周期,那么总共需要的转换时间为 12 + 2 + 2 = 16 个时钟周期,假如ADC的实际工作频率为16MHz,那么一次转换所需要的时间就是1us,对应的采样速率就是1MSPS。
目前产品手册上标的都是在12bit模式下的最高转换速率,实际上针对应用对采样速率要求比较高,而采样精度要求不高的情况,可以通过降低采样精度方式提高采样率,比如采样精度降低为8,那么一次转换之需要12个时钟周期,这种情况下M系列ADC最高转换速率可以到2.67MSPS,L系列则为1.33MSPS。
注意,这里采样速率只适用于ADC连续转换模式,当ADC工作在单次转换或者单序列转换模式下,ADC的Trigger输入还需要3~5个时钟,ADC 开了auto off功能之后还需要一个Startup时间,所以这些情况下ADC的转换速率都是有一定的下降的。
YTM32 MCU中ADC主要有三种工作模式和两种触发方式:
typedef enum
{
ADC_CONV_STEP = 0x00U, /*!< One channel convert per trigger. */
ADC_CONV_LOOP = 0x01U, /*!< One loop convert per trigger. */
ADC_CONV_CONTINUOUS = 0x02U /*!< Continuous convert per trigger. */
} adc_sequence_mode_t;
ADC_CONV_STEP
: ADC每次触发转换一个通道,转换结果放在FIFO,并等待下次触发。转换的通道按照Sequence中设定的顺序依次转换。ADC_CONV_LOOP
:ADC每次触发转换一个Sequence(序列),序列的最高长度一般是8个通道,转换后将结果依次写入FIFO,并等待下一次触发。转换结果通过读取FIFO获得,数据的顺序和序列中配置好的顺序相同。这种模式是ADC最常用的一种工作方式,一般都是将需要采集的ADC通道配置到序列中,需要转换的时候通过硬件或者软件触发开始转换,转换结果通过中断或者DMA直接读取一个序列的结果。ADC_CONV_CONTINUOUS
:连续转换模式,ADC在触发之后,按照Sequence连续转换,Sequence转换结束之后会自动重新开始。当ADC连续转换时候要注意及时从FIFO中将结果读走,当开启WAIT模式之后,如果数据没有及时读走,ADC会等待结果读取再继续转换。ADC的两种触发方式指的是硬件触发和软件触发:
ADC_CONV_STEP
模式使用,可以精确控制ADC每个通道的转换点。注意:配置ADC硬件触发模式的时候,需要先配置好ADC的工作模式并开启ADC之后再配置硬件触发(TMU或PTU)。
ADC的转换时只会按照Sequence中配置好的顺序进行转换,结果读取也必须按照sequence读取,不支持单独开启序列中的某一个通道,或者单独读取序列中某一个通道的转换结果。
为了更好的使用芯片内部的ADC模块,应用软件操作ADC时应该注意以下事项:
全部0条评论
快来发表一下你的评论吧 !