一、ADC 概述

1.1 特点

TMS320F2803x 的 ADC 模块是12位循环 ADC。 部分 SAR,部分流水线。其核心是 12 位的转换器,有两个采样保持器,可同时或顺序采样。通过多路复用后有 16 个模拟转换输入通道。转换器可以配置为与内部带隙基准一起运行,以创建基于真实电压的转换,或者与一对外部电压基准(VREFHI/LO)一起运行,以创建基于比率的转换。

ADC 模块的功能包括:

具有内置双采样保持(S / H)的 12 位 ADC 内核
同时采样或顺序采样模式
全范围模拟输入:0 V 至 3.3 V ,或 VREFHI / VREFLO 比例
多达 16 个通道,多路复用输入
16 个转换开始,可配置的触发源、采样窗和通道
16 个存放转换值的结果寄存器(单独寻址)
多个触发源:
—— S/W - 软件触发
—— ePWM 1-7 触发
—— GPIO XINT2 触发
—— CPU 定时器 0/1/2 触发
—— ADCINT 1/2 触发
9 个灵活的 PIE 中断,可在任何转换后配置中断请求


1.2 ADC框 图

二、SOC 操作原则


2.1 SOC 框图

与之前的 ADC 类型相反,此 ADC 不是基于排序器进行转换的,而是基于 SOC 进行转换的。SOC 设置单个通道转换单个信号的配置。在SOC设置有三种配置:开始转换的触发源配置,转换通道的配置,采样窗口的配置。每个 SOC 是独立配置的,可以配置成触发源、通道和采样窗口大小的任意组合。多个 SOC 可以根据需求配置成同一触发源、通道和/或采集窗口。

触发源通过 ADCSOCxCTL[TRIGSEL] 和 ADCINTSOCSEL1 或 ADCINTSOCSEL2 寄存器中的相应位组合来进行配置。

软件还可以通过 ADCSOCFRC1 寄存器强制执行SOC事件。

通过 ADCSOCxCTL 寄存器的 CHSEL 位 和 ACQPS 位可以配置通道和采样窗口大小

 

比如,要配置当 ePWM3 定时器达到其周期匹配时发生在通道 ADCINA1 上的单次转换,必须首先设置 ePWM3 以在周期匹配时输出SOCA或SOCB信号。在这种情况下,我们将使用SOCA。 然后,使用其 ADCSOCxCTL 寄存器设置 SOC 之一。无论选择哪个 SOC 都没有影响,我们选择 SOC0。 ADC允许的最快采样窗口为7个周期。为采样窗口选择最快的时间,为转换的通道选择 ADCINA1 通道,为SOC0 触发器选择 ePWM3,我们分别将 ACQPS 字段设置为 6,将 CHSEL 字段设置为 1,将 TRIGSEL 字段设置为 9。写入寄存器的结果值为:

ADCSOC0CTL = 4846h; // (ACQPS=6, CHSEL=1, TRIGSEL=9)

这样配置时,将在ePWM3 SOCA事件中启动ADCINA1的单次转换,并将结果值存储在ADCRESULT0寄存器中。

相反,如果ADCINA1需要外加过3倍的过采样,则可以为SOC1,SOC2和SOC3赋予与SOC0相同的配置。
 

ADCSOC1CTL = 4846h;    // (ACQPS=6, CHSEL=1, TRIGSEL=9)
ADCSOC2CTL = 4846h;    // (ACQPS=6, CHSEL=1, TRIGSEL=9)
ADCSOC3CTL = 4846h;	   // (ACQPS=6, CHSEL=1, TRIGSEL=9)

如此配置后,将在ePWM3 SOCA事件中串行启动ADCINA1的四次转换,并将结果值存储在ADCRESULT0 – ADCRESULT3寄存器中。

另一个应用程序可能需要从同一触发器中采样3个不同的信号。 这可以通过简单地更改 SOC0-SOC2 的 CHSEL 字段而使 TRIGSEL 字段保持不变来完成。
 

ADCSOC0CTL = 4846h;    // (ACQPS=6, CHSEL=1, TRIGSEL=9)
ADCSOC1CTL = 4886h;    // (ACQPS=6, CHSEL=2, TRIGSEL=9)
ADCSOC2CTL = 48C6h;	   // (ACQPS=6, CHSEL=3, TRIGSEL=9)  

通过这种方式配置后,将在ePWM3 SOCA事件中串行启动三个转换。 通道ADCINA1上的转换结果将显示在ADCRESULT0中。 通道ADCINA2上的转换结果将显示在ADCRESULT1中。 通道ADCINA3上的转换结果将显示在ADCRESULT2中。 转换的通道和触发器与转换结果的显示位置无关。 RESULT寄存器与SOC相关联。


