TMS320F283xD中文技术参考手册之ADC

TMS320F283xD中文技术参考手册之ADC

11. TMS320F28377D的ADC特征

11.1 ADC介绍

​ 这里介绍的ADC模块是逐次逼近型(SAR)ADC,具有可选的16位和12位分辨率。ADC由一个ADC核心和一个外围包装器组成。ADC核心由模拟电路组成,包含通道选择模拟开关MUX、采样保持电路、逐次逼近电路、电压基准电路和其它辅助模拟电路组成。ADC外围包装器由数字电路组成,用于配置和控制ADC。这些电路包含可编程的转换逻辑、结果寄存器、模拟电路接口、并行总线接口、后处理电路和其它片上模块接口。

​ 每个ADC模块包含一个采样保持电路。在同一片芯片上,各ADC模块都是相同的(被设计为多次复制),允许多个ADC模块同步采样或独立运行。ADC外围包装器是启动转换(SOC)的基础(见11.5节)。

11.2 ADC特性

  • ADC模块包含ADC核心和ADC外围包装器两部分,其中ADC核由多路模拟开关、采样保持S/H电路、逐次逼近电路、电压基准电路和其它模拟辅助电路组成;ADC外围包装器电路由ADC的控制和配置数字电路组成。
  • TMS320F28377D有4个ADC模块,每个ADC模块有一个采样保持S/H电路,每个ADC模块被设计为在同一芯片上多种用途,允许同步采样或分时单独采样。
  • 每个ADC模块有16种可配置启动转换类型(SOCs)
  • 每个ADC模块有16个种独立可寻址的转换结果寄存器
  • 每个ADC模块有多种触发源:S/W 软件立即触发、所有ePWMs模块(ADCSOC A 或 B)、XINT2、Timer0/1/2、ADCINT1/2
  • 每个ADC模块有4个后处理块:满度偏移校准、设定值误差校准、通过中断和ePWM实现的高/低/过零比较能力、触发采样延时捕获

11.3 ADC模块框图

image-20201205095929357

11.4 ADC配置

  • ADC的一部分配置通过SOCs单独控制,另一部分配置通过ADC模块全局控制

    项目配置性
    时钟ADC模块全局配置(1)
    分辨率ADC模块全局配置(1)
    基准电压源不能配置(只可用外部基准)
    信号模式ADC模块全局配置
    触发源SOC核单独配置(1)
    转换通道SOC核单独配置
    采集窗口时间SOC核单独配置(1)
    EOC定位ADC模块全局配置(提前或推迟)
    突发模式ADC模块全局配置(1)

    (1) 将这些值不同地写入不同的ADC模块可能会导致ADC异步运行。有关ADC何时同步或异步运行的指导,请参阅第11.15.1节。

  • 时钟配置:ADC的基础时钟由系统时钟(SYSCLK)提供,ADC基础时钟用于产生ADC采样窗口。ADCCTL2有一个分频域PRESCALE,用于确定ADC的实际时钟,供转换器使用。在16位模式,ADC核心需要大约29.5个ADCCLK周期来将瞬时电压值转换为一个数字量的处理,而在12位模式需要大约10.5个ADCCLK周期。分辨率的选择还将决定必要的采样窗口时间,见11.15.2节。

  • 分辨率配置:ADC的分辨率决定了模拟信号范围被量化成数字值的精细程度,该ADC支持16位或12位的可配置分辨率。分辨率应通过调用AdcSetMode()或ADC_setMode()函数来配置,具体取决于使用的头文件,这是在C2000ware中的f2837xd_ac.c文件提供的。这些函数保证正确的配置加载到ADC配置寄存器,而且必须在设备复位后至少被调用一次。不要通过直接写ADCCTL2寄存器的值来配置分辨率。在ADC处于空闲状态(没有运行或挂起的SOCs)时,分辨率可以随时更改。在开始转换之前,更改分辨率之后不需要等待时间。如果SOCs在运行或挂起时分辨率被更改,SOCs可能产生不正确的转换结果。

  • 电压基准:每一个ADC模块都有独立的VREFHI和VREFLO输入引脚,在外部基准模式下,这些引脚被用作基准比值,以确定ADC转换的输入范围。关于如何提供基准电压,请参阅第1.15.4节。注意:1)没有提供外部VREFLO引脚的芯片,VREFLO在芯片内部已经被连接到模拟地VSSA上了。2)请参考您芯片的数据手册以确定VREFHI和VREFLO允许的电压范围。3)外部基准模式需要在VREFHI引脚上接外部电容,请参考您芯片的数据手册来确定接多大的电容值。

  • 信号模式:ADC支持两种信号模式,单端和差分模式。在单端模式下,转换器的输入电压通过一个单引脚(ADCINx)采样,参考VREFLO。在差分信号模式下,转换器的输入电压通过一对输入引脚,一个正极输入(ADCINxP)和另一个负极输入(ADCINxN)。实际的输入电压是两者之间的差值(ADCINxP - ADCINxN)。


    注意:1)在16位差分信号模式下,VREFLO必须接到VSSA。

    2)在差分信号模式下,其共模电压信号 V c m = ( A D C I N x P + A D C I N x N ) 2 Vcm = \frac{(ADCINxP + ADCINxN)}{2} Vcm=2(ADCINxP+ADCINxN),具体芯片的数据手册将对该电压需要多接近 ( V F E F H I + V R E F L O ) 2 \frac{(VFEFHI + VREFLO)}{2} 2(VFEFHI+VREFLO)提出一些要求。注:将负输入连接到VSSA或VREFLO不满足上述条件。

    3)差分信号模式的好处在于两输入引脚都遇到噪声时可以极大地被抵消。要实现最优效果,要通过同一差分信号输入的正极和负极布线,两者要尽可能地接近而且保持它们相对于信号基准的对称。信号模式应通过所提供的C2000ware组件中的F2837xD_Adc.c文件中的AdcSetMode()或ADC_setMode()函数配置,这些函数确保正确的配置加载到ADC的配置寄存中,这些函数必须在芯片复位后至少被调用一次。信号模式不能通过直接写ADCCTL2寄存器来配置。

  • 期望的转换结果:基于给定的模拟输入电压,理想的期望数字转换由下表给定,小数部分被截断。

    模拟信号转换为12位数字信号公式

    模拟输入数字结果
    单端当ADCINy <= VREFLOADCRESULTx = 0
    当VREFLO < ADCINy < VREFHIADCRESULTx = 4096 × ( A D C I N y − V R E F L O V R E F H I − V R E F L O ) 4096\times (\frac{ADCINy-VREFLO}{VREFHI-VREFLO}) 4096×(VREFHIVREFLOADCINyVREFLO)
    当ADCINy >= VREFHIADCRESULTx=4095
    差分Invalid ModeInvalid Mode

    模拟信号转换为16位数字信号公式

    模拟输入数字结果
    单端Invalid ModeInvalid Mode
    差分当ADCINyP - ADCINyN <= VREFHIADCRESULTx = 0
    当-VREFHI < ADCINyP - ADCINyN <= VREFHIADCRESULTx = 65536 × ( A D C I N y P − A D C I N y N + V R E F H I ) 2 × V R E F H I 65536 \times \frac{(ADCINyP - ADCINyN + VREFHI)} {2 \times VREFHI} 65536×2×VREFHI(ADCINyPADCINyN+VREFHI)
    当ADCINyP - ADCINyN > VREFHIADCRESULTx = 65535

11.5 启动转换(SOC)操作原则

​ ADC触发和转换序列是通过可配置的启动转换(SOCs)来完成的。每个SOC是一个定义为单个通道的单个转换的配置集。在这个集合有三个配置:启动转换触发源、转换通道和获取(采样)窗口时间。在接收一个启动转换(SOC)配置之后,ADC外围包装器会保证指定的通道使用指定采样窗口时间被捕获。

​ 可以根据需要为相同的触发器、通道、和/或采样窗口配置为多个启动转换(SOCs)。配置多个启动转换SOCs使用相同的触发器将允许触发器产生一系列转换。配置多个启动转换SOCs使用相同的触发器和通道将允许过采样。

