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该模块设计用于同一芯片,允许同步采样或分时采样。
- 每个ADC16种模块可配置启动转换类型(SOCs)
- 每个ADC寄存器有16个独立的转换结果
- 每个ADC模块有多种触发源:S/W 立即触发所有软件ePWMs模块(ADCSOC A 或 B)、XINT2、Timer0/1/2、ADCINT1/2
- 每个ADC模块有四个后处理块:通过中断和校准满度偏移校准、设定值误差校准ePWM高/低/过零比较能力,触发采样延迟捕获
11.3 ADC模块框图
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采样窗口。ADCCTL有一个分频域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配置寄存器,设备复位后至少调用一次。不要直接写ADCCTL配置分辨率的寄存器值。在ADC处于空闲状态(未操作或悬挂)SOCs)可随时更改分辨率。在开始转换之前,不需要等待时间来改变分辨率。如果SOCs分辨率在运行或悬挂时发生变化,SOCs转换结果可能不正确。
-
电压基准:每一个ADC模块是独立的VREFHI和VREFLO在外部基准模式下,这些引脚被用作基准比来确定ADC转换的输入范围。关于如何提供基准电压,请参阅第.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 <= VREFLO ADCRESULTx = 0 当VREFLO < ADCINy < VREFHI ADCRESULTx = 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×(VREFHI−VREFLOADCINy−VREFLO) 当ADCINy >= VREFHI ADCRESULTx=4095 差分 Invalid Mode Invalid Mode 模拟信号转换为16位数字信号公式
模拟输入 数字结果 单端 Invalid Mode Invalid Mode 差分 当ADCINyP - ADCINyN <= VREFHI ADCRESULTx = 0 当-VREFHI < ADCINyP - ADCINyN <= VREFHI ADCRESULTx = 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(ADCINyP−ADCINyN+VREFHI) 当ADCINyP - ADCINyN > VREFHI ADCRESULTx = 65535
11.5 启动转换(SOC)操作原则
ADC触发和转换序列是通过可配置的启动转换(SOCs)来完成的。每个SOC是一个定义为单个通道的单个转换的配置集。在这个集合有三个配置:启动转换触发源、转换通道和获取(采样)窗口时间。在接收一个启动转换(SOC)配置之后,ADC外围包装器会保证指定的通道使用指定采样窗口时间被捕获。
可以根据需要为相同的触发器、通道、和/或采样窗口配置为多个启动转换(SOCs)。配置多个启动转换SOCs使用相同的触发器将允许触发器产生一系列转换。配置多个启动转换SOCs使用相同的触发器和通道将允许过采样。
-
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输入特性的值可以在芯片数据手册当中找到。
对于差分操作,下图差分输入模型中ADC输入特性的值可以在芯片数据手册当中找到。
这些输入模型应该与实际信号源的阻抗一起使用,来决定采样窗口时间。更多信息详见11.15.2节。
-
通道选择
每个SOC可配置转换任意ADC通道。通过ADCSOCxCTL.CHSEL寄存器为SOCx选择通道。根据信号模式的不同,这种选择是不同的。对于单端的信号模式,CHSEL的值为选择单引脚作为输入;对于差分的信号模式,CHSEL的值为选择寄偶引脚对作为正极和负极输入。总结下来如下表:
表 通道选择输入引脚
输入模式 CHSEL 输入 单端模式 0 ADCIN0 1 ADCIN1 2 ADCIN2 … … 15 ADCIN15 输入模式 CHSEL 正极输入 负极输入 差分 0 or 1 ADCIN0 ADCIN1 2 or 3 ADCIN2 ADCIN3 3 or 4 ADCIN4 ADCIN5 … … … 14 or 15 ADCIN14 ADCIN15 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 >120ns 120ns/5ns = 24 24 – 1 = 23 Signal 2 >444ns 444ns/5ns = 89 (round up) 89 – 1 = 88 Signal 3 >110ns 110ns/5ns = 22 22 – 1 = 21 Signal 4 >291ns 291ns/5ns = 59 (round up) 59 – 1 = 58 第2步,确定对应的ADC引脚连接到每个信号。这将高度依赖板子的布线。一旦引脚选定,决定CHSEL的值就比较简单了(详见下表)。
多信号采样接线示例
信号名称 ADC引脚 CHSEL寄存器值 Signal 1 ADCINA5 5 Signal 2 ADCINA0 0 Signal 3 ADCINA3 3 Signal 4 ADCINA2 2 有了上述表格的信息,就很容易生成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是当前优先级最高的SOCC SOC2 & SOC12同时收到触发器;SOC12在单向循环的第一圈;因此接下来SOC12通道会转换而SOC2通道要保持挂起D RRPOINTER的值变为指向SOC12;SOC12配置通道转换E RRPOINTER的值变为指向SOC2;SOC3是当前优先级最高的SOC 寄存器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在当前 单向循环轮排在首位; -
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中断结构的框图
-
中断溢出
如果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的结构。后面的子节解释了每个子模块的使用。
-
PPB偏移修正
在大多数应用中,外部传感器和信号源都会产生偏移。一个ADC偏移的全局修正值并不足以补偿他们的偏移,原因在于通道与通道之间的差异。后处理块(PPB)可以零开销去除这些偏移,在严格的控制环路中节省了大量的时间。要完成偏移修正,首先通过写ADCPPBxCONFIG.CONFIG指向期望的SOC,然后写一个偏移修正值到ADCPPBxOFFCAL.OFFCAL寄存器。后处理块(PPB)会自动地从原始的转换结果加上或减去OFFCAL寄存器的值,并将运算后的结果保存到ADCRESULT寄存器当中。对于12位或16位模式,这个加/减法将分别在低端达到0,在高端达到4095或65535。
注意:
-
写‘0’到OFFCAL寄存器可有效地禁止偏移修正功能,原始的转换结果会原原本本地传到ADCRFESULT寄存器当中。
-
多个PPBs能够指向同一个SOC,在这种情况下,PPB编号最高的OFFCAL的值将会被实际地应用。
-
特殊情况下,在SOC0上使用PPB需要多加小心,因为默认地所有PPB都会指向这个SOC0。这可能会导致无意识地用高编号的PPB的偏移修正值覆盖掉低编号的PPB的偏移修正值。
-
-
PPB误差校准
在大多数应用中,来自ADC转换的数据输出与设定点或期望值的误差必须计算出来。换句话说,对于控制计算而言,双极信号是必要的或方便的。PPB可以自动地完成这些功能,进而减少采样到输出的延迟且减少软件开销。
要完成误差校准,首先,通过写ADCPPBxCONFIG.CONFIG指向期望的SOC,然后向ADCPPBxOFFCAL.OFFREF寄存器写入一个值。后处理块(PPB)会自动从ADCRESULT寄存器中的值减去OFFREF寄存器的值,并保存到ADCPPBxRESULT寄存器当中。这个减运算会产生一个32位有符号数结果。当然,通过设置ADCPPBxCONFIG寄存器中的TWOSCOMPEN位,也能够在保存到ADCPPBxRESULT寄存器之前选择翻转计算值。
注意:
-
在12位模式,写入OFFREF寄存器的值不要大于12位;
-
对每个PPB而言,因为PPBxRESULT寄存器是独立的,能够将多个PPBs指向同一个SOC并得到各自不同的结果;
-
向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中断。
注意:
-
过零检测和限值比较参考ADCPPBxRESULT寄存器。这包括由OFFCAL和OFFREF寄存器应用的修正。TRIPHI和TRIPLO不能实现有符号比较。当使用限值比较功能时,推荐把OFFREF清为0。
-
如果需要对来自同一个ADC模块的不同PPB事件采取不同的操作,那么ADCEVTINT中断服务程序(ISR)必须读取ADCEVTSTAT寄存器中的PPB事件标志,以确定是哪个事件导致了中断。
-
如果需要对上限比较、下限比较和/或过零检测分别产生不同的ePWM触发,可以通过将多个PPB指向同一个SOC来实现。
-
过零检测电路认为的过零是从零到正。
-
-
PPB采样延时捕获
当多个控制环异步地在同一个ADC运行,那么一个ADC从两个或更多控制环请求这个机会会发生冲突,从而导致其中一个采样延迟。这在系统中显示为测量误差。通过知道延时发生的时间和已经发生的延迟量,软件可以采用外推法技术来减少误差。
为此,每个后处理块(PPB)在ADCPPBxSTAMP寄存器中都有DLYSTAMP位域(字段),此位域将记录在相关SOC被触发和开始转换之间的SYSCLK周期的数量。
这是通过占用一个基于SYSCLK的全局12位自由运行计数器来实现的,该计数器位于ADCCOUNTER寄存器的FREECOUNT字段中。当SOC相关的触发器到达时,这个计数器的值被加载到位字段ADCPPBxTRIPLO.REQSTAMP中。当SOC的实际采样窗口开始时,REQSTAMP中的值将从当前FREECOUNT值中减去,并存储在DLYSTAMP中。
注意:
-
如果超过4096个SYSCLK周期在SOC触发器和SOC实际开始采样之间消耗,FREECOUNT寄存器则会产生超过一次的溢出,导致DLYSTAMP的值不正确。所以在使用非常慢的转换来要小心,要防止这件事的发生。
-
如果通过软件触发相关的SOC,则采样延迟捕获功能将不起作用。然而,如果软件触发不同的SOC导致与PPB相关的SOC被延迟,将会正确地记录延迟时间。
-
11.11 开路/短路检测电路
开路/短路检测电路(OSDETECT)可用于检测系统中(ADC模块)引脚的错误。这个电路连接到ADC输入通道多路选择器之后以及采样保持S+H电路之前,如图11-11展示。
注意:
-
分压电阻允许偏差非常宽,因为这个特性不能用于核查转换准确度
-
对于实现和模拟输入通道的有效性,请查阅芯片数据手册
-
由于高驱动阻抗,需要采样保持S+H时间远大于ADC最小限值时间
图11-11 开路/短路检测电路
通过向ADCOSDETECT寄存器的DETECTCFG位域(字段)写入一个值,此电路可运行。在任何转换的采样保持S+H相位期间,这将导致此电路在输入信号源上叠加一个电压。这个电压和OSDETECT电路的驱动强度对不同的DETECTCFG设置由表11-9给出
表11-9 DETECTCFG设置
ADCOSDETECT.DETECTCFG | 源电压 | S4 | S3 | S2 | S1 | 驱动电阻 |
---|---|---|---|---|---|---|
0 | Off | Open | Open | Open | Open | Open |
1 | Zero Scale | Closed | Open | Open | Closed | 5K || 7K |
2 | Full Scale | Open | Closed | Closed | Open | 5K || 7K |
3 | 5/12 VDDA | Open | Closed | Open | Closed | 5K || 7K |
4 | 7/12 VDDA | Closed | Open | Closed | Open | 5K || 7K |
5 | Zero Scale | Open | Open | Open | Closed | 5K |
6 | Full Scale | Open | Open | Closed | Open | 5K |
7 | Zero Scale | Closed | Open | Open | Open | 7K |
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使能时等效输入电路
输入阻抗Rs和Cp
11.12 上电顺序
在芯片上电或系统级复位,ADC将被掉电或禁止。当ADC上电(启动)时,使用以下顺序:
- 设置PCLKCR13寄存器中的位,使能期望的ADC的时钟。
- ADCCTL2寄存器中PRESCALE位域中设置期望的ADC时钟分频器。
- 通过设置ADCCTL1寄存的ADCPWDNZ位使ADC上电。
- 采样之前允许一个延时,这个必要的时间见数据手册。
如果多个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时转换结果与满度值的二分之