2.2 ADC采集(采样和保持)窗口

       外部驱动器在快速有效地驱动模拟信号方面的能力各不相同。 一些电路需要更长的时间才能正确地将电荷转移到ADC的采样电容器中。 为了解决这个问题,ADC支持控制每个单独的SOC配置的采样窗口长度。 每个 ADCSOCxCTL 寄存器都有一个 6 位字段 ACQPS,用于确定采样和保持(S / H)窗口的大小。 写入该字段的值比该SOC的采样窗口所需的周期数少一个。 因此,该字段中的值15将给出16个时钟周期的采样时间。 允许的最小采样周期数为7(ACQPS = 6)。 通过将采样窗口大小与ADC的转换时间(13个ADC时钟)相加,可以得出总采样时间。 下面的中显示了各种采样时间的示例。


                                              具有不同 ACQPS 值的采样时间

 2.3 触发操作

可以将每个 SOC 配置为从许多输入触发器之一启动。如果需要,可为同一通道配置多个 SOC。以下是可用输入触发器的列表:

  • 软件
  • CPU 定时器 0/1/2 中断
  • XINT2 SOC
  • ePWM 1-8 SOCA 和 SOCB

ADC开始转换控制寄存器 【ADCSOCxCTL,x为0~15】:

 

 ADC中断触发SOC选择1寄存器【ADCINTSOCSEL1】:

 ADC中断触发SOC选择2寄存器【ADCINTSOCSEL2】:其描述与上面一样,但其控制的是 SOC8 到 SOC15.

 2.4 通道选择

可以将每个 SOC 配置为转换任何可用的 ADCIN 输入通道。将 SOC 配置为顺序采样模式时,ADCSOCxCTL 寄存器的四位 CHSEL 字段定义要转换的通道。 将 SOC 配置为同时采样模式时,CHSEL字段的最高有效位将被丢弃,而较低的三位将确定要转换的通道对。

ADCINA0与VREFHI共享,因此在使用外部基准电压模式时,不能将其用作可变输入源。

ADCSOCxCTL[CHSEL]:

 三、ONESHOT 单次转换支持

此模式将允许您在轮询组中对下一个触发的 SOC 执行一次转换。 ONESHOT 模式仅对轮询组中存在的通道有效。 在循环方案中未配置为触发 SOC 的通道将根据 ADCSOCPRIORITYCTL 寄存器中 SOCPRIORITY 字段的内容获得优先级。

                             
                                             ONESHOT 单次转换

 

ONESHOT 模式对顺序模式和同时模式的影响将在下面说明。

顺序模式:仅允许在 RR 模式下的下一个活动 SOC(从当前RR指针向上一个)生成SOC; 其他 SOC插槽的所有其他触发器将被忽略。

同时模式:如果当前 RR 指针具有同时启用的 SOC。 有效SOC将从当前RR指针增加2。 这是因为同时模式将为SOCx和SOCx + 1创建结果,而SOCx + 1永远不会被用户触发。

注意:由于上述实现原因,ONESHOT = 1 且 SOCPRIORITY = 10h 不是有效的组合。 在任何情况下,这都不应该是用户期望的操作模式。 上面的限制是下一个SOC必须最终被触发,否则ADC将不会为其他乱序触发生成新的SOC。 任何非正交通道都应置于优先模式,不受ONESHOT模式影响。

SOC 优先级控制寄存器【SOCPRICTL】:

 四、ADC 转换优先级

        当同时设置多个 SOC 标志时,两种优先级形式之一决定了它们的转换顺序。 默认优先级方法是罗宾环(Round Robin)。 在此方案中,没有SOC具有固有的更高优先级。 优先级取决于循环指针(RRPOINTER)。 反映在 SOCPRICTL寄存器中的 RRPOINTER 指向最后转换的SOC。 最高优先级 SOC 被赋予大于 RRPOINTER 值的下一个值,并在 SOC15 之后回绕到 SOC0。 复位时该值为16,因为 0 表示已经发生转换。 当 RRPOINTER 等于16 时,最高优先级被赋予 SOC0。 当 ADCCTL1.RESET 位置 1 或写 SOCPRICTL 寄存器时,RRPOINTER 通过器件复位复位。

罗宾环优先级例子:

SOCPRICTL 寄存器中的 SOCPRIORITY 字段可用于从单个 SOC 向所有 SOC 分配高优先级。当配置为高优先级时,SOC 将在任何当前转换完成后中断罗宾环,并作为下一个转换插入。转换完成后,循环轮将继续其中断的位置。如果同时触发两个高优先级SOC,则编号较低的SOC将优先。

 

五、同时采样模式 Simultaneous Sampling Mode 

        在某些应用中,保持两个信号采样之间的延迟最小是很重要的。 ADC 包含双采样和保持电路,以允许同时采样两个不同的通道。 通过 ADCSAMPLEMODE 寄存器为一对 SOCx 配置了同步采样模式。 偶数号的 SOCx 和随后的奇数号的 SOCx(如 SOC0 和 SOC1)通过一个使能位(SOC0 和 SOC1 为SIMULEN0)耦合在一起。 耦合行为如下:

  • SOCx 的任何一个触发器都将启动一对转换。
  • 转换的通道对将由与触发的 SOCx 的 CHSEL 字段的值相对应的 A 通道和 B 通道组成。 该模式下的有效值为 0 - 7。
  • 两个通道将同时采样。
  • A 通道将始终首先转换。
  • 偶数 EOCx 脉冲将基于 A 通道转换生成,奇数 EOCx 脉冲将基于B通道转换生成。 
  • A 通道转换的结果放在偶数 ADCRESULTx 寄存器中,而 B 通道转换的结果写到奇数 ADCRESULTx 寄存器中。

 