image-20201205174653041

  • SOC配置

    ​ 每一个SOC有自己独立的配置寄存器ADCSOCxCTL,在此寄存器中,可为触发源、转换通道和获取(采样)窗口时间配置SOCx.

  • 触发器运行

    ​ 每一个SOC可以被配置为启动多个输入触发器当中的一个。主要的SOCx触发器在ADCSOCxCTL.TRIGSEL寄存器中选择,有以下选择的可能性 :

    1)禁止(仅软件);

    2)定时器0/1/2(仅在单C28x核具备时);

    3)GPIO输入X-Bar INPUT5;

    4)来自每个ePWM模块的ADCSOCA或ADCSOCB。

    ​ 此外,每个SOC也会在ADCINT1标志位或ADCINT2标志位置时触发,这现这种触发可通过配置ADCINTSOCSEL1寄存器(适用SOC0-SOC7)或ADCINTSOCSEL2寄存器(适用SOC8-SOC15)来实现。这对于创建连续转换是很有用的。

  • ADC获得(采样和保持)窗口

    ​ 外部信号源变化在其快速有效地驱动模拟信号的能力上各不相同。为了实现额定的分辨率,信号源需要把ADC核心的采样电容充电到信号电压的0.5LSBs左右。采样窗口是采样的时间量,采样电容是允许充电和通过ADCSOCxCTL.ACQPS寄存器为SOCx配置的。ACQPS是一个9位的寄存器,其值范围可设置为0~511,产生的采样窗口时间为: 采 样 窗 口 时 间 = ( A C Q P S + 1 ) × ( S Y S C L K 周 期 数 ) 采样窗口时间=(ACQPS + 1) \times (SYSCLK周期数) =(ACQPS+1)×(SYSCLK)

    1)采样窗口时间基于系统时钟(SYSCLK),而不是ADC时钟(ADCCLK);

    2)选择采样窗口时间必须至少尽可能大于1个ADCCLK周期;

    3)数据手册将指定一个最小采样窗口周期(纳秒单位),用户负责选择满足此需求的采样窗口持续时间。

  • ADC输入模型

    ​ 对于单端操作,下图单端输入模型中ADC输入特性的值可以在芯片数据手册当中找到。

    image-20201207141245755

    ​ 对于差分操作,下图差分输入模型中ADC输入特性的值可以在芯片数据手册当中找到。

    image-20201207141606717

    ​ 这些输入模型应该与实际信号源的阻抗一起使用,来决定采样窗口时间。更多信息详见11.15.2节。

  • 通道选择

    ​ 每个SOC可配置转换任意ADC通道。通过ADCSOCxCTL.CHSEL寄存器为SOCx选择通道。根据信号模式的不同,这种选择是不同的。对于单端的信号模式,CHSEL的值为选择单引脚作为输入;对于差分的信号模式,CHSEL的值为选择寄偶引脚对作为正极和负极输入。总结下来如下表:

    ​ 表 通道选择输入引脚

    输入模式CHSEL输入
    单端模式0ADCIN0
    1ADCIN1
    2ADCIN2
    15ADCIN15
    输入模式CHSEL正极输入负极输入
    差分0 or 1ADCIN0ADCIN1
    2 or 3ADCIN2ADCIN3
    3 or 4ADCIN4ADCIN5
    14 or 15ADCIN14ADCIN15

    11.6 启动转换SOC配置示例:

    ​ 下面的小节提供一些关于如何配置SOCs以产生一些转换的具体示例

    • ePWM触发的单次转换

      ​ 配置ADC A模块的ADCIN1通道在ePWM定时器达到自身周期匹配时执行单次转换,有一些必须要做的事情——首先,ePWM3必须被配置为产生SOCA 或 SOCB信号(在此状态,SOC参考ePWM模块信号),如何做见增强脉冲宽度调整器模块(ePWM)章节。假设选择SOCB,任意选择一个SOC5,16个SOCs中任意一个都可以使用。假设期望100nS的采样窗口时间,SYSCLK频率是200MHz,采样窗口持续时间应为100ns/5ns = 20 SYSCLK 周期。因此ACQPS域应设置为 20 - 1 = 19.

      AdcaRegs.ADCSOC5CTL.bit.CHSEL = 1; //SOC5启动转换ADCINA1 
      AdcaRegs.ADCSOC5CTL.bit.ACQPS = 19; //SOC5使用采样窗口时间为20个SYSCLK时钟周期
      AdcaRegs.ADCSOC5CTL.bit.TRIGSEL = 10; //SOC5开始转换触发信号为ePWM3 SOCB
      

      ​ 按照配置,当ePWM3匹配其周期并产生SOCB信号时,如果ADC空闲,ADC将立即开始采样通道ADCINA1(SOC5);如果ADC正忙,ADCINA1将在SOC5获得优先权时再开始采样(见11.7节)。ADC控制逻辑将用指定的采样周期窗口宽度100ns来采样ADCINA1,在采样完成之后,ADC将立即开始把采样电压转换为一个数字值。当ADC转换完成时,其结果将在ADCRESULT5寄存器可用(准确采样、转换和结果锁存时序,见11.14节)。

    • ePWM触发过采样转换

      ​ 为了配置ADC过采样ADCINA1 4的次数,我们使用与上面例子相同的配置,不同的是把这些配置应用到SOC5、SOC6、SOC7和SOC8。

      AdcaRegs.ADCSOC5CTL.bit.CHSEL = 1; //SOC5启动转换ADCINA1
      AdcaRegs.ADCSOC5CTL.bit.ACQPS = 19; //SOC5使用采样窗口时间为20个SYSCLK时钟周期
      AdcaRegs.ADCSOC5CTL.bit.TRIGSEL = 10; //SOC5开始转换触发信号为ePWM3 SOCB
      AdcaRegs.ADCSOC6CTL.bit.CHSEL = 1; //SOC6启动转换ADCINA1
      AdcaRegs.ADCSOC6CTL.bit.ACQPS = 19; //SOC6使用采样窗口时间为20个SYSCLK时钟周期
      AdcaRegs.ADCSOC6CTL.bit.TRIGSEL = 10; //SOC6开始转换触发信号为ePWM3 SOCB
      AdcaRegs.ADCSOC7CTL.bit.CHSEL = 1; //SOC7 will convert ADCINA1
      AdcaRegs.ADCSOC7CTL.bit.ACQPS = 19; //SOC7 will use sample duration of 20 SYSCLK cycles
      AdcaRegs.ADCSOC7CTL.bit.TRIGSEL = 10; //SOC7 will begin conversion on ePWM3 SOCB
      AdcaRegs.ADCSOC8CTL.bit.CHSEL = 1; //SOC8 will convert ADCINA1
      AdcaRegs.ADCSOC8CTL.bit.ACQPS = 19; //SOC8 will use sample duration of 20 SYSCLK cycles
      AdcaRegs.ADCSOC8CTL.bit.TRIGSEL = 10; //SOC8 will begin conversion on ePWM3 SOCB
      

      ​ 按照配置,当ePWM3匹配其周期并产生SOCB信号时,如果ADC空间,ADC将立即采样ADCINA1(SOC5)通道;如果ADC正忙,ADCINA1将在SOC5获得优先权时再开始采样(见ADC转换优先级)。一旦转换完成,SOC5、SOC6即开始转换ADCINA1,且SOC5的转换结果放入ADCRESULT5寄存器。全部的四个将按照优先级顺序转换完成,SOC5、SOC6、SOC7和SOC8各自转换的结果分别放入到ADCRESULT5、ADCRESULT6、ADCRESULT7和ADCRESULT8寄存器当中。


      注意:根据Robin单向环形指针的位置,当收到ePWM触发器ADC可以在SOC5以前但不太可能开始转换SOC6、SOC7、SOC8。请参见 ADC转换优先级 以理解下一个转换的SOC如何选择。


    • CPU定时器触发多次转换

      ​ 这个例子将展示如何在不同的采样窗口需求下采样多个信号。CPU1定时器2将用于产生触发。如果配置CPU的定时器,请参考系统控制和中断章节。

      ​ 一个好的步骤是当设计一个采样多信号的方案,第1步,列出各个信号和及他们需要的采样窗口。基于此,对于每一个信号计算出各自所需要的SYSCLK周期数量,然后保存到ACQPS寄存器中。下面展示表格中,假设SYSCLK的频率为200MHz(周期时间为5ns)。

      多信号采样需求示例

      信号名称采样窗口时间需求采样窗口SYSCLK周期数ACQPS寄存器值
      Signal 1>120ns120ns/5ns = 2424 – 1 = 23
      Signal 2>444ns444ns/5ns = 89 (round up)89 – 1 = 88
      Signal 3>110ns110ns/5ns = 2222 – 1 = 21
      Signal 4>291ns291ns/5ns = 59 (round up)59 – 1 = 58

      ​ 第2步,确定对应的ADC引脚连接到每个信号。这将高度依赖板子的布线。一旦引脚选定,决定CHSEL的值就比较简单了(详见下表)。

      多信号采样接线示例

      信号名称ADC引脚CHSEL寄存器值
      Signal 1ADCINA55
      Signal 2ADCINA00
      Signal 3ADCINA33
      Signal 4ADCINA22

      ​ 有了上述表格的信息,就很容易生成SOC配置了:

      AdcaRegs.ADCSOC0CTL.bit.CHSEL = 5; 	//SOC0将转换ADCINA5
      AdcaRegs.ADCSOC0CTL.bit.ACQPS = 23; //SOC0使用采样窗口时间为24个SYSCLK时钟周期
      AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 3;//SOC0开始转换触发信号为CPU1 Timer 2
      AdcaRegs.ADCSOC1CTL.bit.CHSEL = 0; 	//SOC1 will convert ADCINA0
      AdcaRegs.ADCSOC1CTL.bit.ACQPS = 88; //SOC1 will use sample duration of 89 SYSCLK cycles
      AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 3; //SOC1 will begin conversion on CPU1 Timer 2
      AdcaRegs.ADCSOC2CTL.bit.CHSEL = 3; //SOC2 will convert ADCINA3
      AdcaRegs.ADCSOC2CTL.bit.ACQPS = 21; //SOC2 will use sample duration of 22 SYSCLK cycles
      AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 3; //SOC2 will begin conversion on CPU1 Timer 2
      AdcaRegs.ADCSOC3CTL.bit.CHSEL = 2; //SOC3 will convert ADCINA2
      AdcaRegs.ADCSOC3CTL.bit.ACQPS = 58; //SOC3 will use sample duration of 59 SYSCLK cycles
      AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 3; //SOC3 will begin conversion on CPU1 Timer 2
      

      ​ 按照配置,当CPU1 Timer2产生一个事件(触发),SOC0、SOC1、SOC2和SOC3将最终按顺序采样和转换。ADCIN5(Signal 1)的转换结果放入ADCRESULT0,同样地,ADCIN0(Signal 2)、ADCIN3(Signal 3)、ADCIN2(Signal 4)的转换结果分别放入ADCRESULT1、ADCRESULT2、ADCRESULT3。


      注意:根据Robin单向环形指针的位置,当收到CPU 定时器触发ADC可以在SOC0以前但不太可能开始转换SOC1、SOC2、SOC3。请参见 ADC转换优先级 以理解下一个转换的SOC如何选择。


    • SOCs软件触发

      ​ 在任意时刻,不论是否SOC已经被配置为接受一个指定的触发器,软件触发器可以设置使得SOC转换。软件触发通过写ADCSOCFRC1寄存器中的位域(字段)来完成。

      ​ 软件触发上面例子,无需等待CPU1 Timer2产生触发,通过一条语句就可以实现:

      AdcaRegs.ADCSOCFRC1.all = 0x000F; //set SOC flags for SOC0 to SOC3
      

    11.7 ADC转换优先级

    ​ 当多个SOC标志同时置位,优先级的两种形式之一决定了转换的秩序。默认的优先级方法是单向ROBIN循环,在这种方案中,没有SOC比其它SOC有固定的高的优先级。优先级依赖单向ROBIN循环指针(RRPOINTER)。RRPOINTER在ADCSOCPRIORITYCTL寄存器反映了最后一个SOC转换的指向位置。最高优先级的SOC被给予了比RRPOINTER值大的下一个值,在SOC15之后返回到SOC0。复位后的值是16,因为0指示着一个转换已经发生。当RRPOINTER等于16时,最高优先级为SOC0。当ADCCTL1.RESET位置位或者当SOCPRICTL寄存器被写时时,RRPOINTER会随着ADC模块的复位而复位。下表给出了单向循环优先级方法的示例:

    A 复位之后,SOC0是优先级最高的SOC;SOC7收到触发器;SOC7配置通道被立即转换
    B RRPOINTER更改指针指向SOC7;SOC8是当前优先级最高的SOC
    C SOC2 & SOC12同时收到触发器;SOC12在单向循环的第一圈;因此接下来SOC12通道会转换而SOC2通道要保持挂起
    D RRPOINTER的值变为指向SOC12;SOC12配置通道转换
    E RRPOINTER的值变为指向SOC2;SOC3是当前优先级最高的SOC
    image-20201208101125763
    image-20201208101405438image-20201208101429151
    image-20201208101501616image-20201208101521729

    寄存器ADCSOCPRIORITY的SOCPRIORITY域也可用于为单个SOC分配最高优先级。当配置为最高优先级时,一个SOC将在当前转换完成后中断单向ROBIN循环,并将自己插入到下一个转换中。转换完成后,单向循环将在中断的地方继续运行。同时触发两个高优先级SOC时,尾号小的SOC将优先取得执行权。

    最高优先级模式首先分配给SOC0,然后增加数字序号。这个值写入到SOCPRIORITY域当中,这个域定义了第1个SOC而不是优先级最高的(即当前正在转换的SOC序号)。换句话讲,如果一个值4被写入到SOCPRIORITY,而SOC0、SOC1、SOC2和SOC3同时被定义为最高优先级,SOC0的优先级最高。

    ​ 下表给出了使用最高优先级的例子

    当SOCPRIORITY = 4的时例子:
    A 复位后,SOC4首先进入单向循环轮;SOC7收到触发器;SOC7配置通道立即开始转换;
    B RRPOINTER变为指向SOC7;SOC8在当前单向循环轮排在首位;
    C SOC2和SOC12同时收到触发器,SOC2中断单向循环轮而且SOC 2配置通道接下来转换时SOC 12保持挂起;
    D RRPOINTER继续指向7;SOC12配置通道当前开始转换;
    E RRPOINTER变为指向SOC12;SOC13在当前 单向循环轮排在首位;
    image-20201208104730749
    image-20201208104804470image-20201208104830652
    image-20201208113329926

