Bootstrap

TMS320F280049C的ADC 阅读记录

//基本是手册的内容,手册地址

//我在第5节和第6节的时候比较有启发,其它的放上来只是因为我感觉花了点精力了不放白不放了

//至于图为什么会有水印,这个水印我真的不想加这是手册的,但是在CSDN你插入图片就会有= =。正如这个链接里写的从2017年开始就这样了

//文章会出现部分“//”的内容,这部份不是原文的,只是我的个人理解,如不准确我也没办法因为我也在学= =。凑合看吧= =。

1、介绍

ADC模块是一个12位逐次逼近(SAR)型ADC。ADC由一个核心和一个包装器组成。其核心由模拟电路组成,其中包括通道选择MUX、采样保持(S/H)电路、逐次逼近电路、电压参考电路和其在这里插入代码片他模拟支持电路。该包装器由配置和控制ADC的数字电路组成。这些电路包括用于可编程转换的逻辑、结果寄存器、模拟电路接口、外围总线接口、后处理电路和其他片上模块的接口。每个ADC模块由一个采样保持(s/h)电路组成。ADC模块设计为在同一芯片上进行多次复制,允许多个ADC同时采样或独立操作。ADC封装器是基于开始转换(SOC)的(参见第3节)
1.1、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中断
  • 可配置的中断放置
  • 触发[突发]模式
  • 四个后处理块,每个块都具有:
  • 饱和偏移校准
  • 设定值计算错误
  • 高、低、零交叉比较,与中断和ePWM跳闸能力相比
  • 触发器到样本的延迟捕获
    注:并非每个通道都可以从所有的adc中确定出来。检查设备的数据表,以确定哪些通道可用

1.2、ADC框图
在这里插入图片描述

2、ADC配置

一些ADC配置由SOC单独控制,而另一些配置则根据每个ADC模块进行全局控制。下表总结了基本的ADC选项及其可配置性级别。下部分将讨论这些配置。

选项可配置性
时钟(Clock)每个模块(Per module)(1)
分辨率不可配置(仅12位)
信号模式不可配置,仅能单端配置
基准电压源每个模块(外部或内部)(2)
触发器根据SOC(1)
转换通道根据SOC
采集窗口持续时间根据SOC(1)
EOC位置每个模块
触发[突发]模式每个模块(1)

(1)用不同的ADC模块写入这些值可能会导致ADC异步操作。关于adc何时同步或异步操作的指导,请参见第13.1节。
(2)较低的针计数包可以在多个adc中共享一个VREFHI引脚。在这种情况下,共享引用引脚的adc必须配置相同的引用模式

2.1、时钟配置
基本ADC时钟直接由**系统时钟(SYSCLK)**提供。此时钟用于生成ADC采集窗口。寄存器ADCCTL2有一个确定ADCCLK的前标值字段。ADCCLK用于时钟转换器
核芯需要大约10.5个ADCCLK的循环来将电压处理为转换结果。用户需要确定获取窗口的所需持续时间,请参见第13.2节。
注:确定ADCCTL2的适当值。按比例计算,请参见特定于设备的数据表,以确定最大的SYSCLK和ADCCLK频率
2.2、分辨率
ADC的分辨率决定了模拟范围被量化成数字值的精细程度。这个ADC支持12位的分辨率
2.3、参考电压
2.3.1、外部参考电压
每个ADC都有一个VREFHI输入和一个VREFLO输入。在外部参考模式下,这些引脚被用作比率参考,以确定ADC转换的输入范围。
关于如何提供参考电压的信息见第13.6节。
//又是13节= =。这13节这么多东西
注:

  • 在没有外部VREFLO信号的设备上,VREFLO内部连接到设备模拟地面VSSA。
  • 请参阅设备特定的数据表,以确定VREFHI和VREFLO的允许电压范围
  • 外部参考模式需要一个在VREFHI引脚上的外部电容器。有关所需的特定值,请参阅设备特定的数据表。

2.3.2、内部参考模式
在内部参考模式下,设备将电压引出到VREFHI引脚上。然后,VREFHI和VREFLO引脚设置ADC转换范围
内部参考电压可以被配置为2.5V或1.65V。当选择了1.65V的内部参考电压时,有效的ADC转换输入范围将为VREFLO至3.3V

注:内部参考模式还需要在VREFHI引脚上安装一个外部电容器。有关所需的特定值,请参阅设备特定的数据表。

2.3.3、联合参考
在某些封装上,可以组合于多个adc的电压参考引脚。在这种情况下,在选择外部和内部参考模式以及选择3.3V或2.5V的内部参考电压范围时,需要共地使用。
例如,如果将ADCB和ADCC参考引脚组合起来,且所需的参考模式为2.5V内部参考模式,则应运行以下参考配置代码:

//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);

//这函数在它本来的库里面还有个ADC开头即ADC_SetVREF
内部设备硬件将确保多个引用不会驱动冲突的电压到同一个引脚。因此,可以按任何顺序或在任意时间内配置引用。

2.3.4、选择参考模式
电压参考模式应通过使用C2000Ware中提供的SetVREF或ADC_setVREF功能来配置。使用这些功能确保正确的修剪加载在ADC修剪寄存器。在设备重置后,必须至少调用一次此函数。不要通过直接写入频率频率寄存器来配置电压参考模式。

2.4、信号模式
ADC支持单端信号传输。
在单端模式下,通过单针(ADCINx)对转换器的输入电压进行采样,参考VREFLO

2.5、预期转换结果
根据给定的模拟输入电压,下表给出了理想的期望数字转换。分数值被截断。

模拟输入量数字输出量
当 ADCINy ≤ VREFLOADCRESULTx = 0
当VREFLO < ADCINy < VREFHIADCRESULTx = 4096*(ADCINy - VREFLO)(VREFHI - VREFLO)
当 ADCINy ≥ VREFHIADCRESULTx = 4095

//其实就是基本的ADC转换计算方式,范围是VREFLO~VREFHI分成4096份即2^12

2.6、解释转换结果
根据给定的ADC转换结果,下表给出了理想的对应模拟输入。这对应于可能产生这种转换结果的模拟电压的可能范围的中心。

数字量模拟量
当 ADCRESULTy = 0ADCINx ≤ VREFLO
0 < ADCRESULTy < 4095ADCINx = (VREFHI - VREFLO)(ADCRESULTy/4096)+VREFLO
当 ADCRESULTy = 4095ADCINx ≥ VREFHI

//其实就是在说如果是DAC的过程

3、SOC操作原理

//这个SOC在器ADC库函数中出现的频率仅次于PBB

ADC触发和转换排序可通过可配置的转换器(SOC)来完成。每个SOC都是定义单个通道的单个转换的配置集。在该集合中,有三种配置:启动转换的触发源、要转换的通道和采集(示例)窗口持续时间。在接收到为SOC配置的触发器后,包装器将确保使用指定的获取窗口持续时间捕获指定的信道。