比如,如果 ADCSAMPLEMODE.SIMULEN0 位置 1,并且SOC0的配置如下:

  • CHSEL = 2 (ADCINA2/ADCINB2 pair)
  • TRIGSEL = 5 (ADCTRIG5 = ePWM1.ADCSOCA)

当 ePWM1 发出 ADCSOCA 触发信号时,将同时采样 ADCINA2 和 ADCINB2(假定优先级)。 之后,将立即转换 ADCINA2 通道,并将其值存储在 ADCRESULT0 寄存器中。通过 ADCCTL1.INTPULSEPOS 可设置当 ADCINA2 的转换开始或完成时,将发生 EOC0 脉冲。 然后,将转换 ADCINB2 通道并将其值存储在 ADCRESULT1 寄存器中。 通过 ADCCTL1.INTPULSEPOS 可设置,当 ADCINB2 的转换开始或完成时,将发生 EOC1 脉冲。

同步采样模式的时序示例 / Late Interrupt Pulse :
 

同步采样模式的时序示例 / Early Interrupt Pulse:

 

六、EOC 和中断操作 

就像有 16 个独立的 SOCx 配置集一样,EOCx 脉冲也有 16 个。

在顺序采样模式下,EOCx 直接与 SOCx 相关联。 在同时采样模式下,偶数号和随后的奇数号的 EOCx 对与偶数号和随后的奇数号的 SOCx 对相关联。 根据 ADCCTL1.INTPULSEPOS 的设置,EOCx 脉冲将在转换开始或结束时发生。 

ADC 包含 9 个可标记为 和/或 的中断传递到PIE。 这些中断中的每一个可以配置为接受任何可用的 EOCx 信号作为其信号中断源。 可操作 INTSELxNy 寄存器中完成了以 EOCx 作为中断源的配置。 此外,可以将 ADCINT1 和 ADCINT2 信号配置为生成 SOCx 触发信号。 这有利于创建连续的转化流。

七、ADC 上电顺序 

ADC 复位后是关闭状态。在对 ADC 的任何寄存器进行写操作前,必须将 ADCENCLK.PCKCR0 置位,使能时钟。

ADC 的启动顺序为:

  • 如果使用外部参考源,需操作 ADCCTL1 寄存器的 ADCREFSEL 位进行使能
  • 在ADCCTL1寄存器(5-7 位 ADCPWDN, ADCBGPWD, ADCREFPWD)中启动参考源、带隙和模拟电路。
  • 通过设置 ADCCTL1.ADCENABLE 使能ADC。
  • 在首次转换之前,需要延时 1 ms。

关断ADC电源时,可以同时清除步骤 2 中的所有三个位。 ADC 功率电平必须通过软件进行控制,并且与设备功率模式的状态无关。

八、ADC 校准

        在制造和测试过程中,德州仪器(TI)会校准几个内部振荡器设置来校准 ADC。 这些设置作为名为 Device_cal() 的 C 调用函数的一部分嵌入到 TI 保留的 OTP 存储器中。 在boot ROM 引导启动过程中调用此函数会将工厂设置写入其各自的活动寄存器中,在此之前,ADC和内部振荡器将不遵守其指定参数。 如果在仿真过程中跳过了启动过程,则用户必须确保将调整设置写入各自的寄存器,以确保ADC和内部振荡器满足数据手册中的规格。 可以通过手动调用此函数或在应用程序本身中调用此函数,也可以通过 CCS 直接写入来完成。 为目标 MCU 创建适当的 .ccxml 文件时,CCS 中将包含用于设备校准的 gel 函数。

8.1 

        零点偏移误差被定义为转换一个VREFLO电压时得到的结果。这个基本误差会影响ADC的所有转换,包括满刻度的增益和线性度指标,决定了转换器的直流精度。零点偏移误差可能是正的,或者是负的,正的意味着转换VREFLO时得到一个正的结果。负的意味着转换一个高于VREFLO的电压结果仍会是0。为了更正这种错误,两种误差的补码都会被写入ADCOFFTRIM寄存器。这个寄存器的值在AD转换结果保存到ADC结果寄存器之前会被用到。此操作被完全包含在ADC内核,所以结果的定时将不会受到影响,ADC能够保持全动态范围通过修改微调值。调用Device_cal()把厂家校正的零点偏移写到ADCOFFTRIM寄存器,用户能够修改ADCOFFTRIM的值以减少环境造成偏移误差。这个可以通过设置ADCCTRL1的VREFLOCONV位实现,不需要任何一个ADC通道。
 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