11.8 突发模式

11.9 EOC和中断操作

​ 每个SOC都有一个对应的结束转换(EOC)信号。这个EOC信号可用于触发一个ADC中断。ADC可以被配置在采样窗口结束时或在在电压转换结束时产生EOC脉冲,这使用ADCCTL1寄存器的INTPULSEPOS位来配置。准确的EOC脉冲定位,见11.14节。

​ 每个ADC模块有4个可配置的ADC中断,这些中断可被16个EOC信号当中的任意一个触发。每个ADCINT标志位可被直接读取,进而确定相关的SOC是否完成,或者中断是否可以传递到PIE。


​ 注意:ADCCTL1.ADCBSY位清零并不能指示一组SOCs全部转换完成,仅表示ADC准备下一次转换。为了确定是否一组SOCs转换完成,可以链接一个ADCINT标志到一组SOC中的最后一个并且监测ADCINT标志位。


​ 下图显示ADC中断结构的框图

image-20201208163658566

  • 中断溢出

    ​ 如果EOC信号要设置ADCINTFLG寄存器的标志位,而标志位已经置位,中断溢出将发生。默认地,溢出中断不会传递到PIE模块。当ADCINTFLG寄存器中一个给定的标志置位而溢出发生时,.ADCINOVF寄存器中相应的标志位置位。此溢出标志位仅用于探测溢出是否发生,而不能阻止进一步的中断传递到PIE模块。

    ​ 当一个ADC中断溢出可能发生时,应用程序在中断服务程序(ISR)应该检查或后台循环中适当的ADCINTOVF标志,并在检测到溢出时采取适当的行动。下面的代码片段显示了在中断服务程序(ISR)如何检查ADCINOVR标志并试图清除ADCINT标志。

    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag for ADC-A
    if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT1) //ADCINT overflow occurred
    {
        AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1 //Clear overflow flag
        AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1 //Re-clear ADCINT flag
    }   
    
  • 连续中断模式

    ​ ADCINTSEL1N2和ADCINTSEL3N4寄存器中的INTxCONT位配置当一个ADCINTFLAG还没有从一个先前的中断中清除时,如何处理中断。默认情况下禁用此模式,并且不会向PIE模块传递额外的重叠中断。通过激活此模式,ADC中断会始终向PIE发送中断信号。不管配置如何,如果中断发生,ADCINTOUF寄存器将被设置,ADCINTFLAG一直置位。

