YTM32B1x系列MCU中ADC的使用

描述

ADC全称Analog Digital Convertor,中文名称是模拟数字转换器。ADC的主要功能是将外界的模拟形式的连续信号转换成易于数字处理的,数字形式的离散信号。目前ADC主要是将外界输入的模拟电压信号经过采样保持和内部量化形成数字信号。

YTM32B1Lx系列芯片内置12bit采样率1MSPS的ADC,在YTM32B1Mx系列芯片,内置ADC采样频率最高可以到2MSPS,采样精度同样为12bit,可以满足汽车上大部分的模拟信号转换需求。L和M系列中的ADC主要是采样速率上有一定差异,在使用方式上基本是一致的,所以后续都统一介绍。

SAR ADC的基本原理

YTM MCU内部ADC采用逐次逼近结构的ADC, Successive-approximation register ADC(SAR ADC), 这种结构的ADC总体面积比较小,功耗比较低,非常适合MCU中的应用场合,典型的SAR ADC结构如下:

adc
ADC SAR框图 From White Flye

在图中:

  • DAC (digital-to-analog converter):数字模拟转换器
  • EOC (end of conversion):结束转换
  • SAR (successive approximation register):连续逼近寄存器,用于存放转换的中间结果和最终结果
  • S/H (sample and hold circuit):采样保持电路
  • Comparator :电压比较器,对数字模拟转换器输出的电压与输入电压进行比较
  • VIN :输入电压
  • VREF :参考电压

SAR ADC是通过内部DAC重建一个逐次逼近于采样保持电路的电压,经过比较器之后产生数字结果,由寄存器保存该结果,并生成下个周期需要的重建电压。经过多次比较之后,我们就得到了ADC的转换结果。

实际设计中,为了灵活适应各种应用,ADC的输入级一般会有一个MUX模块,用于实现多通道的时分复用。

ADC模块框图

YTM32 MCU ADC模块包含SAR ADC转换核心、ADC输入通道复用模块(Channel MUX)、转换控制数字逻辑几个部分。ADC模块的系统框图如下:

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的时钟分频以及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的转换速率都是有一定的下降的。

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在某些事件发生的时候开始ADC转换,事件来源可以是PTU和TMU,比如电机控制中,eTMR可以通过TMU模块触发ADC采样。PTU和TMU的触发选择位于CIM模块。
    • PTU触发,仅部分模块支持,PTU可以将一次触发事件分解成多个触发,一般配合ADC_CONV_STEP模式使用,可以精确控制ADC每个通道的转换点。
    • TMU触发,常用的硬件触发方式,每次出发可以转换一个STEP(单个通道)或者一个LOOP(一个序列)。
  • 软件触发:通过写入ADC的START位来开始ADC的转换

注意:配置ADC硬件触发模式的时候,需要先配置好ADC的工作模式并开启ADC之后再配置硬件触发(TMU或PTU)。

ADC的转换时只会按照Sequence中配置好的顺序进行转换,结果读取也必须按照sequence读取,不支持单独开启序列中的某一个通道,或者单独读取序列中某一个通道的转换结果。

ADC使用注意事项

为了更好的使用芯片内部的ADC模块,应用软件操作ADC时应该注意以下事项:

  1. ADC模块本身由VDDA供电,但是ADC的参考电压默认是VREFH/VREFL(可以软件改动为VDDA),所以ADC正常工作的必要条件是VDDA和VREFH/VREFL供电正常,VREFH和VREFL都要正确连接。
  2. ADC工作在连续转换模式时,ADC输出结果要及时通过中断或者DMA读走,否则会出现ADC等待数据读取或者ADC转换结果被覆盖的情况。
  3. ADC的两级分频后的时钟不要超频,也就是ADC转换速率不能高于DS中规定的速率,否则ADC虽然可以继续出转换结果,但是结果会有很大的误差。
  4. ADC模块本身支持在低功耗模式下工作,但是如果应用仅需要ADC在RUN模式工作,则进入低功耗模式之前要关闭ADC,或者打开ADC的auto off功能,并在ADC完成当前转换后再进入低功耗模式。ADC在低功耗模式开启情况下,VDDA上会增加1~2mA的电流。
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分