可以为相同的触发器、通道与/或采集窗口配置多个SOC。将多个SOC配置为使用相同的触发器将允许触发器生成一个转换序列。将多个SOC配置为使用相同的触发器和通道将允许过度采样。

//讲真光看这两段,我完全不知道它在说啥,不管了配个图先往下看完再说吧

在这里插入图片描述
3.1、SOC配置
每个SOC都有自己的配置寄存器,ADCSOCxCTL。在此寄存器中,可以将SOCx配置为触发源、转换通道和获取(示例)窗口持续时间。
//这样看来刚刚说的是SOC可以共用一个触发源触发ADC转换,因为每个
//SOC是独立的,转换通道也可以设为相同的

3.2、触发器操作
每个SOC都可以配置为在多个输入触发器中的一个上启动。针对SOCx的主要触发器选择在ADCSOCxCTL.TRIGSEL寄存器,可以选择:

  • 禁用(仅限软件)
  • CPU定时器0/1/2
  • GPIO:Input X-Bar INPUT5
  • ADCSOCA 或 ADCSOCB从各自的ePWM模式中//这个在它手册的ePWM章节很多次的说ePWM发出的信号可以触发ADC转换= =。

此外,当设置了ADCINT1标志或ADCINT2标志时,也可以触发每个SOC。这是通过配置ADCINTSOCSEL1寄存器(用于SOC0到SOC7)或ADCINTSOCSEL2寄存器(用于SOC8到SOC15)来实现的。这对于创建连续转换很有用。
//简单来说就是SOC*每个SOC的标志,有太多标志,分了两个寄存器配置SOC对应的触发标志

3.3、ADC采集(采样和保持)窗口
外部信号源在快速、有效地驱动模拟信号的能力也有所不同。为了达到额定分辨率,信号源需要将ADC堆芯中的采样电容器充电到信号电压的0.5LSBs范围内。采集窗口是采样电容器被允许充电的时间量,并可由ADCSOCxCTL为SOCx进行配置。ACQPS寄存器。

ACQPS是一个9位寄存器,可以设置为0到511之间的值,导致获取窗口持续时间为:
窗口采样持续时间 = (ACQPS + 1)∙(系统时钟 (SYSCLK) cycle time)
//因为这公式是用时间来算的,那换成频率这个ACQPS是不是可以看作是一个分频器呢?

  • 采集窗口持续时间是基于系统时钟(SYSCLK),而不是基于ADC时钟(ADCCLK)
  • 所选的采集窗口持续时间必须至少为一个ADCCLK周期
  • 该数据表将指定一个最小的采集窗口持续时间(以纳秒为单位)。用户负责选择满足此要求的采集窗口持续时间。

3.4、ADC输入模式
对于单端操作,单端输入模型(见下图)中的值的ADC输入特征可以在设备专用的数据表中找到。
在这里插入图片描述
这些输入模型应与实际的信号源阻抗一起使用来确定采集窗口的持续时间。更多信息请参见第13.2节//又是13节= =。真是。。。

3.5、 通道选择
每个SOC都可以配置为转换任何一个ADC通道。由ADCSOCxCTLL.CHSEL寄存器为SOCx选择此行为。下表总结了这一点。
//这些寄不寄存器倒无所谓,手册最后有附每个寄存器对应的函数= =。

输入模式CHSEL的值对应的通道
单端输入0ADCIN0
单端输入1ADCIN1
单端输入2ADCIN2
单端输入3ADCIN3
单端输入4ADCIN4
单端输入15ADCIN15

4、SOC配置示例

//它的示例是寄存器版本的= =。库函数版本有对应的枚举类型

下面几节提供了如何配置SOC以生成某些转换的一些具体示例。

4.1、从ePWM触发器进行的单一转换
要将ADCA配置为当ePWM计时器达到其周期匹配时对通道ADCIN1执行单个转换,需要做一些事情。首先,必须配置ePWM3生成SOCA或SOCB信号(在此语句中,SOC是ePWM模块中的信号)。有关如何做到这一点,请参阅增强脉冲宽度调制器模块(ePWM)一章。假设选择了SOCB。
任意选择SOC5。这16个soc中的任何一个都可以使用。
假设需要100ns采样频率为100MHz的SYSCLK窗口,则采集窗口持续时间应为100ns/10ns=10周期。因此,ACQPS字段应该设置为10-1=9。

//按照它这配置,就是说ePWM3中有CMPA/B/C/D和计数到0和1六个事件,
//然后六个事件都可以触发SOC,触发了SOC后启动对ADCIN1通道的转换

AdcaRegs.ADCSOC5CTL.bit.CHSEL = 1; //SOC5 will convert ADCINA1
AdcaRegs.ADCSOC5CTL.bit.ACQPS = 9; //SOC5 will use sample duration of 10 SYSCLK cycles 
AdcaRegs.ADCSOC5CTL.bit.TRIGSEL = 10; //SOC5 will begin conversion on ePWM3 SOCB

按照配置,当ePWM3匹配其周期并产生SOCB信号时,如果ADC空闲,ADC将立即开始采样信道ADCINA1(SOC5)。如果ADC很忙,则当SOC5获得优先级时,ADCINA1将开始采样(见第13.5节)。ADC控制逻辑将对指定的采集窗口宽度为100ns的ADCINA1进行采样。采集完成后,ADC将立即开始将采样电压转换为数字值。当ADC转换完成后,结果将在ADCRESULT5寄存器中获得(关于确切的样本、转换和结果锁存计时,请参见第13.12节)。

//从这里的配置可以看出ADCINA1的触发源SOC0~15的区别只是
//ADCSOC5CTL这部分的5改成对应的数字,
//然后启动,设置了对应的采样窗口,和中断源(TRIGSEL)

4.2、从ePWM触发器进行的过采样转换

为了将ADC配置为ADCINA1 4 次过采样,我们使用与前面示例相同的配置,但将它们应用于SOC5、SOC6、SOC7和SOC8

AdcaRegs.ADCSOC5CTL.bit.CHSEL = 1; //SOC5 will convert ADCINA1
AdcaRegs.ADCSOC5CTL.bit.ACQPS = 9; //SOC5 will use sample duration of 10 SYSCLK cycles 
AdcaRegs.ADCSOC5CTL.bit.TRIGSEL = 10; //SOC5 will begin conversion on ePWM3 SOCB
AdcaRegs.ADCSOC6CTL.bit.CHSEL = 1; //SOC6 will convert ADCINA1
AdcaRegs.ADCSOC6CTL.bit.ACQPS = 9; //SOC6 will use sample duration of 10 SYSCLK cycles 
AdcaRegs.ADCSOC6CTL.bit.TRIGSEL = 10; //SOC6 will begin conversion on ePWM3 SOCB
AdcaRegs.ADCSOC7CTL.bit.CHSEL = 1; //SOC7 will convert ADCINA1
AdcaRegs.ADCSOC7CTL.bit.ACQPS = 9; //SOC7 will use sample duration of 10 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 = 9; //SOC8 will use sample duration of 10 SYSCLK cycles 
AdcaRegs.ADCSOC8CTL.bit.TRIGSEL = 10; //SOC8 will begin conversion on ePWM3 SOCB