11.10 后处理块

​ 每个ADC模块包含4个后处理块(PPB)。使用ADCPPBxCONFIG.CONFIG位域配置,这些后处理块PPB可以关联到任意16个RESULT结果寄存器。每个PPB能同时去除与一个ADCIN通道相关的偏移量,减去一个基准电压值,标志一个过零点,标志一个极大值或极小值。更多地,这些过零点和比较标志可以触发一个PWM和/或产生一个中断。一个PPB也能记录与PPB相关的ADC模块被SOC触发时和它实际被采样之间的延时。下图展示出每个PPB的结构。后面的子节解释了每个子模块的使用。

image-20201208192720090

  • PPB偏移修正

    ​ 在大多数应用中,外部传感器和信号源都会产生偏移。一个ADC偏移的全局修正值并不足以补偿他们的偏移,原因在于通道与通道之间的差异。后处理块(PPB)可以零开销去除这些偏移,在严格的控制环路中节省了大量的时间。要完成偏移修正,首先通过写ADCPPBxCONFIG.CONFIG指向期望的SOC,然后写一个偏移修正值到ADCPPBxOFFCAL.OFFCAL寄存器。后处理块(PPB)会自动地从原始的转换结果加上或减去OFFCAL寄存器的值,并将运算后的结果保存到ADCRESULT寄存器当中。对于12位或16位模式,这个加/减法将分别在低端达到0,在高端达到4095或65535。


    注意:

    1. 写‘0’到OFFCAL寄存器可有效地禁止偏移修正功能,原始的转换结果会原原本本地传到ADCRFESULT寄存器当中。

    2. 多个PPBs能够指向同一个SOC,在这种情况下,PPB编号最高的OFFCAL的值将会被实际地应用。

    3. 特殊情况下,在SOC0上使用PPB需要多加小心,因为默认地所有PPB都会指向这个SOC0。这可能会导致无意识地用高编号的PPB的偏移修正值覆盖掉低编号的PPB的偏移修正值。


  • PPB误差校准

    ​ 在大多数应用中,来自ADC转换的数据输出与设定点或期望值的误差必须计算出来。换句话说,对于控制计算而言,双极信号是必要的或方便的。PPB可以自动地完成这些功能,进而减少采样到输出的延迟且减少软件开销。

    ​ 要完成误差校准,首先,通过写ADCPPBxCONFIG.CONFIG指向期望的SOC,然后向ADCPPBxOFFCAL.OFFREF寄存器写入一个值。后处理块(PPB)会自动从ADCRESULT寄存器中的值减去OFFREF寄存器的值,并保存到ADCPPBxRESULT寄存器当中。这个减运算会产生一个32位有符号数结果。当然,通过设置ADCPPBxCONFIG寄存器中的TWOSCOMPEN位,也能够在保存到ADCPPBxRESULT寄存器之前选择翻转计算值。


    注意:

    1. 在12位模式,写入OFFREF寄存器的值不要大于12位;

    2. 对每个PPB而言,因为PPBxRESULT寄存器是独立的,能够将多个PPBs指向同一个SOC并得到各自不同的结果;

    3. 向OFFREF寄存器写0会导致误差校准功能失效,ADCRESULT寄存器的值会原原本本地传递到ADCPPBxCONFIG寄存器


  • PPB限值检测和过零点检测

    ​ 许多应用会针对ADC转换结果执行限值检查。PPB可自动针对上限和下限值或者ADCPPBxRESULT改变符号时执行检查。基于这些比较,它可以自动产生一个PWM触发和/或中断,降低采样到ePWM之间的延时的同时也减少了软件开销。此功能还使安全意识强的应用程序能够基于ADC转换范围外触发ePWM,而无需任何CPU介入。

    ​ 要开启这项功能,首先,通过写ADCPPBxCONFIG.CONFIG指向期望的SOC,然后向ADCPPBxTRIPHI.LIMITHI寄存器和ADCPPBxTRIPLO.LIMITLO寄存器写入一个或都写入值(过零检测无需做进一步配置)。无论何时,只要超过这些限值,ADCEVTSTAT寄存器中的PPBxTRIPHI位或PPBxTRIPLO位将置位。注意,ADCEVTSTAT寄存器当中的PPBxZERO位由结束采样信号(EOC)门控,而不是由ADCPPBxRESULT寄存器中符号变化门控。ADCEVTCLR寄存器有相应的位域可用来清除这些事件标志。ADCEVTSEL寄存器有相应的位域允许这些事件传递给PWM。ADCINTSEL寄存器有相应的位域允许这些事件传递给PIE。

    ​ 对于一个给定的ADC模块(如下图)而言,其所有的后处理块(PPB)之间共享同一个PIE中断。

    image-20201209142411527


    注意:

    1. 过零检测和限值比较参考ADCPPBxRESULT寄存器。这包括由OFFCAL和OFFREF寄存器应用的修正。TRIPHI和TRIPLO不能实现有符号比较。当使用限值比较功能时,推荐把OFFREF清为0。

    2. 如果需要对来自同一个ADC模块的不同PPB事件采取不同的操作,那么ADCEVTINT中断服务程序(ISR)必须读取ADCEVTSTAT寄存器中的PPB事件标志,以确定是哪个事件导致了中断。

    3. 如果需要对上限比较、下限比较和/或过零检测分别产生不同的ePWM触发,可以通过将多个PPB指向同一个SOC来实现。

    4. 过零检测电路认为的过零是从零到正。


  • PPB采样延时捕获

    ​ 当多个控制环异步地在同一个ADC运行,那么一个ADC从两个或更多控制环请求这个机会会发生冲突,从而导致其中一个采样延迟。这在系统中显示为测量误差。通过知道延时发生的时间和已经发生的延迟量,软件可以采用外推法技术来减少误差。

    ​ 为此,每个后处理块(PPB)在ADCPPBxSTAMP寄存器中都有DLYSTAMP位域(字段),此位域将记录在相关SOC被触发和开始转换之间的SYSCLK周期的数量。

    ​ 这是通过占用一个基于SYSCLK的全局12位自由运行计数器来实现的,该计数器位于ADCCOUNTER寄存器的FREECOUNT字段中。当SOC相关的触发器到达时,这个计数器的值被加载到位字段ADCPPBxTRIPLO.REQSTAMP中。当SOC的实际采样窗口开始时,REQSTAMP中的值将从当前FREECOUNT值中减去,并存储在DLYSTAMP中。


    注意:

    1. 如果超过4096个SYSCLK周期在SOC触发器和SOC实际开始采样之间消耗,FREECOUNT寄存器则会产生超过一次的溢出,导致DLYSTAMP的值不正确。所以在使用非常慢的转换来要小心,要防止这件事的发生。

    2. 如果通过软件触发相关的SOC,则采样延迟捕获功能将不起作用。然而,如果软件触发不同的SOC导致与PPB相关的SOC被延迟,将会正确地记录延迟时间。


11.11 开路/短路检测电路

​ 开路/短路检测电路(OSDETECT)可用于检测系统中(ADC模块)引脚的错误。这个电路连接到ADC输入通道多路选择器之后以及采样保持S+H电路之前,如图11-11展示。


注意:

  1. 分压电阻允许偏差非常宽,因为这个特性不能用于核查转换准确度

  2. 对于实现和模拟输入通道的有效性,请查阅芯片数据手册

  3. 由于高驱动阻抗,需要采样保持S+H时间远大于ADC最小限值时间


​ 图11-11 开路/短路检测电路

image-20201211235943021

通过向ADCOSDETECT寄存器的DETECTCFG位域(字段)写入一个值,此电路可运行。在任何转换的采样保持S+H相位期间,这将导致此电路在输入信号源上叠加一个电压。这个电压和OSDETECT电路的驱动强度对不同的DETECTCFG设置由表11-9给出

​ 表11-9 DETECTCFG设置

ADCOSDETECT.DETECTCFG源电压S4S3S2S1驱动电阻
0OffOpenOpenOpenOpenOpen
1Zero ScaleClosedOpenOpenClosed5K || 7K
2Full ScaleOpenClosedClosedOpen5K || 7K
35/12 VDDAOpenClosedOpenClosed5K || 7K
47/12 VDDAClosedOpenClosedOpen5K || 7K
5Zero ScaleOpenOpenOpenClosed5K
6Full ScaleOpenOpenClosedOpen5K
7Zero ScaleClosedOpenOpenOpen7K
11.11.1 实现

