DSP学习F28004x数据手册:第13章-ADC

ADC

  • [13.1 概述](#13.1 概述)
    • [13.1.1 ADC特性](#13.1.1 ADC特性)
    • [13.1.2 ADC结构框图](#13.1.2 ADC结构框图)
  • [13.2 ADC 可配置性](#13.2 ADC 可配置性)
    • [13.2.1 时钟配置](#13.2.1 时钟配置)
    • [13.2.2 分辨率](#13.2.2 分辨率)
    • [13.2.3 电压参考(基准电压)](#13.2.3 电压参考(基准电压))
      • [13.2.3.1 外部参考模式](#13.2.3.1 外部参考模式)
      • [13.2.3.2 内部参考模式](#13.2.3.2 内部参考模式)
      • [13.2.3.3 联动参考](#13.2.3.3 联动参考)
      • [13.2.3.4 选择参考模式](#13.2.3.4 选择参考模式)
    • [13.2.4 信号模式](#13.2.4 信号模式)
    • [13.2.5 ==预期转换结果==](#13.2.5 ==预期转换结果==)
    • [13.2.6 ==解释转换结果==](#13.2.6 ==解释转换结果==)
  • [13.3 SOC 工作原理](#13.3 SOC 工作原理)
    • [13.3.1 SOC 配置](#13.3.1 SOC 配置)
    • [13.3.2 触发操作](#13.3.2 触发操作)
    • [13.3.3 ADC采集(采样保持)窗口](#13.3.3 ADC采集(采样保持)窗口)
    • [13.3.4 ADC输入模型](#13.3.4 ADC输入模型)
    • [13.3.5 通道选择](#13.3.5 通道选择)
  • [13.4 SOC 配置示例](#13.4 SOC 配置示例)
    • [13.4.1 由ePWM触发的单次转换](#13.4.1 由ePWM触发的单次转换)
    • [13.4.2 由ePWM触发的过采样转换](#13.4.2 由ePWM触发的过采样转换)
    • [13.4.3 由CPU定时器触发的多次转换](#13.4.3 由CPU定时器触发的多次转换)
    • [13.4.4 SOC的软件触发](#13.4.4 SOC的软件触发)
  • [13.5 ADC转换优先级](#13.5 ADC转换优先级)
  • [13.6 突发模式](#13.6 突发模式)
    • [13.6.1 突发模式示例](#13.6.1 突发模式示例)
    • [13.6.2 突发模式优先级示例](#13.6.2 突发模式优先级示例)
  • [13.7 转换结束与中断操作](#13.7 转换结束与中断操作)
    • [13.7.1 中断溢出](#13.7.1 中断溢出)
    • [13.7.2 连续中断模式](#13.7.2 连续中断模式)
    • [13.7.3 早中断配置模式](#13.7.3 早中断配置模式)
  • [13.8 后处理模块](#13.8 后处理模块)
    • [13.8.1 PPB 偏移校正](#13.8.1 PPB 偏移校正)
    • [13.8.2 PPB 误差计算](#13.8.2 PPB 误差计算)
    • [13.8.3 PPB 限值检测与过零检测](#13.8.3 PPB 限值检测与过零检测)
    • [13.8.4 PPB 采样延迟捕获](#13.8.4 PPB 采样延迟捕获)
  • [13.9 开路/短路检测电路](#13.9 开路/短路检测电路)
    • [13.9.1 实现电路](#13.9.1 实现电路)
    • [13.9.2 检测输入引脚开路](#13.9.2 检测输入引脚开路)
    • [13.9.3 检测输入引脚短路](#13.9.3 检测输入引脚短路)
  • [13.10 上电序列](#13.10 上电序列)
  • [13.11 ADC 校准](#13.11 ADC 校准)
    • [13.11.1 ADC 零点偏移校准](#13.11.1 ADC 零点偏移校准)
  • [13.12 ADC 时序](#13.12 ADC 时序)
    • [13.12.1 ADC 时序图](#13.12.1 ADC 时序图)
  • [13.13 附加信息](#13.13 附加信息)
    • [13.13.1 确保同步操作](#13.13.1 确保同步操作)
      • [13.13.1.1 基本同步操作](#13.13.1.1 基本同步操作)
      • [13.13.1.2 多触发源同步操作](#13.13.1.2 多触发源同步操作)
      • [13.13.1.3 非均衡SOC数量同步操作](#13.13.1.3 非均衡SOC数量同步操作)
      • [13.13.1.4 非重叠转换](#13.13.1.4 非重叠转换)
    • [13.13.2 选择采集窗口时长](#13.13.2 选择采集窗口时长)
    • [13.13.3 实现同步采样](#13.13.3 实现同步采样)
    • [13.13.4 结果寄存器映射](#13.13.4 结果寄存器映射)
    • [13.13.5 内部温度传感器](#13.13.5 内部温度传感器)
    • [13.13.6 设计外部参考电路](#13.13.6 设计外部参考电路)
  • [13.14 ADC寄存器](#13.14 ADC寄存器)
    • [13.14.1 ADC基地址表](#13.14.1 ADC基地址表)

13.1 概述

ADC 模块是一款 12 位逐次逼近型(SAR)ADC。该模块由内核封装器组成:

  • 内核包含模拟电路:通道选择 MUX、采样保持(S/H)电路、逐次逼近电路、电压基准电路及其他模拟支持电路;
  • 封装器包含数字电路:用于配置和控制 ADC 的可编程转换逻辑、结果寄存器、模拟电路接口、外设总线接口、后处理电路及与其他片内模块的接口;

每个 ADC 模块包含单个采样保持(S/H)电路。该设计支持在同一芯片上复用多个 ADC 模块,实现多通道同步采样或独立操作。ADC 封装器采用基于转换启动(SOC) 的架构(详见第 13.3 节)。

13.1.1 ADC特性

每个 ADC 具备以下特性:

  • 12 位分辨率
  • 由 VREFHI/VREFLO 引脚设置的比率式外部基准
  • 可选择的 2.5V 或 3.3V 内部基准
  • 单端信号转换
  • 最多16 通道的输入多路复用器
  • 16 个可配置的转换启动(SOC)
  • 16 个独立可寻址的结果寄存器
  • 多种触发源
    • S/W:软件立即启动
    • 所有 ePWM:ADCSOC A 或 B
    • GPIO XINT2
    • CPU 定时器 0/1/2
    • ADCINT1/2
  • 四个灵活的可屏蔽中断(PIE中断)
  • 可配置的中断触发位
  • 突发模式(Burst mode)
  • 四个后处理模块 (每个包含):
    • 饱和偏移校准
    • 设定点误差计算
    • 高/低/过零比较(支持中断和 ePWM 跳变触发)
    • 触发到采样的延迟捕获

注意:

并非所有 ADC 的每个通道均会引出至引脚。请查阅具体器件的数据手册以确定可用通道。

13.1.2 ADC结构框图

  • 图13-1展示了ADC内核与ADC封装器的结构框图。

13.2 ADC 可配置性

  • 模数转换器(ADC)的某些配置由各个采样保持器(SOC)独立控制,而其他配置则由每个ADC模块全局控制。
  • 表13-1总结了ADC的基本选项及其可配置层级,后续章节将详细讨论这些配置。

13.2.1 时钟配置

  • ADC的基础时钟由系统时钟(SYSCLK)直接提供。该时钟用于生成ADC的采集窗口。寄存器ADCCTL2
    中有一个PRESCALE(预分频)字段,该字段决定了ADCCLK(ADC内核时钟)的频率。ADCCLK用于为转换器内核提供时钟。
  • 转换器内核大约需要 10.5个ADCCLK周期才能将电压处理成一个转换结果。用户必须确定采集窗口所需的持续时间,具体请参见第13.13.2节。

注意:

要确定ADCCTL2.PRESCALE字段的合适值,请查阅您特定型号的数据手册,以确定最大的SYSCLK和ADCCLK频率。

13.2.2 分辨率

ADC的分辨率决定了模拟输入范围被量化为数字值的精细程度。本ADC支持12位分辨率。

13.2.3 电压参考(基准电压)

13.2.3.1 外部参考模式

  • 每个ADC都有一个VREFHI(高电平参考) 输入引脚和一个 VREFLO(低电平参考) 输入引脚。在外部参考模式下,这些引脚被用作一个比率式参考,以确定ADC的转换输入范围。
  • 关于如何提供该参考电压的信息,请参见第13.13.6节。

注意:

在没有外部VREFLO信号的器件上,VREFLO在内部连接到芯片的模拟地(VSSA)。

请查阅您特定型号的数据手册,以确定VREFHI和VREFLO引脚所允许的电压范围。

外部参考模式需要在VREFHI引脚上连接一个外部电容。具体的电容值要求,请参见您特定型号的数据手册。

13.2.3.2 内部参考模式

  • 在内部参考模式下,芯片会向VREFHI引脚输出一个电压。此时,VREFHI和VREFLO引脚共同设定ADC的转换范围。
  • 内部参考电压可以配置为2.5V或1.65V。当选择1.65V内部参考电压时,ADC的有效转换输入范围将是VREFLO至3.3V。

注意:

内部参考模式同样需要在VREFHI引脚上连接一个外部电容。具体的电容值要求,请参见您特定型号的数据手册。

13.2.3.3 联动参考

  • 在某些芯片封装中,多个ADC的电压参考引脚可能是组合在一起(联动)的。在这种情况下,当选择外部参考模式与内部参考模式,以及选择3.3V或2.5V的内部参考电压范围时,必须对这些联动参考进行相同的配置。
  • 例如,如果ADC B和ADC C的参考引脚是联动的,且期望的参考模式为2.5V内部参考模式,则应运行以下参考配置代码:
c 复制代码
//ADCB VREFHI and ADCC VREFHI share a pin
//ADCB VREFLO and ADCC VREFLO share a pin
//Both references must be explicitly configured
//Both references must be configured identically
SetVREF(ADC_ADCB, ADC_INTERNAL, ADC_VREF2P5);
SetVREF(ADC_ADCC, ADC_INTERNAL, ADC_VREF2P5);
  • 器件内部硬件会确保多个参考电压源不会向同一个引脚驱动冲突的电压。
  • 因此,这些参考电压源的配置可以以任意顺序进行,也可以在任何时间跨度内完成。

13.2.3.4 选择参考模式

  • 电压参考模式应通过使用C2000Ware中提供的SetVREF或ADC_setVREF函数进行配置。使用这些函数可以确保正确的修调值被加载到ADC的修调寄存器中。
  • 该函数在器件复位后至少必须调用一次。禁止通过直接向ANAREFCTL寄存器写入值的方式来配置电压参考模式。

13.2.4 信号模式

  • 该ADC支持单端信号模式。
  • 在单端模式下,转换器的输入电压通过单个引脚(ADCINx)进行采样,其参考电平为VREFLO。

13.2.5 预期转换结果

  • 对于给定的模拟输入电压,其理想的预期数字转换结果由表13-2给出。计算结果中的小数值将被截断。

13.2.6 解释转换结果

  • 对于给定的ADC转换结果,其对应的理想模拟输入电压由表13-3给出。该值对应于能够产生此转换结果的模拟电压可能范围的中间值。

13.3 SOC 工作原理

  • ADC的触发和转换序列是通过可配置的转换启动模块来完成的。每个SOC都是一个配置集合,用于定义对单个通道的一次转换。该配置集包含三个要素:
    • 启动转换的触发源。
    • 要转换的通道。
    • 采集(采样)窗口持续时间。
  • 当SOC接收到其配置的触发信号时,ADC外设将确保使用指定的采集窗口持续时间来对指定的通道进行采样和转换。
  • 可以根据需要,将多个SOC配置为使用相同的触发源、通道和/或采集窗口。
    • 将多个SOC配置为使用同一个触发源,将允许该单个触发信号启动一个转换序列。
    • 将多个SOC配置为使用同一个触发源和同一个通道,将可以实现过采样。

13.3.1 SOC 配置

  • 每个SOC都有其独立的配置寄存器 ADCSOCxCTL。在该寄存器中,可以为SOCx配置触发源、要转换的通道以及采集(采样)窗口持续时间。

13.3.2 触发操作

  • 每个SOC都可以配置为由多个输入触发源之一启动。SOCx的主要触发选择由 ADCSOCxCTL.TRIGSEL寄存器实现,可选择的范围包括:
    • 禁用(仅限软件触发)
    • CPU定时器 0/1/2
    • GPIO:输入X-Bar的INPUT5
    • 来自每个ePWM模块的 ADCSOCA 或 ADCSOCB 信号
  • 此外,当 ADCINT1 或 ADCINT2 标志位被置位时,也可以触发每个SOC。这通过配置 ADCINTSOCSEL1 寄存器(对应SOC0至SOC7)或 ADCINTSOCSEL2 寄存器(对应SOC8至SOC15)来实现。此功能对于创建连续转换非常有用。

13.3.3 ADC采集(采样保持)窗口

  • 外部信号源驱动模拟信号的速度和有效性各不相同。为了达到额定的分辨率,信号源需要将ADC内核中的采样电容充电至信号电压的0.5 LSB误差范围内。采集窗口就是允许采样电容进行充电的时间,可通过ADCSOCxCTL.ACQPS 寄存器为SOCx进行配置。
  • ACQPS是一个9位寄存器,可设置为0到511之间的值,由此得出的采集窗口持续时间为:采集窗口持续时间 = (ACQPS + 1) × 系统时钟周期
    • 采集窗口持续时间基于系统时钟(SYSCLK),而非ADC内核时钟(ADCCLK)。
    • 所选的采集窗口持续时间必须至少长于一个ADCCLK周期。
    • 数据手册会规定一个最小采集窗口持续时间(单位为纳秒)。用户有责任选择满足此要求的采集窗口持续时间。

13.3.4 ADC输入模型

  • 对于单端工作模式,单端输入模型(见图13-3)中相关参数的ADC输入特性,可以在特定器件的数据手册中找到。
  • 应结合实际信号源阻抗来使用这些输入模型,以确定采集窗口的持续时间。更多信息请参见第13.13.2节。

13.3.5 通道选择

  • 每个SOC都可以配置为转换任意一个ADC通道。
  • 这一功能通过ADCSOCxCTL.CHSEL寄存器为SOCx进行选择。该功能的总结请参见表13-4。

13.4 SOC 配置示例

  • 以下部分提供了一些具体的配置示例,说明如何配置SOC以执行特定的转换序列。

13.4.1 由ePWM触发的单次转换

  • 若要将ADCA配置为在ePWM定时器达到周期匹配时,对通道ADCINA1执行一次转换,需要进行以下几项配置。
  • 首先,必须配置ePWM3以生成SOCA或SOCB信号(此处的SOC指的是ePWM模块内部的信号)。请参阅《增强型脉宽调制器模块 (ePWM)》章节了解如何配置。本例假设选择的是SOCB信号。
  • 我们任意选择SOC5。16个SOC中的任何一个都可以使用。
  • 假设期望的采样窗口为100 ns,且SYSCLK频率为100 MHz(周期为10 ns),那么采集窗口持续时间应为 100ns / 10ns = 10个SYSCLK周期。因此,ACQPS 字段应设置为 10 - 1 = 9。
c 复制代码
AdcaRegs.ADCSOC5CTL.bit.CHSEL = 1;  // SOC5将转换ADCINA1通道
AdcaRegs.ADCSOC5CTL.bit.ACQPS = 9;  // SOC5将使用10个SYSCLK周期的采样持续时间
AdcaRegs.ADCSOC5CTL.bit.TRIGSEL = 10; // SOC5将在ePWM3的SOCB信号上开始转换
  • 如上配置后,当ePWM3发生周期匹配并产生SOCB信号时,如果ADC处于空闲状态,它将立即开始对通道ADCINA1(SOC5)进行采样。如果ADC正忙,则ADCINA1将在SOC5获得优先级时开始采样(参见第13.5节)。
  • ADC控制逻辑将以指定的100 ns采集窗口宽度对ADCINA1进行采样。
  • 采集完成后,ADC将立即开始将采样电压转换为数字值。当ADC转换完成时,结果将存入ADCRESULT5寄存器(关于精确的采样、转换和结果锁存时序,请参见第13.12节)。

13.4.2 由ePWM触发的过采样转换

  • 若要将ADC配置为对ADCINA1进行4次过采样,我们使用与前一个示例相同的配置,但将其应用于SOC5、SOC6、SOC7和SOC8。
c 复制代码
// 配置SOC5
AdcaRegs.ADCSOC5CTL.bit.CHSEL = 1;
AdcaRegs.ADCSOC5CTL.bit.ACQPS = 9;
AdcaRegs.ADCSOC5CTL.bit.TRIGSEL = 10;
// 配置SOC6
AdcaRegs.ADCSOC6CTL.bit.CHSEL = 1;
AdcaRegs.ADCSOC6CTL.bit.ACQPS = 9;
AdcaRegs.ADCSOC6CTL.bit.TRIGSEL = 10;
// 配置SOC7
AdcaRegs.ADCSOC7CTL.bit.CHSEL = 1;
AdcaRegs.ADCSOC7CTL.bit.ACQPS = 9;
AdcaRegs.ADCSOC7CTL.bit.TRIGSEL = 10;
// 配置SOC8
AdcaRegs.ADCSOC8CTL.bit.CHSEL = 1;
AdcaRegs.ADCSOC8CTL.bit.ACQPS = 9;
AdcaRegs.ADCSOC8CTL.bit.TRIGSEL = 10;
  • 如上配置后,当ePWM3发生周期匹配并产生SOCB信号时,如果ADC处于空闲状态,它将立即开始对通道ADCINA1(SOC5)进行采样。如果ADC正忙,则ADCINA1将在SOC5获得优先级时开始采样(参见第13.5节)。
  • 一旦SOC5的转换完成,SOC6将开始转换ADCINA1,同时SOC5的结果将被存入ADCRESULT5寄存器。
  • 所有四次转换最终将依次完成,其结果分别存入ADCRESULT5、ADCRESULT6、ADCRESULT7和ADCRESULT8寄存器,对应于SOC5、SOC6、SOC7和SOC8。

注意:

虽然可能性不大,但根据接收到ePWM触发时轮询指针 的位置,ADC有可能在转换SOC5之前就开始转换SOC6、SOC7或SOC8。请参阅第13.5节以了解如何选择下一个要转换的SOC。

13.4.3 由CPU定时器触发的多次转换

  • 本示例将展示如何对具有不同采集窗口要求的多个信号进行采样。将使用 CPU1 Timer 2 来生成触发信号。关于如何配置CPU定时器,请参阅《系统控制与中断》章节。
  • 在设计包含多个信号的采样方案时,一个良好的第一步是列出所有信号及其所需的采集窗口。据此,计算每个信号所需的SYSCLK周期数,进而确定ACQPS寄存器的设置。假设SYSCLK为100 MHz(周期10 ns),其计算过程如表13-5所示。
  • 接下来,确定每个信号应连接到哪个ADC引脚。这在很大程度上取决于应用电路板的布局。一旦引脚选定,确定CHSEL的值就变得直接明了(请参见表13-6)。
  • 完成参数制表后,即可直接生成SOC配置代码:
c 复制代码
// 配置 SOC0 - 用于信号1 (ADCINA5)
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 5;   // SOC0将转换ADCINA5通道
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 23;  // SOC0将使用24个SYSCLK周期的采样持续时间
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 3; // SOC0将在CPU1 Timer 2触发时开始转换

// 配置 SOC1 - 用于信号2 (ADCINA0)
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 0;   // SOC1将转换ADCINA0通道
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 88;  // SOC1将使用89个SYSCLK周期的采样持续时间
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 3; // SOC1将在CPU1 Timer 2触发时开始转换

// 配置 SOC2 - 用于信号3 (ADCINA3)
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 3;   // SOC2将转换ADCINA3通道
AdcaRegs.ADCSOC2CTL.bit.ACQPS = 21;  // SOC2将使用22个SYSCLK周期的采样持续时间
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 3; // SOC2将在CPU1 Timer 2触发时开始转换

// 配置 SOC3 - 用于信号4 (ADCINA2)
AdcaRegs.ADCSOC3CTL.bit.CHSEL = 2;   // SOC3将转换ADCINA2通道
AdcaRegs.ADCSOC3CTL.bit.ACQPS = 58;  // SOC3将使用59个SYSCLK周期的采样持续时间
AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 3; // SOC3将在CPU1 Timer 2触发时开始转换
  • 完成配置后,当CPU1 Timer2产生触发事件时,SOC0、SOC1、SOC2和SOC3将按该顺序依次完成采样转换。
  • ADCINA5(信号1)的转换结果存入ADCRESULT0,ADCINA0(信号2)、ADCINA3(信号3)和ADCINA2(信号4)的结果分别存入ADCRESULT1、ADCRESULT2和ADCRESULT3。

注意:

根据轮询指针的初始位置,可能存在ADC先转换SOC1/2/3后转换SOC0的情况(概率较低)。具体SOC转换顺序选择机制详见13.5节。

13.4.4 SOC的软件触发

  • 无论SOC是否已配置为接受特定硬件触发,在任何时刻均可通过软件触发启动转换。此操作通过向ADCSOCFRC1寄存器写入相应位来实现。
  • 对于前述示例,若不等待CPU1 Timer2产生触发信号,可通过以下语句实现软件触发:
c 复制代码
AdcaRegs.ADCSOCFRC1.all = 0x000F; // 置位SOC0至SOC3的触发标志

13.5 ADC转换优先级

  • 当多个SOC触发标志同时有效时,系统通过两种优先级模式确定转换顺序:
  • 轮询模式(默认)
  • 此模式下所有SOC具有平等优先级。转换顺序由轮询指针(RRPOINTER)决定,该指针指向最后完成转换的SOC编号。最高优先级将赋予大于RRPOINTER值的下一个SOC编号(SOC15之后循环回SOC0)。复位后RRPOINTER初始值为16(此时最高优先级为SOC0)。可通过器件复位、设置ADCCTL1.RESET位或写入SOCPRICTL寄存器重置该指针。
  • 高优先级模式
  • 通过ADCSOCPRIORITYCTL 寄存器的SOCPRIORITY 字段可配置高优先级SOC:
    • 高优先级SOC会立即中断当前轮询序列,在完成正在进行的转换后优先执行
    • 若多个高优先级SOC同时触发,编号较小者优先
    • SOCPRIORITY字段值定义首个非高优先级SOC的编号(例如设为4时,SOC0-3为高优先级,其中SOC0优先级最高)
  • 具体示例参见图13-4(轮询模式)与图13-5(高优先级模式)

13.6 突发模式

  • 突发模式允许单个触发信号按轮询顺序依次启动一个或多个SOC转换。通过设置ADCBURSTCTL寄存器的BURSTEN位可启用此模式。
  • 在此模式下:
    • 配置为轮询模式(非高优先级)的SOC将忽略TRIGSEL字段
    • 所有轮询SOC改由ADCBURSTCTL.BURSTTRIG字段统一触发
    • 每次触发将按轮询指针顺序启动(BURSTSIZE + 1)个SOC转换

注意:

使用突发模式时,用户需确保当前突发转换序列完成后再接收下一个触发信号。

13.6.1 突发模式示例

  • 突发模式可用于在交替触发时采样不同的信号组。以下示例中:
    • ADCIN7和ADCIN5在CPU1 Timer2的第一次触发及后续奇数次触发时转换
    • ADCIN2和ADCIN3在CPU1 Timer2的第二次触发及后续偶数次触发时转换
  • 所有信号均采用20个SYSCLK周期的采集窗口,但也可按需为每个SOC配置不同时长。
c 复制代码
AdcaRegs.BURSTCTL.bit.BURSTEN = 1;      // 启用ADC突发模式
AdcaRegs.BURSTCTL.bit.BURSTTRIG = 3;    // CPU1 Timer2将触发突发转换
AdcaRegs.BURSTCTL.bit.BURSTSIZE = 1;    // 突发长度为1+1=2次转换
AdcaRegs.SOCPRICTL.bit.SOCPRIORITY = 12; // SOC0至SOC11设为高优先级

AdcaRegs.ADCSOC12CTL.bit.CHSEL = 7;     // SOC12将转换ADCINA7
AdcaRegs.ADCSOC12CTL.bit.ACQPS = 19;    // SOC12采用20个SYSCLK周期的采样时长
AdcaRegs.ADCSOC13CTL.bit.CHSEL = 5;     // SOC13将转换ADCINA5
AdcaRegs.ADCSOC13CTL.bit.ACQPS = 19;    // SOC13采用20个SYSCLK周期的采样时长
AdcaRegs.ADCSOC14CTL.bit.CHSEL = 2;     // SOC14将转换ADCINA2
AdcaRegs.ADCSOC14CTL.bit.ACQPS = 19;    // SOC14采用20个SYSCLK周期的采样时长
AdcaRegs.ADCSOC15CTL.bit.CHSEL = 3;     // SOC15将转换ADCINA3
AdcaRegs.ADCSOC15CTL.bit.ACQPS = 19;    // SOC15采用20个SYSCLK周期的采样时长
  • 当接收到第一个CPU1 Timer2触发时,若ADC空闲则立即转换SOC12和SOC13;若ADC繁忙,则SOC12和SOC13将在获得优先级时转换。结果分别存入ADCRESULT12和ADCRESULT13。SOC13完成后,轮询指针将最高优先级赋予SOC14。因此当下一个CPU1 Timer2触发到来时,SOC14和SOC15将被挂起并最终完成转换,结果分别存入ADCRESULT14和ADCRESULT15。后续触发将持续在转换SOC12/SOC13与SOC14/SOC15之间交替进行。
  • 虽然上述示例展示了两组转换的交替执行,但采用类似方法可实现三组或更多不同转换集的交替采样。

13.6.2 突发模式优先级示例

  • 图13-6展示了结合突发模式与高优先级SOC的优先级解析实例。

13.7 转换结束与中断操作

  • 每个SOC都对应一个转换结束(EOC)信号。该EOC信号可用于触发ADC中断。ADC可配置为在采集窗口结束时或在电压转换结束时产生EOC脉冲,此配置通过ADCCTL1寄存器中的INTPULSEPOS位实现。具体EOC脉冲位置详见第13.12节。
  • 每个ADC模块具有4个可配置的ADC中断。这些中断可由16个EOC信号中的任意一个触发。每个ADCINT的标志位可直接读取以判断相应SOC是否完成,也可将中断传递至PIE模块。

注意:

ADCCTL1.ADCBSY位清零并不表示一组SOC中的所有转换已完成,仅表示ADC已就绪可处理下一个转换。要判断SOC序列是否完成,应将ADCINT标志关联至序列末尾的SOC并监控该ADCINT标志。

  • 图13-7展示了ADC中断结构的框图。

13.7.1 中断溢出

  • 如果EOC信号试图置位ADCINTFLG寄存器中已处于置位状态的标志位,则发生中断溢出。默认情况下,溢出中断不会传递至PIE模块。当ADCINTFLG寄存器中某标志位发生溢出时,ADCINTOVF寄存器中的相应标志位将被置位。该溢出标志仅用于检测溢出事件,不会阻止后续中断向PIE模块传递。
  • 在可能发生ADC中断溢出的应用场景中,程序应在ISR或后台循环中检查相应的ADCINTOVF标志,并在检测到溢出时采取相应措施。
  • 以下代码片段演示了在ISR中尝试清除ADCINT标志后如何检查ADCINTOVF标志:
c 复制代码
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除ADC-A的INT1标志
if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT1) // 检测ADCINT1是否溢出
{
    AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1; // 清除溢出标志
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 再次清除ADCINT标志
}

13.7.2 连续中断模式

  • ADCINTSEL1N2和ADCINTSEL3N4寄存器中的INTxCONT位用于配置当ADCINTFLG尚未从先前中断中清除时的中断处理方式。该模式默认禁用,此时重叠的中断不会向PIE发出。启用此模式后,ADC中断将始终传递至PIE。无论该配置如何,若在ADCINTFLG仍置位时发生中断,ADCINTOVF寄存器仍会被置位。

13.7.3 早中断配置模式

  • 启用早中断模式可使应用程序在ADC结果就绪前进入ADC中断服务程序。这允许应用程序执行必要的预处理工作,以便在结果可用时立即进行处理。然而,早中断的触发时机可能过早,应用程序可能需要等待更新后的ADC结果。为避免此情况,早中断模式下的中断进入时间可通过ADCINTCYCLE寄存器中的OFFSET字段进行配置。
    • 要使用可配置的中断时间,ADC必须处于早中断模式。需将ADCCTL1中的INTPULSEPOS位清零。
    • ADCINTCYCLE寄存器的OFFSET值设置SOC脉冲下降沿之后、ADCINT标志置位之前的额外SYSCLK周期数。
    • 若OFFSET值超过EOC时刻,ADC中断将与EOC同时产生。
    • 当INTPULSEPOS置1时,向OFFSET写入值不会对中断产生任何影响。

13.8 后处理模块

  • 每个ADC模块包含四个后处理模块。这些模块可通过ADCPPBxCONFIG.CONFIG位字段与16个结果寄存器中的任意一个相关联。每个PPB可同时实现以下功能:消除与ADCIN通道相关的偏移量、减去参考值、标记过零点以及标记高/低比较限值。此外,过零点和比较标志可触发PWM和/或产生中断。PPB还能够记录与其关联的SOC触发时刻与实际开始采样时刻之间的延迟。
  • 图13-8展示了每个PPB的结构。
  • 后续章节将详细说明每个子模块的使用方法。

13.8.1 PPB 偏移校正

  • 在许多应用中,外部传感器和信号源会产生偏移。全局调整ADC偏移量不足以补偿这些随通道变化的偏移。后处理模块可以零开销地消除这些偏移,从而在紧密的控制循环中节省大量周期。
  • 偏移校正的实现步骤如下:首先将ADCPPBxCONFIG.CONFIG指向目标SOC,然后向ADCPPBxOFFCAL.OFFCAL寄存器写入偏移校正值。后处理模块将自动在原始转换结果上加上或减去OFFCAL寄存器中的值,并将结果存入ADCRESULT寄存器。该加减运算将在低端0和高端4095处进行饱和处理。

注意:

• 向OFFCAL寄存器写入0将有效禁用偏移校正功能,原始结果将不变地传递至ADCRESULT寄存器。

• 可以将多个PPB指向同一个SOC。此时实际生效的OFFCAL值将来自编号最大的PPB。

• 特别需要注意的是,在SOC0上使用PPB时需格外小心,因为默认情况下所有PPB都指向该SOC。这可能导致编号较大的PPB无意中覆盖编号较小的PPB的偏移校正值。

13.8.2 PPB 误差计算

  • 在许多应用中,需要根据ADC转换的数字输出计算与设定点或期望值之间的误差。在其他情况下,双极性信号对于控制计算是必要或方便的。PPB可以自动执行这些功能,从而减少采样到输出的延迟并降低软件开销。
  • 误差计算的实现步骤如下:首先将ADCPPBxCONFIG.CONFIG指向目标SOC,然后向ADCPPBxOFFCAL.OFFREF寄存器写入一个值。后处理模块将自动从ADCRESULT值中减去OFFREF寄存器中的值,并将结果存入ADCPPBxRESULT寄存器。该减法运算将产生一个带符号扩展的32位结果。通过设置ADCPPBxCONFIG寄存器中的TWOSCOMPEN位,还可以选择在存入ADCPPBxRESULT寄存器之前对计算值进行选择性取反。

注意:

• 不要向OFFREF寄存器写入超过12位的值。

• 由于PPBxRESULT寄存器对每个PPB是独立的,可以将多个PPB指向同一个SOC,并为每个PPB获得不同的结果。

• 向OFFREF寄存器写入0将有效禁用误差计算功能,ADCRESULT值将不变地传递至ADCPPBxRESULT寄存器。

13.8.3 PPB 限值检测与过零检测

  • 许多应用需要对ADC转换结果进行限值检查。PPB可以自动执行高/低限值检查或检测ADCPPBxRESULT的符号变化。基于这些比较结果,PPB可自动生成PWM跳变和/或中断,从而降低采样到ePWM的延迟并减少软件开销。该功能还使注重安全的应用能够在无需CPU干预的情况下,基于超出范围的ADC转换结果触发ePWM跳变。
  • 启用该功能的步骤如下:首先将ADCPPBxCONFIG.CONFIG指向目标SOC,然后向ADCPPBxTRIPHI.LIMITHI和/或ADCPPBxTRIPLO.LIMITLO寄存器写入限值(过零检测无需额外配置)。当超出这些限值时,ADCEVTSTAT寄存器中的PPBxTRIPHI位或PPBxTRIPLO位将被置位。
  • 需要注意的是,ADCEVTSTAT寄存器中的PPBxZERO位受EOC门控,而非ADCPPBxRESULT寄存器的符号变化直接驱动。ADCEVTCLR寄存器提供相应位用于清除这些事件标志。ADCEVTSEL寄存器的相应位允许将这些事件传递至PWM。ADCINTSEL寄存器的相应位允许将这些事件传递至PIE。
  • 如图13-9所示,给定ADC模块的所有PPB共享一个PIE中断。

注意:

• 若需对同一ADC模块的不同PPB事件采取不同处理,则ADCEVTINT ISR必须读取ADCEVTSTAT寄存器中的PPB事件标志以确定中断源。

• 若需为高限比较、低限比较和/或过零检测分别生成不同的ePWM跳变,可通过将多个PPB指向同一SOC来实现。

• 过零检测电路将结果0视为正数。

13.8.4 PPB 采样延迟捕获

  • 当多个控制环路在同一ADC上异步运行时,可能出现两个或多个环路的ADC请求冲突,导致其中某个采样延迟。这在系统中表现为测量误差。通过获知延迟发生的时间及延迟量,软件可采用外推技术来减小误差。
  • 为此,每个PPB在ADCPPBxSTAMP寄存器中设有DLYSTAMP字段。该字段包含关联SOC触发时刻与实际开始转换时刻之间的SYSCLK周期数。
  • 其实现原理如下:基于SYSCLK运行一个全局12位自由运行计数器,该计数器值保存在ADCCOUNTER寄存器的FREECOUNT字段中。当关联SOC的触发信号到达时,计数器当前值被载入ADCPPBxTRIPLO.REQSTAMP位字段。当该SOC的采样窗口实际开始时,用当前FREECOUNT值减去REQSTAMP值,结果存入DLYSTAMP字段。

注意:

• 若SOC触发时刻与实际开始采集时刻之间经过超过4096个SYSCLK周期,FREECOUNT寄存器可能多次溢出,导致DLYSTAMP值错误。使用极慢转换时需谨慎避免此情况。

• 若关联SOC通过软件触发,采样延迟捕获功能将不起作用。但若另一SOC的软件触发导致与PPB关联的SOC延迟,则延迟捕获仍能正确记录。

13.9 开路/短路检测电路

  • 开路/短路检测电路用于检测系统中的引脚故障。
  • 如图13-10所示,该电路连接在通道选择多路复用器之后、采样保持电路之前的ADC输入路径上。

注意:

• 分压电阻容差变化较大,因此不应使用此功能检查转换精度。

• 有关模拟输入通道的实现和可用性,请查阅器件数据手册。

• 由于驱动阻抗较高,所需采样保持持续时间应远长于ADC最小值。

  • 该电路的操作通过向ADCOSDETECT寄存器的DETECTCFG字段写入值来实现。写入后,电路将在任何转换的采样保持阶段向输入引脚施加一个电压。
  • 不同DETECTCFG设置下OSDETECT电路的电压和驱动强度由表13-7给出。

13.9.1 实现电路

  • 图13-11展示了一个包含OSDETECT功能的代表性电路,该电路由以下部分组成:带串联电阻RS的信号源、并联电容CP、等效OSDETECT电阻ROSDETECT以及电压VOSDETECT。该电路可作为计算进入采样电容信号电平的基础。
  • ROSDETECT和VOSDETECT是OSDETECT电路贡献的等效输入电阻和电压源,不同配置设置下的具体值见表13-7。当OSDETECT功能启用且信号源VS正在驱动时,推导进入采样保持器的输入信号请参考图13-11。
  • 输入阻抗RS和CP可能是信号源的组成部分,也可能是在设计中为预处理信号或控制信号建立时间以满足采样保持要求而引入的。使用OSDETECT功能时必须考虑输入路径,因为这将影响转换结果。
  • 例如,当此功能启用时驱动输入信号,信号VS将通过RS连接到OSDETECT电路,从而影响ADC结果。较大的CP值(数量级超过几百皮法)需要使用更高的ACQPS值,以确保输入信号在转换前已建立稳定。
  • 启用该电路的步骤:
    • 配置ADC进行转换(例如,设置通道、SOC、ACQPS、预分频器、触发源等)
    • 根据表13-7设置ADCOSDETECT寄存器,选择所需的分压连接方式
    • 启动转换并检查转换结果
  • 必须根据输入侧的驱动情况以及RS和CP的数值来解释转换结果。如果VS信号可以与输入引脚断开,则该电路可用于检测输入引脚的开路和短路,具体方法见后续章节

13.9.2 检测输入引脚开路

  • 通过循环切换不同的OSDETECT设置,输入信号将被拉向相应的源电压。驱动能力良好的输入(引脚未开路)受影响极小。然而,若引脚开路,采样电压将接近表13-7中指定的源电压。

13.9.3 检测输入引脚短路

  • 通过循环切换不同的OSDETECT设置,输入信号将被拉向相应的源电压。具有有限驱动能力的输入(引脚未短路)将被拉向每个源电压。然而,若引脚短路,信号将保持在同一电压。

13.10 上电序列

  • 器件上电或系统级复位后,ADC将处于断电且禁用状态。给ADC上电时,请遵循以下序列:
    • 在PCLKCR13寄存器中置位以启用所需ADC的时钟。
    • 在ADCCTL2的PRESCALE字段中设置所需的ADC时钟分频值。
    • 置位ADCCTL1中的ADCPWDNZ位,为ADC上电。
    • 在采样前插入延迟。所需时间请参阅数据手册
  • 若同时为多个ADC上电,步骤1和步骤3可分别通过单次写操作完成。同时,只要延迟发生在所有ADC开始上电之后,仅需一个延迟即可。

13.11 ADC 校准

  • 在制造和测试过程中,德州仪器会对ADC的增益、偏移和线性度以及缓冲DAC的偏移、PGA的增益和偏移进行校准。这些修调设置作为C可调用函数的一部分,嵌入在TI保留的OTP存储器中。
  • Device_cal() 函数将ADC和DAC偏移、PGA增益和偏移的修调值从OTP存储器复制到相应的修调寄存器。
  • 分辨率和信号模式的每种可能组合都需要不同的偏移修调值。GetAdcOffsetTrimOTP(Uint16) 函数接收对应于ADC、分辨率和信号模式的输入值,从OTP存储器返回相应的偏移修调值,用户随后将其移入ADC偏移修调寄存器。
  • Device_cal()中的修调函数在C2000ware中可作为 ADC_setOFFSETTRIM()、ADC_setINLTRIM()、DAC_setDACTRIM() 和 PGA_setGAINTRIM() 调用。这些函数从TI保留的OTP存储器源位置(测试过程中存储修调值的位置)获取修调值,并将其复制到模拟模块寄存器的目标位置。
  • 在加载适当的工厂修调值之前,ADC(及其他模块)的运作将无法保证符合数据手册规格。同样,若将工厂设置以外的修调值写入修调寄存器,ADC(及其他模块)的运作也无法保证符合数据手册规格。
  • 启动ROM将调用校准函数,因此修调值应在无需用户干预的情况下初始加载。然而,若因模块复位或其他原因导致修调值被清除,用户可调用校准函数(定义在头文件中)

13.11.1 ADC 零点偏移校准

  • 零点偏移误差定义为转换VREFLO电压时与0之间的差值。零点偏移误差可为正或负。为校正此误差,需将等量反相的调整值写入ADCOFFTRIM寄存器。该寄存器中的值将在结果存入ADC结果寄存器之前生效。此操作完全在ADC内核内部完成,因此结果时序不受影响,且对于任何修调值,ADC的满量程动态范围都将保持不变。
  • 通过GetAdcOffsetTrimOTP(Uint16)函数,可将工厂校准的零点偏移校正值加载到ADCOFFTRIM寄存器。如有需要,用户可修改ADCOFFTRIM寄存器以补偿应用环境引入的额外偏移误差,但通常无需此操作即可达到数据手册规定的性能。

注意:

无论转换器分辨率如何,ADCOFFTRIM每步的步长均为(VREFHI-VREFLO)/65536。

  • 在12位单端模式下重新校准ADC偏移的步骤:
    • 将ADCOFFTRIM设置为+112步(0x70)。这会引入一个人为偏移,以补偿ADC内核中可能存在的负偏移。
    • 对VREFLO(内部连接)执行16的倍数次转换(例如32×16次转换=512次转换),并累加结果。
    • 将累加结果除以16的倍数(例如对于512次转换,除以32)。
    • 将ADCOFFTRIM设置为112减去步骤3所得结果。

13.12 ADC 时序

  • 将模拟电压转换为数字值的过程分为采样保持阶段和转换阶段。ADC采样保持电路由SYSCLK时钟驱动,而ADC转换过程由ADCCLK时钟驱动。ADCCLK通过基于ADCCTL2寄存器中PRESCALE字段对SYSCLK进行分频而产生。
  • 采样保持时长等于被转换SOC的ACQPS字段值加1,再乘以SYSCLK周期。用户必须确保该时长既大于1个ADCCLK周期,又大于数据手册规定的最小采样保持时长。转换时间约为10.5个ADCCLK周期。实际转换时间总是SYSCLK周期的整数倍。具体时序请参见第13.12.1节的时序图和表格。

13.12.1 ADC 时序图

  • 以下时序图基于以下假设展示两个SOC的ADC转换时序:
    • SOC0和SOC1配置为使用同一触发源。
    • 触发发生时,没有其他SOC正在转换或处于等待状态。
    • 轮询指针状态使得SOC0优先转换。
    • ADCINTSEL配置为在SOC0转换结束时置位ADCINT标志(该标志是否传递至CPU以产生中断由PIE模块的配置决定)。
  • 表13-8描述了以下时序图中的参数。表13-9列出了ADC时序参数。


13.13 附加信息

  • 以下章节包含额外的实用信息。

13.13.1 确保同步操作

  • 为获得最佳性能,器件上的所有ADC应同步操作。器件数据手册规定了那些在同步与异步模式下存在差异的参数在两种模式下的性能指标。
  • 为确保同步操作,器件上的所有ADC应步调一致地运行。这通过对所有ADC进行配置,使其采样和转换阶段完全对齐来实现。最简便的方法是为每个ADC的SOC配置写入相同的触发源选择和ACQPS(采样保持时长)值。

13.13.1.1 基本同步操作

  • 以下示例为ADCA和ADCB分别配置了两个SOC,并赋予相同的触发源选择和ACQPS值。这将使ADCA和ADCB实现同步操作。对于包含两个以上ADC的器件,可采用相同原理实现所有ADC的同步。
  • 示例:基本同步操作
c 复制代码
// 配置ADCA的SOC0
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 4;   // SOC0将转换ADCINA4
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 19;  // 采样窗口20个SYSCLK周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB

// 配置ADCB的SOC0
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;   // SOC0将转换ADCINB0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19;  // 采样窗口20个SYSCLK周期
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB

// 配置ADCA的SOC1
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 4;   // SOC1将转换ADCINA4
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 30;  // 采样窗口31个SYSCLK周期
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB

// 配置ADCB的SOC1
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1;   // SOC1将转换ADCINB1
AdcbRegs.ADCSOC1CTL.bit.ACQPS = 30;  // 采样窗口31个SYSCLK周期
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB
  • 从图13-14中可以注意到以下几点:
  • 首先,虽然相同编号的SOC必须使用相同的ACQPS值,但不同编号的SOC可以使用不同的ACQPS值。因此,同步操作并不要求全局统一的采样保持时间,仅需要同时采样的通道具有相同的采样保持时长。该示例的另一个要点是,任何通道选择值均可用于任何SOC。最后,此示例假设采用轮询模式运行。若使用高优先级SOC,则必须在所有ADC上进行相同的优先级配置。

13.13.1.2 多触发源同步操作

  • 只要每组SOC具有相同的触发源选择和ACQPS设置,即可在使用多个触发源的同时实现同步操作。
  • 以下示例演示了在ADCA和ADCB之间实现同步操作,同时使用三个SOC和两个触发源。图13-15表明,任何相对触发时序的组合仍能实现同步操作。
  • 示例:多触发源同步操作
c 复制代码
// 配置SOC0 - 使用ePWM3 SOCB触发
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 4;   // SOC0转换ADCINA4
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 19;  // 采样窗口20个SYSCLK周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB

AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;   // SOC0转换ADCINB0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19;  // 采样窗口20个SYSCLK周期
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB

// 配置SOC1 - 使用ePWM3 SOCB触发
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 4;   // SOC1转换ADCINA4
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 30;  // 采样窗口31个SYSCLK周期
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB

AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1;   // SOC1转换ADCINB1
AdcbRegs.ADCSOC1CTL.bit.ACQPS = 30;  // 采样窗口31个SYSCLK周期
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB

// 配置SOC2 - 使用CPU Timer1触发
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 0;   // SOC2转换ADCINA0
AdcaRegs.ADCSOC2CTL.bit.ACQPS = 19;  // 采样窗口20个SYSCLK周期
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 2; // 触发源:CPU Timer1

AdcbRegs.ADCSOC2CTL.bit.CHSEL = 2;   // SOC2转换ADCINB2
AdcbRegs.ADCSOC2CTL.bit.ACQPS = 19;  // 采样窗口20个SYSCLK周期
AdcbRegs.ADCSOC2CTL.bit.TRIGSEL = 2; // 触发源:CPU Timer1
  • 需要注意的是,除软件触发外,任何可在TRIGSEL字段中选择的触发源均可使用。由于无法同时为所有ADC发出软件触发,因此软件触发很可能导致异步操作。ADCINT1或ADCINT2也可用作触发源,前提是所有ADC的ADCINTSOCSEL1和ADCINTSOCSEL2寄存器配置相同,且不使用软件触发启动转换序列。

13.13.1.3 非均衡SOC数量同步操作

  • 若仅使用一个触发源,其中一个ADC可使用比其他ADC更多的SOC,同时仍保持同步操作。
  • 示例:非均衡SOC数量同步操作
c 复制代码
// 配置ADCA的SOC0、SOC1、SOC2 - 均使用ePWM3 SOCB触发
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 4;   // SOC0转换ADCINA4
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 19;  // 采样窗口20个SYSCLK周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB

AdcaRegs.ADCSOC1CTL.bit.CHSEL = 4;   // SOC1转换ADCINA4
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 30;  // 采样窗口31个SYSCLK周期
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB

AdcaRegs.ADCSOC2CTL.bit.CHSEL = 0;   // SOC2转换ADCINA0
AdcaRegs.ADCSOC2CTL.bit.ACQPS = 19;  // 采样窗口20个SYSCLK周期
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB

// 配置ADCB的SOC0和SOC1 - 均使用ePWM3 SOCB触发
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;   // SOC0转换ADCINB0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19;  // 采样窗口20个SYSCLK周期
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB

AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1;   // SOC1转换ADCINB1
AdcbRegs.ADCSOC1CTL.bit.ACQPS = 30;  // 采样窗口31个SYSCLK周期
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB
  • 需要注意的是,若在所有SOC完成转换之前触发信号再次到来,ADCB将立即开始转换SOC0,而ADCA需等待SOC2完成后才能再次启动SOC0转换。
  • 这将导致异步操作,因此必须注意避免触发信号溢出。

13.13.1.4 非重叠转换

  • 如果用户可以保证转换时序不会重叠,则无需在所有ADC上配置完全相同的SOC即可达到与同步操作等效的性能。例如,若系统中的两个ADC触发源来自两个始终相差180度相位的ePWM源,则ADCA和ADCB的SOC0可使用不同的触发源和不同的ACQPS值进行配置。
  • 示例:非重叠转换操作
c 复制代码
// ePWM3的SOCA和SOCB相位相差180度
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 4;   // SOC0将转换ADCINA4
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 19;  // SOC0将使用20个SYSCLK周期的采样时长
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 10; // SOC0将在ePWM3 SOCB触发时开始转换

AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;   // SOC0将转换ADCINB0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19;  // SOC0将使用20个SYSCLK周期的采样时长
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 9;  // SOC0将在ePWM3 SOCA触发时开始转换

13.13.2 选择采集窗口时长

  • 为确保正确运行,必须给ADC输入信号足够的时间对采样保持电容Ch进行充电。通常,采样保持时长的选择应使采样电容充电至最终值的½ LSB或¼ LSB以内,具体取决于可接受的建立误差。
  • 所需建立时间可通过RC建立模型近似确定。模型的时间常数由下式给出:τ = (Rs + Ron) · (Ch + Cs + Cp)
  • 所需的时间常数个数由下式给出:
  • 因此,总采样保持时间应至少设置为:t = k · τ
  • 其中,以下参数由器件数据手册中的ADC输入模型提供:
    • n = ADC分辨率(位数)
    • Ron = ADC采样开关电阻(欧姆)
    • Ch = ADC采样电容(皮法)
    • Cp = ADC通道寄生输入电容(皮法)
    • Rs = 外部信号源电阻(欧姆)
    • Cs = 外部信号源电容(皮法)
  • 以下参数取决于应用设计:
    • 建立误差 = 可容忍的建立误差(以LSB为单位)
    • Rs = ADC驱动电路源阻抗(欧姆)
    • Cs = ADC输入引脚上的电容(皮法)
  • 例如,假设以下参数:
    • n = 12位
    • Ron = 500Ω
    • Ch = 12.5pF
    • Cp = 12.7pF
    • 建立误差 = ¼ LSB
    • Rs = 180Ω
    • Cs = 150pF
  • 时间常数计算如下:τ = (180Ω + 500Ω) · (12.5pF + 150pF + 12.7pF) = 680Ω · 175.2pF ≈ 119.1ns
  • 所需时间常数个数计算如下:
  • 因此,采样保持时间应至少设置为:t = 119.1ns · 12.27 ≈ 1461ns
  • 若SYSCLK = 100 MHz,则每个SYSCLK周期为10 ns。采样保持时长应为1461 ns / 10 ns = 146.1个SYSCLK周期,因此该输入的ACQPS应至少设置为CEILING(146.1) -- 1 = 146。
  • 虽然这给出了所需采集窗口的粗略估计,但更好的方法是在SPICE(或类似软件)中搭建包含ADC输入模型、源阻抗/电容模型以及任何板级寄生参数的电路进行仿真,以验证采样电容是否建立到所需精度。

注意:

器件数据手册会规定最小ADC采样保持窗口时长。请勿使用产生低于此规格时长的ACQPS值。

13.13.3 实现同步采样

  • 虽然每个ADC不具有双采样保持电路,但实现同步采样很容易。通过将两个或多个ADC模块的SOC触发配置为使用相同的触发源即可实现。以下示例演示了基于ePWM3事件的三路同步采样。采样通道为ADCINA3、ADCINB5和ADCINC5。本例使用20个SYSCLK周期的采集窗口,但也可以使用不同的时长。
c 复制代码
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 3;   // SOC0将转换ADCINA3
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 19;  // 采样窗口20个SYSCLK周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB

AdcbRegs.ADCSOC0CTL.bit.CHSEL = 5;   // SOC0将转换ADCINB5
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19;  // 采样窗口20个SYSCLK周期
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB

AdccRegs.ADCSOC0CTL.bit.CHSEL = 5;   // SOC0将转换ADCINC5
AdccRegs.ADCSOC0CTL.bit.ACQPS = 19;  // 采样窗口20个SYSCLK周期
AdccRegs.ADCSOC0CTL.bit.TRIGSEL = 10; // 触发源:ePWM3 SOCB
  • 当接收到ePWM3触发信号时,三个ADC将立即并行开始转换。所有结果将存入各ADC的ADCRESULT0寄存器中。需要注意的是,这假设所有ADC在触发信号到达时均处于空闲状态。若一个或多个ADC正忙,则采样将不会完全同时发生。

13.13.4 结果寄存器映射

  • ADC结果和ADC PPB结果为系统中的每个存储器总线控制器进行了复制。总线控制器包括特定器件系列和型号上的所有C28x CPU、C28x DMA和CLA。对于每个总线控制器,无需访问配置即可读取结果寄存器,且在多个总线控制器同时尝试读取ADC结果时不会发生冲突。

13.13.5 内部温度传感器

  • 内部温度传感器用于测量器件的结温。可通过内部连接使用ADC对传感器输出进行采样。通过设置TSNSCTL寄存器中的ENABLE位,可在ADCB的通道ADCIN14上启用此功能。
  • 要将温度传感器读数转换为温度值,可将温度传感器读数传递给F28004x_TempSensorConv.c文件中的GetTemperatureC()函数。

13.13.6 设计外部参考电路

  • 图13-19展示了外部电压参考发生电路的基本结构。所有ADC模块应共享单个参考电压源,以最小化ADC模块之间的参考电压失配。参考电压应先由具有良好带宽和低输出阻抗的精密运算放大器缓冲,再驱动至参考引脚。高、低参考引脚之间应在PCB上放置电容,且尽可能靠近引脚,以帮助吸收高频电流。与该电容串联的电阻(通常<1Ω)可能有助于确保运放稳定性。
  • 也可在两个参考引脚之间共享一个运放驱动器,如图13-20所示。与每个参考引脚有专用运放缓冲器的情况相比,此配置性能略有降低,但仍应能够达到数据手册中的所有ADC规格。


13.14 ADC寄存器

  • 本节描述模数转换器寄存器。

13.14.1 ADC基地址表

相关推荐
野犬寒鸦2 小时前
从零起步学习并发编程 || 第九章:Future 类详解及CompletableFuture 类在项目实战中的应用
java·开发语言·jvm·数据库·后端·学习
蒸蒸yyyyzwd2 小时前
cpp os 计网学习笔记
笔记·学习
前路不黑暗@2 小时前
Java项目:Java脚手架项目的统一模块的封装(四)
java·开发语言·spring boot·笔记·学习·spring cloud·maven
2401_848009722 小时前
Redis进阶学习
数据库·redis·学习·缓存
非鱼䲆鱻䲜3 小时前
淘晶驰串口屏使用波形图控件,接收单片机或者串口助手数据生成图像的区别
单片机·嵌入式·串口屏
简佐义的博客4 小时前
单细胞+空间转录组+ChIP-seq:这篇Nature研究在分析思路、方法学选择以及证据链构建方面均具有极高的学习价值
学习
前路不黑暗@4 小时前
Java项目:Java脚手架项目的通用组件的封装(五)
java·开发语言·spring boot·学习·spring cloud·bootstrap·maven
J-TS6 小时前
线性自抗扰控制LADRC
c语言·人工智能·stm32·单片机·算法
A9better7 小时前
C++——指针与内存
c语言·开发语言·c++·学习