//所谓过采样就是提高采样频率后多次采样取均值吧= =。
//我是这样理解的,因为我印象的过采样一般以4为底数,指数增加

按照配置,当ePWM3匹配其周期并产生SOCB信号时,如果ADC空闲,ADC将立即开始采样信道ADCINA1(SOC5)。如果ADC很忙,则当SOC5获得优先级时,ADCINA1将开始采样(见第5节)。一旦SOC5的转换完成,SOC6将开始转换ADCINA1,SOC5的结果将被放置在ADCRESULT5寄存器中。所有四种转换最终将按顺序完成,结果分别为SOC5、SOC6、SOC7和SOC8的ADCRESULT5、ADCRESULT6、ADCRESULT6、ADCRESULT7、ADCRESRESULT8。

//也就是说,因为只使能了这四个SOC,而一个ADC模块(16个输入通道)只有一个ADC转换区域,
//这四个SOC配置会轮流进行,读完一个SOC立刻进行下一个SOC的读取,
//然后读取的结果存储到对应的结果寄存器存储,根据需要进行调用。

注:当收到ePWM触发时,ADC可以在SOC5之前对SOC6、SOC7或SOC8开始转换,这取决于收到ePWM触发时循环指针的位置。请参见第13.5节来了解如何选择下一个要转换的SOC

4.3、来自CPU计时器触发器的多次转换
//简单来说就是换了触发源再做一次示例
本示例将展示如何对具有不同采集窗口要求的多个信号进行采样。CPU1计时器2将用于生成触发器。要了解如何配置CPU计时器,请参见“系统控制和中断”一章(就是它原手册里的第三章不是本文)。

设计具有多信号的采样方案的一个很好的第一步是列出信号及其所需的采集窗口。由此,计算每个信号所需的SYSCLK循环数,然后计算ACQPS寄存器设置。如下表所示,其中假设SYCLK为100MHz(10ns的循环时间)

信号名采样窗口需求(ns)采集窗口SYSCLK周期ACQPS 寄存器的值
信号1>240ns240ns/10ns = 2424 - 1 = 23
信号2>883.333ns883.333ns/10ns = 8989 - 1 = 88
信号3>220ns220ns/10ns = 2422 - 1 = 21
信号4>585ns585ns/10ns = 2459 - 1 = 58

//也就是上表是它自己根据需求算出来的,是假设的情况,再通俗点,这个表应该叫做需求?

接下来决定连接哪些ADC针脚到每个信号。这将高度依赖于应用程序板的布局。一旦选择了针脚,就可以直接确定CHSEL的值(见下表)。

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

//也就是说这个表是它自定义的,自己定义这次要分别用哪四个引脚去测这四个信号

通过信息表,很容易生成SOC配置:

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 5; //SOC0 will convert ADCINA5
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 23; //SOC0 will use sample duration of 24 SYSCLK cycles 
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 3; //SOC0 will begin conversion on 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

//其实不难发现寄存器的配置和之前用ePWM的配置非常类似
//但是选择了不同的中断源,因此对寄存器TRIGSEL赋予了不同的值
//这些值在库函数版本里都有对应的枚举类型的,因此不用记具体哪个值对应哪个中断源

如配置的,当CPU1Timer2生成事件时,最终将依次对SOC0、SOC1、SOC2和SOC3进行采样和转换。ACINA5(信号1)的转换结果将在ADCRESULT0中。同样,ADCINA0(Signal信号2)、ADCINA3信号3(S3)和ADCINA2(Sigal4)的结果分别在ADCRESULT1、ADCRESULT2和ADCRESULT3中。

//其实就是说,无论你怎么配置SOC的转换配置,无论你怎么配置SOC的运行顺序
//SOC都会按照运行顺序依次转换,并将转换的结果存储到它对应的结果存储寄存器即ADCRESULTx中

注:ADC在收到CPU计时器触发时,可以在SOC0之前开始转换SOC1、SOC2或SOC3,这取决于收到COC0时循环指针的位置。请参见第5节,以了解如何选择下一个要转换的SOC。
//这个注释说明了SOC的转换顺序不是一尘不变的,你可以选择哪个通道优先转

4.4、SOCs的软件触发
在任何时候,无论SOC是否被配置为接受特定的触发器,软件触发器都可以设置要转换的SOC。这是通过在ADCSOCFRC1寄存器中写入比特来完成的。不等待CPU1计时器2生成触发的软件触发可以通过语句触发:

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

//也就是说转换不一定必须等触发源来触发
//某些紧急情况你需要立即让硬件检查ADC也可以这样直接触发转换机制

5、ADC转换优先级

当同时设置多个SOC标志时,两种优先级形式中的一种决定了它们的转换顺序。默认的优先级方法是循环使用的。在该方案中,没有一个SOC比其他方案具有更高的优先级。优先级取决于循环赛指针(RRPOINTER)。RRPOINTER映射在ADCSOCPRIORITYCTL寄存器在最后设置的SOC上。

//也就是说该模式下这个指针是指向你最后设置的SOC上的

最高优先级的SOC给出了大于RRPOINTER值的下一个值,在SOC15之后绕回SOC0。在重置时,该值为16,因为0表示已经发生了转换。当RRPOINTER等于16时,SOC0具有最高的优先级。当ADCCTL1通过设备重置。设置重置位,或者当写入标准寄存器时

下图给出了循环优先级方法的一个例子。//图比较大,这边分两次
A、复置后,SOC0为最高优先级的SOC,SOC7接收触发器;
SOC7配置的通道将立即被转换。

B、RRPOINTER改变,指向SOC 7;SOC8现在是最高优先级的SOC