​ OSDETECT典型的电路实现包括信号源、串联电阻Rs、分流电容Cp、OSDETECT电阻等效为ROSDETECT、OSDETECT电压等效为VOSDETECT,详见图11-12,而且可以作为基础计算进入采样电容的信号电平。ROSDETECT和VOSDETECT分别等效输入电阻和由OSDETECT电路出力的电压源,这些OSDETECT电路在表11-9中显示了不同配置设置的值。如果信号源VS驱动,OSDETECT特性启用时,将输入信号导出到S/H,参考图11-12。

​ 图11-12 OSDETECT使能时等效输入电路

image-20201216235819010

​ 输入阻抗Rs和Cp

11.12 上电顺序

​ 在芯片上电或系统级复位,ADC将被掉电或禁止。当ADC上电(启动)时,使用以下顺序:

  1. 设置PCLKCR13寄存器中的位,使能期望的ADC的时钟。
  2. ADCCTL2寄存器中PRESCALE位域中设置期望的ADC时钟分频器。
  3. 通过设置ADCCTL1寄存的ADCPWDNZ位使ADC上电。
  4. 采样之前允许一个延时,这个必要的时间见数据手册。

​ 如果多个ADC同时上电,步骤1和步骤3可以在一条写指令中完成所有ADC的操作。此外,只有一个延迟是必要的,只要它发生后,所有的ADC已经开始上电。

11.13 ADC校准

​ 在芯片制造和测试期间,德州仪器与缓冲DAC一起校准了ADC的增益、偏移和线性。这些修正设置嵌入到TI保留的OTP存储器当中,作为C语言可调用的函数。

  • Device_cal()函数用于把ADC和DAC偏移修正值从OTP存储器中拷贝到它们各自的修正寄存器中。
  • CalAdcXINL()函数用于把线性修正值从OTP存储器中拷贝到它们各自的修正寄存器中。
  • 每个可能的分辨率和信号模式组合都需要不同的偏移修正值,GetAdcOffsetTrimOTP(Uint16)函数携带一个与ADC对应的分辨率、信号模式的输入值,此函数从OTP存储器返回相应的偏移修正值,然后用户把这个值移动到ADC偏移修正寄存器中。
  • 修正函数Device_cal()中可调用C2000ware组件中的ADC_setOFFSETTRIM()、ADC_setINLTRIM()和DAC_setDACTRIM()函数。这些函数从TI保留在OTP存储器中相应的存储位置取得修正值,这些修正值在测试期间和模拟模块寄存器地址一起被拷贝到相应保存。

​ 直到加载相应的工厂修正值之前,ADC(和其它模块)不能保证在数据手册的技术参数内运行。同样地,如果出厂设置之外的修正值写入到修正寄存器,ADC(和其它模块)也不能保证在数据手册的技术参数内运行。

​ 启动ROM会调用校准函数,因此修正值在初始化已经加载好了,而无需用户介入。然而,如果修正值由于模块复位或一些其它原因修改而清零,用户可以调用修正函数(在头文件当中声明)。

​ 在ADC校准期间,ADC寄存器和表格描述的相关函数调用请参阅第11.13.2节。

11.13.1 ADC零偏移校准

​ 零偏移误差的定义是:在单端模式操作时,当电压为VREFLO时转换结果与0的差值;在差分模式操作时,当电压为ADCINxP = ADCINxN时转换结果与满度值的二分之一( 2 12 o r 2 16 2 \frac{2^{12} or 2^{16}}{2} 2212or216)的差值。零偏移误差可能为正也可能为负。要纠正这个误差,将等幅度和相反极性调整后的值写入ADCOFFTRIM寄存器中。在此误差值定入该寄存器将要应用之前,ADC结果寄存器中的结果是有效的。此操作完全包含在ADC核心中,因此结果的时序不会受到影响,对于任何修正值,ADC的全动态范围都将保持不变。

​ 使用GetAdcOffsetTrimOTP(Uint16)函数,可以把工厂校准的偏移误差加载到ADCOFFTRIM寄存器中。用户可以修改ADCOFFTRIM寄存器以补偿额外的包括期望的应用环境在内的偏移误差,但这通常不是实现数据手册指定的性能所必需的。

​ 在ADC偏移校准期间,相关函数调用和ADC寄存器的表格描述请参阅第11.13.2节。


注意:不论转换器的分辨率,每个ADCOFFTRIM的步长大小是 ( V R E F H I − V R E F L O ) 65535 \frac{{(VREFHI}-{VREFLO)}}{65535} 65535(VREFHIVREFLO)


​ 在12位分辨率单端采样模式,使用下面的步骤反复校准ADC偏移误差:

  1. 设置ADCOFFTRIM寄存器的值为0x70(+112步)。对于保留在内核的负偏移,就这样加上一个伪造的偏移。
  2. 在VREFLO(内部连接)上执行16个转换的倍数,累积结果(例,32 * 16个转换 = 512个转换)。
  3. 将累加结果除以16的倍数(例,对于512次转换,除以32)。
  4. 设置112 - 第3步的结果到ADCOFFTRIM寄存器。

​ 在16位分辨率差分采样模式,使用下面的步骤反复校准ADC偏移误差:

  1. 设置ADCOFFTRIM寄存器的值为0。
  2. 将ADCINxP和ADCINxN外部的连接线短接在一起,并接到接近Vrefcm的电压上,累积16个转换的倍数(例,32 * 16个转换 = 512个转换)。
  3. 将累加结果除以转换的数值(例,对于512次转换,除以512)。
  4. 设置0 - 第3步的结果到ADCOFFTRIM寄存器。
11.13.2 在OTP中ADC校准程序

​ 在工厂测试期间,每一颗芯片的ADC偏移(ADCOFFTRIM寄存器)和ADC线性校准(ADCINLTRIM1-6寄存器)的校准值都经过测量。相应的ADC偏移和线性校准值,以及保存这些校准值到相关ADC寄存器的函数,都已经保存在OTP存储器当中。下面的表格描述了函数调用、函数地址指针位置,以及在芯片启动时由Device_cal()顺序调用到ADC寄存器中的值或任意时刻由C2000Ware组件函数调用的ADC_setMode()函数。

​ 表11-10 OTP存储器中的ADC校准函数

函数名称指针地址(OTP)描述填入的寄存器
ADC_calADCAINL0x0703B4ADCA线性校准函数ADCA INLTRIM1-6
ADC_calADCBINL0x0703B2ADCB 线性校准函数ADCB INLTRIM1-6
ADC_calADCCINL0x0703B0ADCC 线性校准函数ADCC INLTRIM1-6
ADC_calADCDINL0x0703AEADCD 线性校准函数ADCD INLTRIM1-6
ADC_getOffsetTrim0x0703ACADCA-D 偏移校准函数ADCA-D ADCOFFTRIM

11.14 ADC时序

​ 一个模拟电压到数字值的转换进程被分解为S+H阶段和转换阶段。ADC采样和保持电路(S+H)由SYSCLK计时,当进入ADC转换进程时由ADCCLK计时。ADCCLK由SYSCLK基于ADCCTL2寄存器PRESCALE域(字段)分频产生。

​ 采样保持时间(S+H),是SOC开始转换的(ACQPS字段的值+1) × \times ×SYSCLK周期时间。用户必须确保这个时间超过1个ADCCLK周期和数据手册当中指定的最小采样保持(S+H)的时间。在12位模式,转换时间大约10.5个ADCCLK周期,16位模式大约29.5个ADCCLK周期。精确的转换时间总是SYSCLK周期的整数倍。详细的时序见11.14.1时序图表.

11.14.1 ADC时序表

​ 下表显示了下面两种SOC假设的ADC转换时间

  • SOC0和SOC1被配置为使用相同的触发器
  • 当触发器发生时,没有其它SOCs转换或挂起
  • Robin环形指针处于导致SOC0先进行转换的状态
  • ADCINTSEL被配置为在SOC0转换结束时ADCINT标志置位,是否此标志传递给CPU而导致中断由PIE模块中的配置来决定

​ 下面表格列出了时序图中标识的参数

表11-11 ADC时序参数

参数描述
tSHtSH为S+H的窗口时间
在此窗口的结尾,采样保持S+H电容上的值为要转换到数字值的电压。这个时间由(ACQPS + 1)个SYSCLK周期给出,ACQPS可以为每个SOC单独配置,因此对于不同的SOCs tSH不必相同。
注意:采样保持S+H电容上的值在S+H窗口结束前大约5ns被捕获,不论芯片时钟如何设置。
tLATtLAT时间为从S+H窗口结束直到ADC结果锁存到ADCRESULTx寄存器这段时间。
如果在此时间以前读取ADCRESULTx寄存器,会返回上一次的转换结果。
tEOCtEOC时间为从采样保持S+H窗口结束直到下一次ADC转换开始之前的这段时间。后面的采样在转换结果锁存至寄存器之前启动。在16位分辨率模式,与转换结果锁存一致;而在12位分辨率模式,后面的采样可在转换结果锁存至寄存器之前启动。
tINTtINT时间为从采样保持S+H窗口结束直到ADCINT标志置位(如果配置)这段时间。
如果ADCCTL1寄存器中INTPULSEPOS位置位,tINT将与转换结果开始锁存到结果寄存器一致。
如果INTPULSEPOS位清零,tINT将与采样保持S+H窗口结束一致。如果tINT触发读取ADC结果寄存器(直接通过DMA或间接通过触发中断服务程序ISR读取结果),需要关心的是必须确保读取在结果锁存之后(否则,读到的是上次的结果)。
如果INTPULSEPOS位清零,而且ADCINTCYCLE寄存器位域(字段)不为零,在ADCINT标志置位之前将有OFFSET个SYSCLK周期延时。此延时可用于进入中断服务程序ISR或在准确的采样就续时间触发DMA。

图11-13 12位采样模式早期中断模式的ADC时序image-20201225235745056

图11-14 12位采样模式晚期中断模式的ADC时序image-20201226000157202

图11-15 16位采样模式早期中断模式的ADC时序

image-20201226000327099

图11-16 16位采样模式晚期中断模式的ADC时序(SYSCLK周期数)image-20201226000430545

表11-12 12位采样模式中ADC时序(SYSCLK周期数)

ADCCTL2.PRESCALE预分频比tEOCtLATtINT (早)tINT (晚)
011113011
222123021
32.52628026
433134031
53.53639036
644144041
74.54649046
855155051
95.55660056
1066165061
116.56670066
1277176071
137.57681076
1488186081
158.58691086

表11-13 16位采样模式中ADC时序

ADCCTL2.PRESCALE预分频比tEOCtLATtINT (早)tINT (晚)
013132031
226061060
32.57575075
439091090
53.51041060104
641191200119
74.51341340134
851491500149
95.51631650163
1061781790178
116.51931930193
1272082090208
137.52222240222
1482372380237
158.52522520252

11.15 附加信息

​ 下面的小节包含附加的实用信息。

11.15.1 确保同步操作

​ 为了获得最佳的性能,芯片上所有的ADCs模块应当同步操作。芯片数据手册对不同操作模式之间的参数差异均列出了同步和异步模式下的性能。

​ 为确保同步操作,芯片上所有的ADCs模块应当同步运行。这可以通过写配置信息到所有的ADCs模块来实现,这些配置信息导致所有的ADCs模块的采样和转换阶段精确地对齐。最容易的实现这个的方式是为每一个ADC模块的SOC配置写入完全一样的值,用于触发器选择和ACQPS(采样保持S+H时间)。

11.15.1.1 基本同步操作

​ 下面的例子在ADCA和ADCB模块上分别用相同的触发器选择和ACQPS值配置了两个SOCs,这将导致ADCA和ADCB模块之间同步运行。对于超过两个ADCs模块的芯片,可以使用相同的原则去同步所有的ADCs模块。

例子:基本同步操作

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 = 10; //SOC0 将在ePWM3 SOCB上开始转换

AdcaRegs.ADCSOC1CTL.bit.CHSEL = 4;    //SOC1 将转换ADCINA4
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 30;   //SOC1 将使用31个SYSCLK周期采样时间
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 10; //SOC1 将在ePWM3 SOCB上开始转换
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1;    //SOC1 将转换ADCINB1
AdcbRegs.ADCSOC1CTL.bit.ACQPS = 30;   //SOC1 将使用31个SYSCLK周期采样时间
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 10; //SOC1 将在ePWM3 SOCB上开始转换

图11-17 例子:基本同步操作

image-20201227235404005

图11-17有几个注意事项,首先,当尾缀数字相同的SOCs ACQPS值必须相同,尾缀数字不同的SOCs可以使用不同的ACQPS值。这是因为,同步运行不需要一个单独的全局采样保持S+H时间,而是仅仅同时采样的通道需要相同的采样保持S+H时间。从例子来看,另一个重要的点是任何通道选择的值可用于任何SOC。最后,此示例假设圆形Robin循环操作。如果高优先级SOCs被使用,那么必须在所有的ADCs模块上配置为一样的优先级。

11.15.1.2 多触发源的同步操作

​ 只要每组SOCs有相同的触发选择和ACQPS设置,仍然实现同步操作时可以使用多触发源。

​ 下面的例子演示了ADCA和ADCB模块之间的同步操作,使用三个SOCs和两个触发源。图11-18演示了相对触发器的任何时序组合仍然导致同步操作。

例:多触发源的同步操作

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 4; //SOC0 will convert ADCINA4
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 19; //SOC0 will use sample duration of 20 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 10; //SOC0 will begin conversion on ePWM3 SOCB
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert ADCINB0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19; //SOC0 will use sample duration of 20 SYSCLK cycles
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 10; //SOC0 will begin conversion on ePWM3 SOCB
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 4; //SOC1 will convert ADCINA4
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 30; //SOC1 will use sample duration of 31 SYSCLK cycles
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 10; //SOC1 will begin conversion on ePWM3 SOCB
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1 will convert ADCINB1
AdcbRegs.ADCSOC1CTL.bit.ACQPS = 30; //SOC1 will use sample duration of 31 SYSCLK cycles
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 10; //SOC1 will begin conversion on ePWM3 SOCB
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 0; //SOC2 will convert ADCINA0
AdcaRegs.ADCSOC2CTL.bit.ACQPS = 19; //SOC2 will use sample duration of 31 SYSCLK cycles
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 2; //SOC2 will begin conversion on CPU Timer1
AdcbRegs.ADCSOC2CTL.bit.CHSEL = 2; //SOC2 will convert ADCINB2
AdcbRegs.ADCSOC2CTL.bit.ACQPS = 19; //SOC2 will use sample duration of 31 SYSCLK cycles
AdcbRegs.ADCSOC2CTL.bit.TRIGSEL = 2; //SOC2 will begin conversion on CPU Timer1

图11-18 例子:多触发源的同步操作

image-20201229000142383

注意:除了软件触发以外任何触发源都可以在TRIGSEL域(字段)中选择使用。没有办法同时为所有ADCs模块发出软件触发,因此很可能导致异步操作。只要ADCINTSOCSEL1和ADCINTSOCSEL2寄存器对所有的ADCs模块配置相同,并且软件触发不用于启动转换链,ADCINT1或ADCINT2也可用作一个触发器。

11.15.1.3 非均匀SOC编号的同步操作

​ 如果仅使用一个触发器,一个ADC模块可以使用比其它ADCs模块更多的SOCs时仍然同步操作。

例子:非均匀SOC编号的同步操作

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 4; //SOC0 will convert ADCINA4
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 19; //SOC0 will use sample duration of 20 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 10; //SOC0 will begin conversion on ePWM3 SOCB
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert ADCINB0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19; //SOC0 will use sample duration of 20 SYSCLK cycles
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 10; //SOC0 will begin conversion on ePWM3 SOCB
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 4; //SOC1 will convert ADCINA4
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 30; //SOC1 will use sample duration of 31 SYSCLK cycles
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 10; //SOC1 will begin conversion on ePWM3 SOCB
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1 will convert ADCINB1
AdcbRegs.ADCSOC1CTL.bit.ACQPS = 30; //SOC1 will use sample duration of 31 SYSCLK cycles
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 10; //SOC1 will begin conversion on ePWM3 SOCB
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 0; //SOC2 will convert ADCINA0
AdcaRegs.ADCSOC2CTL.bit.ACQPS = 19; //SOC2 will use sample duration of 31 SYSCLK cycles
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 10; //SOC2 will begin conversion on ePWM3 SOC