C、SOC2和SOC12同时触发rcvd(//不知道翻译成啥);
跟着顺序循环SOC12是第一个
(//它这里只关心SOC12和SOC2在刚刚RRPOINTER指向SOC7的情况)
SOC12配置通道转换,SOC2待等待。

D、指针更改为指向SOC12;SOC2转换配置的通道。

E、RRPOINTER更改为指向SOC2;SOC3现在是最高优先级的SOC

//也就是说在循环模式下RRPOINTER是16,然后等待触发条件生效
//比如A的情况下只有SOC7生效,那么SOC7就开始转换,
//转换完成RRPOINTER指向SOC7进入B的情况,
//等待触发条件生效,到了C的情况时,有两个SOC同时被触发
//也就是SOC2和SOC12然后根据顺序模式SOC12会优先转换,
//SOC12转换完成后进入D的情况RRPOINTER指向SOC12这是SOC2才开始转换
//SOC2转换完成了就进入了E的情况RRPOINTER最终指向SOC2等待下一次任意的SOC触发
在这里插入图片描述
在这里插入图片描述
SOCPRIORITY在ADCSOCPRIORITYCTL寄存器,它能对所有SOC设置一个高优先级信号。当配置为高优先级时,这个SOC将在任何当前转换完成后中断循环轮,并将自己作为下一个转换插入其中。转换完成后,循环赛将继续在中断的地方。如果同时触发两个高优先级的SOC,则优先使用较低数字的SOC。高优先级模式首先分配给SOC0,然后按数值顺序递增。在超优先级字段中写入的值定义了非高优先级的第一个SOC。换句话说,如果将值4写入单优先级,则将SOC0、SOC1、SOC2和SOC3定义为高优先级,其中SOC0最高。
下图给出了一个使用高优先级SOC的示例//同样比较大
例如图中就将SOCPRIORITY的值设置为4
A、复位后,SOC4是循环上的第一个;
当SOC7触发时;
SOC7配置的通道将立即被转换;
B、RRPOINTER指向SOC7;
SOC8现在是循环上的第一个.
C、当SO2和SOC12同时被触发时;
SOC2中断循环轮,SOC2配置的通道被转换,而SOC12保持等待。
D、RRPOINTER 保持指向SOC 7;
SOC12已配置的信道现在已被转换。
E、转指针更改为指向SOC12;SOC13现在是循环里的第一个。
//也就是说当SOCPRIORITY = 4的时候会将前4个SOC单独拿出来,
//这四个被拿出来的SOC的优先级数字越大优先级越低
//拿了4个出来剩下的12个SOC继续组成一个循环,他们的顺序仍然按照默认循环的模式运行
//拿出来的4个种有一个触发时,例如图中是SOC2触发了,它将比任何一个处于默认循环的优先级高
//比如SOC2和SOC12同时触发时,原本根据默认循环应该先触发SOC12,
//但是SOC12并没有单独拿出来提升优先级,因此会先看单独拿出来的四个SOC0~3有没有触发的
//再去看SOC4~SOC15有没有被触发,因此SOC2和SOC12同时触发,会先让SOC2转换再触发SOC12
在这里插入图片描述
在这里插入图片描述

6、突发模式

突发模式允许单个触发器一次走过一个或多个循环SOCs。设置ADCBURSTCTL寄存器中的BURSTEN位为突发模式配置ADC包装器。这将导致忽略TRIGSEL的设置,

//也就是忽略了原本SOC设置的中断源,比如CPU定时器中断ePWM中断这些,本文4.3有说

但仅针对配置为循环操作的SOC(而不是高优先级)。

//也就是突发模式只适用于第5节介绍的处于循环的那部分SOC,高优先级的它不触发

所有循环soc都是基于ADCBURSTCTL寄存器的BURSTTRIG触发的,而不是TRIGSEL。在接收到突发触发器后,ADC包装器将不会设置所有循环soc进行转换,而是只设置(ADCBURSTCTL.BURSTSIZE + 1)SOCs。要设置的第一个SOC将是基于循环指针具有最高优先级的SOC,后续的SOC将被设置,直到设置了BURSTSIZE的SOC为止。

//突发模式下处于循环中的SOC0~SOC15的中断源都变成了BURSTTRIG触发,
//当BURSTTRIG触发时,会根据循环从SOC0开始转换直到你设置了BURSTTRIG的SOC就停止
//比如你设置了SOC7的BURSTTRIG,那么一旦BURSTTRIG触发了,转换将从SOC0开始循环转换
//直到转换到SOC7就不转换了。

注:当为突发模式配置ADC时,用户负责确保在收到下一个突发触发器之前允许每个突发转换完成
//比如刚刚说的SOC7设置了BURSTTRIG,转换会从SOC0转换到SOC7,你需要保证在这个过程中
//你的BURSTTRIG不会再次触发,也就是让你考虑转换是需要时间的= =。

6.1、突发模式的例子
突发模式可以用于在每个其他触发器上采样一组不同的信号。在下面的示例中,从CPU1定时器2在第一个触发器上转换ADCIN7和ADCIN5。ADCIN2和ADCIN3从CPU1定时器2的第二触发和之后每其他触发转换。所有信号都用20个SYSCLK周期宽的采集窗口进行转换,但可以根据需要为每个SOC配置不同的持续时间

AdcaRegs.BURSTCTL.BURSTEN = 1; //使能突发模式
AdcaRegs.BURSTCTL.BURSTTRIG = 3; //CPU定时器2触发突发模式转换
AdcaRegs.BURSTCTL.BURSTSIZE = 1; //conversion bursts are 1 + 1 = 2 conversions long
AdcaRegs.SOCPRICTL.bit.SOCPRIORITY = 12; //SOC0 到 SOC11 为高优先级
AdcaRegs.ADCSOC12CTL.bit.CHSEL = 7; //SOC12 will convert ADCINA7
AdcaRegs.ADCSOC12CTL.bit.ACQPS = 19; //SOC12 will use sample duration of 20 SYSCLK cycles
AdcaRegs.ADCSOC13CTL.bit.CHSEL = 5; //SOC13 will convert ADCINA5
AdcaRegs.ADCSOC13CTL.bit.ACQPS = 19; //SOC13 will use sample duration of 20 SYSCLK cycles 
AdcaRegs.ADCSOC14CTL.bit.CHSEL = 2; //SOC14 will convert ADCINA2
AdcaRegs.ADCSOC14CTL.bit.ACQPS = 19; //SOC14 will use sample duration of 20 SYSCLK cycles 
AdcaRegs.ADCSOC15CTL.bit.CHSEL = 3; //SOC15 will convert ADCINA3
AdcaRegs.ADCSOC15CTL.bit.ACQPS = 19; //SOC15 will use sample duration of 20 SYSCLK cycles

当接收到第一个CPU1定时器2触发器时,如果ADC空闲,将立即转换SOC12和SOC13。如果ADC很忙,一旦SOC12和SOC13的SOC获得优先级,它们将被转换。SOC12和SOC13的结果将分别出现在ADCRESULT12和ADCRESULT13中。SOC13完成后,RRPOINTER将给予SOC14最高优先级。因此,当接收到下一个CPU1Timer2触发器时,SOC14和SOC15将被设置为挂起并最终被转换。SOC14和SOC15的结果将分别出现在ADCRESULT14和ADCRESULT15中。随后的触发器将继续在转换SOC12和SOC13以及转换SOC14和SOC15之间切换。

//意思是寄存器中的BURSTSIZE决定了每次突发模式触发时会转换的SOC的数量
//比如上面代码里size设置为2了,因此每次突发事件触发时只转换两个SOC
//因此第一次接收到SOC时只转换SOC12和SOC13,下一次才转换SOC14和SOC15

虽然上面的示例在两组转换之间切换,但可以使用类似的方法实现三组或更多不同的转换集。

6.2、突发模式图表示例
图例中SOCPRIORITY = 4,BURSTEN = 1,BURSTSIZE = 1
A、复位后SOC4是循环中的第一个
突发事件触发时;
SOC4和SOC5的设置和配置通道立即转换
B、RRPOINTER指向SOC5
现在SOC6是循环中的第一位
C、突发事件和SOC1同时触发;
SOC1、SOC6和SOC7都判定为被触发
SOC1中断循环轮,SOC1配置通道转换,SOC6和SOC7待等待。
//也就是SOC1先转换,即有高优先级的先转换,才到循环中的SOC
D、RRPOINTER仍然指向5;SOC6/SOC7配置的通道现在被转换。
E、转指针更改为指向SOC7;SOC8现在是循环赛轮上的1,等待突发事件
在这里插入图片描述
在这里插入图片描述

7、EOC和中断操作

每个SOC都有相应的转换结束(EOC)信号。该EOC信号可用来触发ADC中断。ADC可以被配置为在采集窗口结束时或在电压转换结束时产生EOC脉冲。这是使用ADCCTL1寄存器中的位插入位来配置的。确切的EOC脉冲位置请参见第12节。

每个ADC模块都有4个可配置的ADC中断。这些中断可以由16个EOC信号中的任何一个触发。可以直接读取每个ADCINT的标志位,以确定关联的SOC是否完成,或者中断可以传递给PIE

//也就是说ADC四个中断,四个中断的中断源可以是16个SOC的任意一个的EOC信号,
//四个中断的中断标志位都是ADCINTx,比如中断1就是ADCINT1

注:ADCCTL1。ADCBSY位很清楚并不表示一组SOC中的所有转换都已经完成,只是表示ADC已经准备好处理下一个转换。若要确定一个SOC序列是否完成,请将一个ADCINT标志链接到该序列中的最后一个SOC,并监视该ADCINT标志

//也就是说ADCBSY这个标志位只能表示ADC是否空闲,并不能说明某一个SOC是否转换完成
//比如说你预期的SOC还没触发,ADC还是空闲时,ADCBSY当然能显示空闲,而你的SOC也还没转换完成

下图为ADC中断结构的方框图
在这里插入图片描述
7.1、中断溢出
如果EOC信号会在ADCINTFLG寄存器中设置一个标志,但该标志已经设置,则会发生中断溢出。默认情况下,溢出中断将不会传递给PIE模块。当一个中断被设置在ADCINTFLG寄存器同时又被设置于ADCINOVF寄存器,此溢出标志仅用于检测是否发生了溢出,它不会阻止进一步中断到PIE模块的传播。
当可能发生ADC中断溢出时,应用程序应该检查ISR内部或后台循环中适当的附加 ADCINTOVF标志,并在检测到溢出时采取适当的操作。下面的代码片段演示了如何在尝试清除ADCINT标志后检查ISR内的附件标志。
//也就是说有个专门的寄存器ADCINTOVF记录是否发生了中断溢出

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
}

7.2、持续中断模式
ADCINTSEL1N2和ADCINTSEL3N4寄存器中的INTxCONT位配置了当ADCINTFLG尚未从之前的中断中清除时如何处理中断。默认情况下将禁用此模式,并且不会向PIE发出额外的重叠中断。通过激活此模式,ADC中断将始终到达PIE。 ADCINTOVF仍然被设置,如果发生中断 ADCINTFLG寄存器仍将被设置。
//也就是说设置INTxCONT,比如INT1CONT,那么ADC的INT1中的ADCINTFLG还没清除时如何处理
//正常来说ADCINTFLG还没清除说明中断还没完成,不应该再向PIE发中断

7.3、早期中断配置模式
启用早期中断模式可以允许应用程序在ADC结果准备好之前进入ADC中断服务例程。这允许应用程序做任何必要的预工作,以便应用程序可以在ADC结果可用时立即对它们采取作用。然而,早期中断的时间可能还为时过早,应用程序可能需要浪费时间,直到更新的ADC结果可用。为了防止这种情况,ADC中断进入早期中断模式的时间可以通过加法周期寄存器中的偏移字段进行配置。
//也就是你可以在ADC出结果之前做一些预处理

  • 要使用可配置的中断时间,ADC必须处于早期中断模式。要实现这一点,请将ADCCTL1中的INTPULSEPOS清除为0。
  • ADCINTCYCLE寄存器的OFFSET值设置ADCINT标志之前SOC脉冲的下降边缘之后的附加SYSCLK周期的次数。
  • 如果偏移量的值超过EOC,则ADC中断将与EOC一起产生。
  • 当 INTPULSEPOS位置设置为1时,写入要OFFSET的值将不会对中断生成产生任何影响。

8、后处理块(PPB)

//之前说了库函数里处理最多的就是PPB和SOC,但是PPB里面大部分都是关于校准和偏移的
//但是我真的不是很明白它要怎么用,因此这里就只是普通机翻一下就算了= =。不做太多感想

每个ADC模块包含四个后处理块(PPB)。这些块可以使用ADCPPBxCONFIG与16个结果寄存器中的任何一个相关联。配置位字段。每个PPB可以同时删除与ADCIN通道相关联的偏移量,减去一个参考值,标记一个零交叉点,并标记一个高或低的比较限制。此外,零交叉和比较标志可以跳闸一个PWM和/或产生一个中断。PPB还能够记录与PPB相关的SOC被触发到实际开始被采样之间的延迟。下图显示了每个PPB的结构。后续的部分解释了每个子模块的使用情况。

//光看这些还是不知道它在说啥= =。还是先不管,先往后看
在这里插入图片描述
8.1、PPB抵消校正
在许多应用中,外部传感器和信号源会产生一个偏移量。ADC偏移量的全局修剪不足以补偿这些不同通道不同的偏移量。后处理块可以以零开销消除这些偏移量,在紧密的控制回路中节省许多循环。

偏移校正通过首先指向 ADCPPBxCONFIG.CONFIG来完成。配置到所需的SOC,然后将偏移校正值写入ADCPPBxPOFFCAL.OFFCAL寄存器。后处理块将自动从原始转换结果中添加或减去OFFCAL寄存器中的值,并将其存储在附加寄存器中。这种加减,低端,0饱和,高端饱和,4095饱和。

注:

  • 向OFFCAL寄存器写入0可以有效地禁用偏移校正特性,从而将原始结果不变地传递给累积寄存器。
  • 可以将多个ppb指向同一个SOC。在这种情况下,实际应用的OFFCAL值将是数字最高的PPB的OFFCAL值。
  • 特别是,当在SOC0上使用PPB时需要小心,因为所有的PPB默认都指向这个SOC。这可能导致较低编号PPB无意较高编号PPB的偏移校正。

8.2、PPB错误计算
在许多应用程序中,必须从ADC转换的数字输出中计算出来自设定值或期望值的错误。在其他情况下,双极信号对于控制计算是必要的或方便的。PPB可以自动执行这些功能,将样本减少到输出延迟,并减少软件开销
误差计算是通过首先指向ADCPPBxCONFIG来完成的。配置到所需的SOC,然后将一个值写入ADCPPBxOFFCAL.OFFREF寄存器。后处理块将自动从加法处理值中减去OFFREF寄存器中的值,并将其存储在ADCPPBxRESULT寄存器中。这个减法将产生一个符号扩展的32位结果。还可以通过在ADCPPBxCONFIG寄存器中设置双压缩位,在存储在ADCPPBxRESULT寄存器之前有选择地反转计算值
注:

  • 不要将大于12位的值写入OFFREF寄存器。
  • 由于PPBxRESULT寄存器对于每个PPB都是唯一的,因此可以将多个PPB指向同一个SOC,并为每个PPB得到不同的结果。
  • 向OFFREF寄存器写入0可以有效地禁用错误计算特性,从而将附加值不变地传递给ADCPPBxRESULT寄存器。

//总的来说就是8.1和8.2有数值相关校准的处理,然后要怎么配置后就可以校准之类的= =。

8.3、PPB极限检测和零交叉检测
许多应用程序对ADC转换结果执行限制检查。PPB可以自动对高、下限或每当ADCPPBxRESULT更改符号时执行检查。基于这些比较,它可以自动生成到PWM的访问和/或中断,将样本降低到ePWM延迟,并减少软件开销。该功能还允许具有安全意识的应用程序在没有任何CPU干预的情况下,基于ePWM的ADC转换而跳闸ePWM。

为了启用此功能,首先指向ADCPPbxcoxfig。配置到所需的SOC,然后将一个值写入一个或两个寄存器ADCPPBxTRIPHI。limithi和ADCPPBxTRIPLO。限制(零检测不需要进一步配置)。当超过这些限制时,PPBxTRIPHI位或PPBxTRIPLO位将设置为加法TRIPLO位。请注意,加法器寄存器中的PPBxZERO位是由EOC来门控的,而不是通过ADCPPBxRESULT寄存器中的符号更改来门控的。
ADCEVTCLR有相应的位来清除这些事件标志。ADCEVTSEL寄存器有相应的位,允许事件传播到PWM。 ADCINTSEL寄存器有相应的位,允许事件传播到PIE。
在给定ADC模块的所有PPB之间共享一个PIE中断,如下图所示。
注:

  • 如果需要对来自同一ADC模块的不同PPB事件采取不同的操作,则附件ISR将必须读取附件寄存器中的PPB事件标志,以确定是哪个事件导致了中断。
  • 如果需要单独生成不同的高比较、低比较和/或零交叉的ePWM行程,这可以通过将多个ppb指向同一个SOC来实现。
  • 零交叉检测电路认为零的结果为正的。
    在这里插入图片描述
    //也就是说四个ADC中断里PPB中断共用一个标志位ADCEVTINT

8.4、PPB样品延迟捕获
当多个控制循环在同一ADC上异步运行时,来自两个或多个循环的ADC请求有可能会发生碰撞,导致其中一个样本被延迟。这显示为系统中的一个测量误差。通过知道这个延迟何时发生和已经发生的延迟量,软件可以使用外推技术来减少误差。
为此,每个PPB在ADCPPBxSTAMP寄存器中都有字段数据戳。此字段将包含从关联SOC被触发到它开始转换之间的SYSCLK循环数。这是通过拥有一个基于SYSCLK的全局12位自由运行计数器来实现的,该SYSCLK在加法计数器寄存器的字段自由计数中。当关联的SOC的触发器到达时,该计数器的值将被加载到位字段ADCPPBxTRIPLO中。REQSTAMP.当该SOC的实际示例窗口开始时,从当前的自由计算值中减去请求戳中的值并存储在数据戳中。
注:
如果SOC触发器和SOC采集的实际开始之间经过超过4096个SYSCLK周期,自由计票寄存器可能溢出一次,导致不正确的数据戳值。在使用非常缓慢的转换时要谨慎,以防止这种情况的发生。
如果通过软件触发相关的SOC,则样本延迟捕获将不起作用。但是,如果软件触发不同的SOC导致与PPB相关的SOC被延迟,它将正确地记录延迟

9、打开/短路检测电路(故障检测)

开/短路检测电路(渗透检测)可用于检测系统中的引脚故障。该电路在通道选择多路复用器后,但在S+H电路之前,都可以连接到ADC输入端,如图所示。
注:

  • 分压器的电阻公差可能变化很大,因此该特性不应用于检查转换精度。
  • 模拟输入通道的实现和可用性请参考设备数据手册。
  • 由于高驱动阻抗,需要的S+H持续时间远远超过ADC最小时间。
    在这里插入图片描述
    该电路可以通过将一个值写入 ADCOSDETECT寄存器中的DETECTCFG来操作。这将导致电路在任何转换的S+H阶段给输入端提供电压。下表给出了不同检测电路的电压和驱动强度。
    在这里插入图片描述
    9.1、实施方案
    具有渗透检测实现的代表性电路包括具有串联电阻RS的信号源、分流电容器CP、等效的渗透检测电阻和电压声检测,可用作计算进入采样电容器的信号电平的基础。渗透检测和声检测是由渗透检测电路提供的等效输入电阻和电压源,对于不同的配置设置的值如上表所示。如果信号源VS驱动OS检测功能,将输入信号导为S/H时参见下图。
    在这里插入图片描述
    输入阻抗RS和CP可以是信号源的组成部分,或者它们可以在设计中实现,以前提信号或控制信号沉降时间以满足S/H要求。在使用渗透检测特性时,必须考虑输入路径,因为这将会影响转换结果。例如,当启用该特性时驱动输入信号将通过RS将信号VS连接到渗透检测电路,并影响ADC结果。更大的CP值(在大于数百个pF的量级内)将需要使用更高的ACQPS,以确保输入处的信号在转换前已经稳定。
    要启用电路,请执行以下操作:
    1、配置ADC用于转换(例如,通道、SOC、ACQPS、预调用器、触发器等)。
    2、为所需的分压器连接设置附加寄存器,如表13-7所示。
    3、启动一个转换,并检查转换结果。
    您必须根据输入侧的驱动内容以及RS和CP的值来解释结果。如果VS信号可以与输入引脚断开,则电路可用于检测输入引脚,如下节所述。

9.2、检测到一个打开的输入引脚
通过循环通过各种侦测设置,输入信号将被拉到源电压。具有良好驱动强度(引脚未打开)的输入将受到的影响最小。但是,如果引脚打开,则采样电压将接近表13-7中规定的源电压。

9.3、检测到一个较短的输入引脚
通过循环通过各种侦测设置,输入信号将被拉到源电压。一个驱动强度有限的输入(引脚不短路)将被拉向每个电源电压。但是,如果引脚短路,信号将保持在相同的电压。

10、通电序列

当设备通电或系统级别重置时,ADC将被关闭并禁用。打开ADC电源时,请使用以下顺序:
1.设置该位以在PCLKCR13寄存器中启用所需的ADC时钟
2.在ADCCTL2的预前字段中设置所需的ADC时钟分频器。
3.通过在ADCCTL1中设置Adcpwdnz位来启动ADC。
4.允许采样前的延迟。必要的时间请参见数据手册。

如果同时为多个ADC上电,则可以在一个写入指令中对所有ADC执行步骤1和步骤3。此外,只要在所有adc都开始启动后发生,就只需要一次延迟。

11、ADC校准

在制造和测试过程中,德州仪器校准adc的增益、偏移量和线性,缓冲dac的偏移量以及pgs的增益和偏移量这些修剪设置作为c-可调用功能的一部分被嵌入到TI保留的OTP内存中。

  • Device_cal()函数将ODP内存中ADC和DAC偏移和PGA增益和偏移的偏移值复制到各自的修剪寄存器
  • 对于分辨率和信号模式的每个可能的组合,都需要一个不同的偏移修剪。GetAdcOffsetTrimOTP(Uint16)函数取对应于ADC、分辨率和信号模式的输入值,并从OTP存储器返回相应的偏移修剪值,然后用户将其移到ADC偏移修剪寄存器中。
  • Device_cal()中的修剪功能在C2000软件中可调用,如ADC_setOFFSETTRIM()、ADC_setINLTRIM()、DAC_setDACTRIM()和PGA_setGAINTRIM()。这些函数从在测试过程中存储值的TI保留的OTP存储源位置以及复制到修剪值的模拟模块寄存器目的地获取修剪值。

在加载适当的工厂装饰之前,ADC(和其他模块)将不能保证在数据表规范内运行。类似地,如果将工厂设置以外的修剪值放入修剪寄存器中,则ADC(和其他模块)将不能保证在数据表规范内运行。

引导ROM将调用校准功能,因此应该在没有用户干预的情况下首先填充修剪值。但是,如果修剪由于模块重置而清除或由于其他原因而修改,则用户可以调用校准函数(在头文件中定义)。

11.1、ADC零偏移校准
零偏移误差定义为在VREFLO处转换电压时发生的与0的差值。零偏移误差可以是正的或负的。为了纠正这个错误,一个相同的大小和相反的极性的调整被写入附加框装饰寄存器。这个寄存器中包含的值将在结果可用之前应用于ADC结果寄存器中。该操作完全包含在ADC核心中,因此结果的时间将不会受到影响,并且ADC的全部动态范围将保持为任何修剪值。
使用GetAdcOffsetTrimOTP(UInt16)功能,可以通过工厂校准的偏移误差校正加载附加配置修剪寄存器。如果需要,用户可以修改附加寄存器以补偿应用程序环境引起的额外偏移错误,但这通常不是实现数据表指定的性能所必需的。
注:无论转换器的分辨率如何,每个附加装饰步骤的大小都是(VREFHI-VREFLO)/65536。
使用以下步骤,在12位单端模式下重新校准ADC偏移量:
1、将 ADCOFFTRIM为+112步骤(0x70)。这增加了一个人工偏移来解释可能驻留在ADC核心中的负偏移。
2、在VREFLO(内部连接)上执行16个转换中的多个,累积结果(例如,32*16个转换=512转换)。
3、将累积的结果除以16个的倍数(例如,对于512个转换,除以32)。
4、将 ADCOFFTRIM设置为112,作为步骤3的结果。

12、ADC时间

将模拟电压转换为数字值的过程被分解为S+H相和转换相。ADC样品和保持电路(S+H)由SYSCLK时钟,而ADC转换过程由ADCCLK时钟。ADCCLK是通过根据ADCCTL2寄存器中的标前字段来划分SYSCLK来生成的。
S+H持续时间是被转换的SOC的ACQPS字段的值,加上1,乘以SYSCLK周期。用户必须确保此持续时间同时超过1个ADCCLK周期和数据表中指定的最小S+H持续时间。转换时间约为10.5个ADCCLK循环。确切的转换时间总是SYSCLK的整个周期。具体时间详见第13.12.1节中的计时图和表。

12.1、ADC定时图
下图显示了在以下假设下的两个SOC的ADC转换时间:

  • SOC0和SOC1被配置为使用相同的触发器
  • 当触发器发生时,没有其他SOC正在转换或挂起
  • 循环赛指针处于导致SOC0先转换的状态。
  • 附件被配置为在SOC0的转换结束时设置一个ADCINT标志(该标志是否传播到CPU以导致中断是由PIE模块中的配置决定的)。
    表13-8描述了以下计时图中的参数。表13-9列出了ADC的时间安排。
参数描述
TshS+H窗口的持续时间。在此窗口的末端,S+H电容器上的值成为要转换为数字值的电压。持续时间由(ACQPS+1)SYSCLK循环给出。ACQPS可以为每个SOC单独配置,因此对于不同的SOC,tSH不一定是相同的。注:无论设备时钟设置如何,S+H电容器上的值都将在S+H窗口结束前大约5ns被捕获。
tLAT从S+H窗口结束到ADC导致ADCRESULTx寄存器中的锁存的时间。如果在此之前读取了ADCRESULTx寄存器,则将返回以前的转换结果。
tEOC从S+H窗口结束到下一个ADC转换的S+H窗口开始的时间。后续的样本可以在转换结果被锁定之前开始。后续的样本可以在转换结果被锁定之前开始。
tINT从S+H窗口结束到设置ADCINT标志的时间(如果已配置)。如果设置了ADCCTL1寄存器中的插入位位,则tINT将与被锁在结果寄存器中的转换结果相一致。如果插入位位为0,则tINT将与S+H窗口的末端重合。如果tINT触发ADC结果寄存器的读取(直接通过DMA或通过触发一个读取结果的ISR间接),必须注意确保读取发生在结果锁存之后(否则,如果之前的结果如果插入位为0,并且附加周期寄存器中的偏移字段不是0,则在设置ADCINT标志之前将会有偏移SYSCLK周期的延迟。此延迟可用于输入ISR或恰好在样本准备就绪时触发DMA。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13、 附加说明

//合着前面那么多说看第13节,到了第13节才发现是补充说明,简直就简直了

以下部分包含其他实用信息。

13.1、确保同步操作
为了获得最佳性能,设备上的所有adc都应同步运行。设备数据表指定了不同操作模式不同的参数在同步和异步模式下的性能
为确保同步运行,设备上的所有adc都应保持同步操作。这是通过向所有adc写入使所有adc的采样和转换阶段的配置来精确对齐的。实现这一目标的最简单的方法是为每个ADC写入相同的SOC配置值,用于触发器选择和ACQPS(S+H持续时间)。
13.1.1、基本同步操作
下面的示例在ADCA和ADCB上配置两个soc,每个都具有相同的触发选择和ACQPS值。这将导致ADCA和ADCB之间的同步操作。对于具有两个以上ADC的设备,可以使用相同的原则用于同步所有ADC。

Example: Basic Synchronous Operation
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

在这里插入图片描述
从图13-14中需要注意以下几点。首先,对于相同数量的SOC,ACQPS值必须相同,但对于不同数字的SOC,可以使用不同的ACQPS值。因此,同步操作不需要一个单一的全局S+H时间,而是只有同时采样的通道需要相同的S+H持续时间。本例中的另一个重要一点是,任何通道选择值都可以用于任何SOC。最后,本示例假设进行循环操作。如果要使用高优先级的SOC,则必须在所有adc上配置相同的优先级

13.1.2、与多个触发器源的同步操作
只要每组SOCs具有相同的触发选择和ACQPS设置,就可以在使用多个触发源的同时仍然实现同步操作。
下面的示例演示了在使用三个SOCs和两个触发源时,ADCA和ADCB之间的同步操作。图13-15显示,任何相对触发时间的组合仍然会导致同步操作。

Example: Synchronous Operation With Multiple Trigger Sources
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

在这里插入图片描述
请注意,除软件触发外,可以使用在三角字段中选择的任何触发源。没有办法同时为所有adc发出软件触发器,因此很可能会导致异步操作。只要所有ADCINTSOCSEL1和ADCINT1或SOCSCSEL2寄存器配置相同,ADCINT1或TASCINT2也可以用作触发器。
13.1.3、与SOC编号不均匀的同步操作
如果只使用一个触发源,一个ADC可以比仍然同步运行的同时使用其他adc更多的SOC。

Example: Synchronous Operation With Uneven SOC Numbers
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 SOCB

在这里插入图片描述
请注意,如果在所有SOC完成转换之前再次出现触发器,ADCB将立即在SOC0上开始转换,而ADCA在SOC2完成之前不会再次开始转换SOC0。这将导致异步操作,因此必须注意不要溢出触发器。
在这里插入图片描述
13.1.4、不重叠的转换
如果用户可以保证转换时间不会重叠,那么就没有必要在所有adc上相同地配置所有SOC,以实现相当于同步操作的性能。例如,如果系统中的两个ADC触发器来自两个ePWM源,它们总是失相180度,那么SOC0可以用于具有不同触发源和不同ACQPS值的ADCA和ADCB。

Example: Operation with Non-overlapping Conversions
//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

在这里插入图片描述
13.2选择采集窗口持续时间
为了正确操作,必须让ADC的输入信号有足够的时间给样品充电并保持电容器Ch。通常,选择S+H持续时间,使采样电容根据可容忍的沉降误差充电到最终值的½LSB或¼LSB范围内。
所需沉降时间的近似值可以确定使用RC沉降模型。该模型的时间常数由以下方程表示:
在这里插入图片描述
所需的时间常数数由方程表示:
在这里插入图片描述
所以总的S+H时间应该至少设置为:
在这里插入图片描述
设备数据手册中ADC输入模型提供以下参数:
• n = ADC分辨率(in bits)
• RON = ADC 采样开关电阻(in Ohms)
• CH = ADC 采样电容 (in pF)
• Cp = ADC 信道寄生输入电容 (in pF)

以下参数依赖于应用程序的设计:
• settling error = 可容忍的沉降错误(in LSBs)
• Rs = ADC 驱动电路源阻抗 (in Ohms)
• CS = ADC输入引脚上的电容 (in pF)

例如,假设有以下参数:
• n = 12-bits
• RON = 500Ω
• CH = 12.5pF
• Cp = 12.7pF
• settling error = ¼ LSB
• Rs
= 180Ω
• Cs
= 150pF

时间常数将计算为:
在这里插入图片描述
并且所需的时间常数的数目将是:
在这里插入图片描述
所以S+H时间应该至少设置为:
37.8 ns·7.13=270ns
如果SYSCLK=为100MHz,则每个SYSCLK为10ns。S+H持续时间应为270ns/10ns=27.0SYSCLKs,因此该输入的ACQPS应设置为至少上限(27.0)-1=26。
虽然这给出了所需采集窗口的粗略估计,但更好的方法是设置ADC输入模型、源阻抗/阻容模型以及香料(或类似软件)中的任何板寄生虫,并模拟以验证采样电容达到所需的精度
注:设备数据表将指定一个最小的ADCS+H窗口持续时间。不要使用所提供的持续时间小于此规范的ACQPS值。

13.3、实现同时采样
虽然每个ADC没有双S+H电路,但很容易实现同时采样。这是通过在两个或多个ADC模块上设置SOC触发器以使用相同的触发器源来实现的。下面的例子演示了基于ePWM3事件的x3同时采样。对ADCINA3、ADCINB5和ADCINC5进行采样。使用了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

当接收到ePWM3触发器时,所有三个adc将立即开始并行转换。所有的结果都将出现在每个ADC的加法器0寄存器中。请注意,这假设在收到触发器时,所有adc的触发器都是空闲状态。如果一个或多个adc很忙,那么样本将不会完全同时发生。

13.4、结果寄存器映射
对系统中的每个内存总线控制器重复执行ADC结果和ADC PPB结果。总线控制器包括所有位于特定部件系列和部件号上的C28xcpu、C28xdma和cla。对于每个总线控制器,不需要任何访问配置来允许对结果寄存器的读取访问,并且在多个总线控制器试图同时读取ADC结果的情况下也不会发生争用。

13.5、内部温度传感器
内部温度传感器测量设备的连接温度。传感器的输出可以通过内部连接与ADC进行采样。这可以通过在tsnsctl寄存器中设置启用位来在ADCB上的通道ADCIN14上启用。
要将温度传感器读数转换为温度,请将温度传感器读数传递给F28004x_TempSensorConv.c中的GetTemperatureC()函数中。

13.6、设计一个外部参考电路

图13-19显示了外部电压参考产生电路的基本组织结构。所有的ADC模块都应共享一个单一的参考电压产生源。这将最小化ADC模块之间的参考电压不匹配。然后,在被驱动到基准引脚之前,应该通过具有良好带宽和低输出阻抗的精确运算放大器来缓冲基准电压。高参考引脚之间的电容器应放置在PCB上,尽可能靠近引脚,以帮助吸收高频电流。可能需要与该电容串联的串联电阻(通常为<1Ω),以确保光学放大器的稳定性。

也可以在一个操作放大器驱动程序之间共享两个参考引脚。该组织结构如图13-20所示。与每个参考引脚都有专用操作放大器缓冲区的情况相比,其性能略有降低,但仍然有可能实现数据手册中的所有ADC规范。
在这里插入图片描述
在这里插入图片描述

;