图11-19 例:非均匀SOC编号的同步操作image-20201230000454516

​ 注意:如果触发器在所有SOCs之前再次到来完成他们的转换,ADCB模块将在SOC0上立即开始转换,而ADCA直到SOC2转换完成之前将不会再次开始转换SOC0。这将导致异步操作,因此必须关心不要使触发器溢出。

图11-20 例:非均匀SOC编号的同步操作——触发溢出

image-20201230203820600

11.15.1.4 不同分辨率的同步操作

​ 配置不同ADCs模块使用不同分辨率将导致异步运行。产生这种情况的原因是对于12位模式和16位模式来说转换时间是不一样的。同步操作需要转换阶段的开始和结束均要对齐,因此即使使用相同的采样保持S+H窗口时间,也不会产生同步操作。

​ 例子:不同分辨率的异步操作

//ADCA = 12-bit mode
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 4; //SOC0 will convert ADCINA4
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 50; //SOC0 will use sample duration of 51 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 10; //SOC0 will begin conversion on ePWM3 SOCB
//ADCB = 16-bit mode
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert ADCINB0/B1
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 50; //SOC0 will use sample duration of 51 SYSCLK cycles
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 10; //SOC0 will begin conversion on ePWM3 SOCB

图11-21 例:不同分辨率的异步操作

image-20201230205120940

​ 为了实现同时使用12位和16位分辨率的同步操作,转换必须在同一种分辨率下并行完成。一次转换在一种分辨率下完成,CPU必须在所有ADCs模块上切换分辨率并且产生另一次触发(这个触发器不能是软件SOC强制触发,因为通过这种方法所有的ADCs模块都不能同时开始)。

图11-22 例:不同分辨率的同步操作

image-20201230210544197

11.15.1.5 非重叠转换

​ 如果转换时序可由用户设置保证不重叠,那么就没有必要在所有的ADCs模块上把SOCs配置相同以实现与同步操作等效的执行效果。举个例子,如果在一个系统中,两个ADC触发器来自两个相位一直差180度的ePWM源,那么SOC0可用于带有不同的触发源和不同的ACQPS值的ADCA和ADCB模块。

​ 例:非重叠转换操作

//ePWM3 SOCA and SOCB are 180 degrees out of phase
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 4; //SOC0 will convert ADCINA4
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 19; //SOC0 will use sample duration of 20 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 10; //SOC0 will begin conversion on ePWM3 SOCB
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert ADCINB0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19; //SOC0 will use sample duration of 20 SYSCLK cycles
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 9; //SOC0 will begin conversion on ePWM3 SOCA

图11-23 例:具有非重叠转换的同步等效操作

image-20201230225911215

11.15.2 选择一个采集窗口时间

​ 正确的操作,必须允许ADC输入信号为采样保持电容Ch有充分的时间充电。典型地,选择的采样保持S+H时间时可把采样电容充电至最终值的 1 2 L S B \frac{1}{2} LSB 21LSB 1 4 L S B \frac{1}{4} LSB 41LSB,这依赖于可容忍的固定误差。

​ 所需的固定时间的近似值由使用的RC固定模型来决定。这个模型的时间常数由等式给出:

τ = ( R s + R o n ) × C h + R s × ( C s + C p ) \tau = (Rs + Ron) \times Ch + Rs \times (Cs + Cp) τ=(Rs+Ron)×Ch+Rs×(Cs+Cp)

​ 而且时间常数的数量需要用下面的等式求得:

k = l n ( 2 n s e t t l i n g   e r r o r ) − l n ( C s + C p C h ) k = ln( \frac{2^n}{settling \ error}) - ln(\frac{Cs + Cp}{Ch}) k=ln(settling error2n)ln(ChCs+Cp)

​ 因此总的采样保持S+H时间至少设置如下:

t = k × τ t = k \times \tau t=k×τ

​ 在芯片的数据手册中的ADC输入模型提供下面的参数:

  • n = ADC 分辨率(单位 bits)
  • RON = ADC 采样切换电阻(单位 Ω \Omega Ω)
  • CH = ADC 采样电容 (单位 pF)
  • CP = ADC 通道寄生电容(单位 pF)

​ 并且下面的参数依赖于应用设计:

  • 固定误差 = 可容忍的误差(LSBs)
  • RS = ADC驱动电路源阻抗(单位 Ω \Omega Ω)
  • CS = ADC输入引脚上的电容(单位 pF)

​ 举个例子,假设以下参数:

  • n = 12-bits
  • RON = 500 Ω \Omega Ω
  • CH = 12.5pF
  • Cp = 12.7pF
  • 固定误差 = 1 4 \frac {1}{4} 41LSB
  • RS = 180 Ω \Omega Ω
  • CS = 150pF

​ 时间常数可计算为:

τ = ( 180 Ω + 500 Ω ) × 12.5 p F + 180 Ω × ( 150 p F + 12.7 p F ) = 8.5 n S + 29.3 n S = 37.8 n S \tau = (180 \Omega + 500 \Omega) \times 12.5pF + 180 \Omega \times (150pF + 12.7pF) = 8.5nS + 29.3nS = 37.8nS τ=(180Ω+500Ω)×12.5pF+180Ω×(150pF+12.7pF)=8.5nS+29.3nS=37.8nS

​ 且需要时间常数的个数为:

k = l n ( 2 12 0.25 ) − l n ( 150 p F + 12.7 p F 12.5 p F ) = 9.70 − 2.57 = 7.13 k = ln( \frac{2^{12}}{0.25}) - ln(\frac{150pF+12.7pF}{12.5pF}) = 9.70 - 2.57 = 7.13 k=ln(0.25212)ln(12.5pF150pF+12.7pF)=9.702.57=7.13

​ 因此采样保持时间S+H应至少设置为:

37.8 n s × 7.13 = 270 n S 37.8ns \times 7.13 = 270nS 37.8ns×7.13=270nS

​ 如果SYSCLK = 100MHz,即每个SYSCLK周期是10nS。采样保持S+H时间应为270nS / 10nS = 27.0 SYSCLKs,因此对于这个输入ACQPS应设置至少CEILING(27.0) - 1 = 26。

​ 这里给出的是所需采样窗口的粗略估算,更好的方法是使用ADC输入模型搭建电路,源阻抗/电容模型,以及SPICE(或类似软件)中的任何电路板寄生效应和模拟以确认采样电容是否达到所需的准确度。


注意:芯片数据手册会指定一个最小的ADC S+H窗口时间。不要使用ACQPS值给出的时间小于这个规定时间。


11.15.3 实现同步采样

​ 虽然每个ADC模块都没有双采样保持S+H电路,实现同步采样却很容易。这可以通过在两个或更多ADC模块上使用相同的触发源而设置SOC触发器来实现。下面的例子演示了基于一个ePWM3事件的4个同步采样——ADCINA3,ADCINB5,ADCINC5和ADCIND2被采样。采样窗口使用了20个SYSCLK周期,却可能是不同的持续时间。

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 3; //SOC0 will convert ADCINA3
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 19; //SOC0 will use sample duration of 20 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 10; //SOC0 will begin conversion on ePWM3 SOCB
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 5; //SOC0 will convert ADCINB5
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19; //SOC0 will use sample duration of 20 SYSCLK cycles
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 10; //SOC0 will begin conversion on ePWM3 SOCB
AdccRegs.ADCSOC0CTL.bit.CHSEL = 5; //SOC0 will convert ADCINC5
AdccRegs.ADCSOC0CTL.bit.ACQPS = 19; //SOC0 will use sample duration of 20 SYSCLK cycles
AdccRegs.ADCSOC0CTL.bit.TRIGSEL = 10; //SOC0 will begin conversion on ePWM3 SOCB
AdcdRegs.ADCSOC0CTL.bit.CHSEL = 2; //SOC0 will convert ADCIND2
AdcdRegs.ADCSOC0CTL.bit.ACQPS = 19; //SOC0 will use sample duration of 20 SYSCLK cycles
AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 10; //SOC0 will begin conversion on ePWM3 SOCB

​ 当收到ePWM3触发器,4个ADC模块全部立即开始并行转换。全部结果将保存在ADC模块各自的ADCRESULST0寄存器当中。注意,这里假设所有的ADCs模块在收到触发器信号时处于空闲状态。如果一个或者多个ADCs模块处于忙状态,那么采样将不会精确地在同一时间发生。

11.15.4 设计外部基准电路

​ 图11-24显示了外部电压基准发生电路的基本结构。所有的ADC模块应该共享一个基准电压发生源。这将最小化ADC模块之间基准电压的失配。然后,在驱动到基准电压引脚之前,基准电压应通过带有良好带宽和低输出阻抗的精密运放缓冲。在PCB上,高和低基准电压之间的电容应尽可能放置在靠近引脚,以帮助吸收高频电流。串联到这个电容的串联电阻(通常 < 1 Ω < 1\Omega <1Ω)是确保运放稳定的必要电阻。

​ 两个基准电压引脚之间共享一个运放驱动也是可以的。图11-25中显示了这种结构,相比较每个基准电压引脚有专用的运放而言这将轻微地减少性能,同时也减少了运放缓冲器,但也仍可能达到数据手册中所有的ADC的技术指标。

​ 图11-24 ADC基准电压系统

image-20210101234655952

​ 图11-25 ADC共享基准电压系统

image-20210101234728317

11.15.5 内部温度传感器

​ 内部温度传感器测量芯片的结温。ADC模块通过内部连接可以采样传感器的输出。在ADCA模块的ADCIN13通道上可以通过设置TSNSCTL寄存器的ENABLE位使能这种内部连接。

​ 要将温度传感器读数转换温度值,请将温度传感器读数传递给F2837xD_TempSensorConv.c文件中的GetTemperatorC()函数。

注意,此函数假设温度读数对应基准电压VREFHI = 2.5V。如果使用差分基准电压,在传递给GetTemperatorC()函数之前,应使用以下公式把采样值适当地缩放。

a d j u s t e d   s e n s o r   r e a d i n g   = r a w   s e n s o r   r e a d i n g × ( V R E F H I 2.5 V ) adjusted \ sensor \ reading \ = raw \ sensor \ reading \times (\frac {VREFHI}{2.5V} ) adjusted sensor reading =raw sensor reading×(2.5VVREFHI)


注意:要采样温度传感器,ADC模块必须在单端12位模式。如果在16位模式采样温度传感器,ADC模块将切换到12位模式执行转换。这会导致错误的ADC转换结果。


11.16 ADC寄存器

​ 这节介绍模数转换器寄存器

11.16.1 ADC基本地址

设备寄存器寄存器名称起始地址结束地址
AdcaResultRegsADC_RESULT_REGS0x0000_0B000x0000_0B1F
AdcbResultRegsADC_RESULT_REGS0x0000_0B200x0000_0B3F
AdccResultRegsADC_RESULT_REGS0x0000_0B400x0000_0B5F
AdcdResultRegsADC_RESULT_REGS0x0000_0B600x0000_0B7F
AdcaRegsADC_REGS0x0000_74000x0000_747F
AdcbRegsADC_REGS0x0000_74800x0000_74FF
AdccRegsADC_REGS0x0000_75000x0000_757F
AdcdRegsADC_REGS0x0000_75800x0000_75FF

11.16.2 ADC_REGS寄存器

​ 表11-14列出了ADC_REGS寄存器。所有没有在表11-14列出的寄存器偏移地址都应被认为是保留的位置,寄存器的内容不可更改。

​ 表11-14 ADC_REGS寄存器

image-2021010422313

​ 复杂位访问类型被编码填充进小表格里了。表11-15展示了在本节用作访问类型的编码。

​ 表11-15 ADC_REGS访问类型编码

访问类型编码描述
读类型
RR
R-0R
-0

返回0s
写类型
WW
W1SW
1S

设置1
复位或默认值
-n复位后赋值或者默认值
寄存器组变量
i,j,k,l,m,n当这些变量用于寄存器名、偏移量或地址时,它们指向一个
寄存器数组的值,该寄存器是一组重复寄存器的一部分。寄
存器组形成一个层次结构,数组用一个公式表示。
y当这些变量用于寄存器名、偏移量或地址时,它指向一个寄
存器组的值。

11.16.2.1 ADCCTL1寄存器(Offset = 0h) [reset = 0h]

​ ADCCTL1在图11-26中显示,并在表11-16中描述。ADC控制1寄存器

​ 图11-26 ADCCTL1寄存器

image-20210104231110149

​ 表11-16 ADCCTL1寄存器域(字段)描述

域(字段)类型复位描述
15-14RESERVEDR0h保留
13ADCBSYR0hADC忙。当ADC SOC发生时置位,在S/H脉冲下降沿
之后的4个ADC时钟,通过硬件清零。可用作ADC状态
机以确定ADC是否可以采样。
0 ADC可以采样下个通道
1 ADC忙,不能采样另一个通道
复位状态: SYSRSn
12RESERVEDR0h保留
11-8ADCBSYCHNR0hADC忙通道。当启动转换(SOCs)发生时置位。
当ADCBSY=0: 保持上次SOC转换值
当ADCBSY=1: 反映SOC当前正在处理
0h SOC0 正在处理或者上次SOC转换完成
1h SOC1 正在处理或者上次SOC转换完成
2h SOC2 正在处理或者上次SOC转换完成
3h SOC3 正在处理或者上次SOC转换完成
4h SOC4 正在处理或者上次SOC转换完成
5h SOC5 正在处理或者上次SOC转换完成
6h SOC6 正在处理或者上次SOC转换完成
7h SOC7 正在处理或者上次SOC转换完成
8h SOC8 正在处理或者上次SOC转换完成
9h SOC9 正在处理或者上次SOC转换完成
ah SOC10 正在处理或者上次SOC转换完成
bh SOC11 正在处理或者上次SOC转换完成
ch SOC12 正在处理或者上次SOC转换完成
dh SOC13 正在处理或者上次SOC转换完成
eh SOC14 正在处理或者上次SOC转换完成
fh SOC15 正在处理或者上次SOC转换完成
复位类型: SYSRSn2
7ADCPWDNZR/W0hADC掉电(低电平有效)。此位控制所有在模拟核心内的模拟
电路上电和掉电。
0 所有在模拟核心内的模拟电路掉电
1 所有在模拟核心内的模拟电路上电
复位类型: SYSRSn
6-3RESERVEDR0h保留
2INTPULSEPOSR/W0hADC中断脉冲位置
0 中断脉冲产生出现在采样窗口结束时
1 中断脉冲产生出现在转换结束时
结果将在1个或多个周期之后锁存。对于所使用的详细配置的
精确的时序,请参考ADC时序表。
复位类型: SYSRSn
1-0RESERVEDR0h保留

11.16.2.2 ADCCTL2寄存器(Offset = 1h) [reset = 0h]

​ ADCCTL2在图11-27显示并在表11-17描述。

​ ADC控制2寄存器

​ 图11-27 ADCCTL2寄存器

image-20210106222449981

​ 表11-17 ADCCTL2寄存器域(字段)描述

域(字段)类型复位描述
15-13RESERVEDR0h保留
12-8RESERVEDR0h保留
7SIGNALMODER/W0hSOC信号模式。选择转换器的输入模式。使用AdcSetMode
函数更改信号模式。
0 单端模式
1 差分模式
复位类型: SYSRSn
6RESOLUTIONR/W0hSOC转换分辨率。 选择转换器的分辨率。使用AdcSetMode
函数更改分辨率。
0 12-bit分辨率
1 16-bit分辨率
复位类型: SYSRSn
5-4RESERVEDR0h保留
3-0PRESCALER/W0hADC时钟分频器。
0000 ADCCLK = 输入时钟 / 1.0
0001 Invalid
0010 ADCCLK = 输入时钟 / 2.0
0011 ADCCLK = 输入时钟 / 2.5
0100 ADCCLK = 输入时钟 / 3.0
0101 ADCCLK = 输入时钟 / 3.5
0110 ADCCLK = 输入时钟 / 4.0
0111 ADCCLK = 输入时钟 / 4.5
1000 ADCCLK = 输入时钟 / 5.0
1001 ADCCLK = 输入时钟 / 5.5
1010 ADCCLK = 输入时钟 / 6.0
1011 ADCCLK = 输入时钟 / 6.5
1100 ADCCLK = 输入时钟 / 7.0
1101 ADCCLK = 输入时钟 / 7.5
1110 ADCCLK = 输入时钟 / 8.0
1111 ADCCLK = 输入时钟 / 8.5
复位类型: SYSRSn
  • 42
    点赞
  • 171
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值