1. ADC触发与SOC配置:从概念到实战的深度解析
在嵌入式系统,尤其是工业控制、电机驱动和精密测量领域,模数转换器(ADC)的性能和灵活性直接决定了整个系统的精度与实时性。很多工程师在初次接触像TI AM261x这类高性能处理器时,面对其ADC模块动辄上百页的技术手册,尤其是关于触发(Trigger)和转换启动(SOC)的复杂配置,往往会感到无从下手。大家最常问的问题是:为什么需要这么多触发源?SOC到底在干什么?过采样和欠采样在实际项目中怎么用?
今天,我就结合TI AM261x的技术手册,把自己在多个电机控制项目里“踩坑”积累的经验,掰开揉碎了讲清楚ADC的触发机制与SOC配置。这不仅仅是寄存器配置的罗列,更是理解如何让ADC这个“数据采集员”高效、准时、准确地为你工作的核心逻辑。理解了这些,你就能设计出采样时序精准、资源利用高效、代码结构清晰的数据采集系统。
2. ADC触发机制:不只是“开始转换”的信号
很多人把ADC触发简单地理解为一个“开始转换”的开关信号,这其实低估了它的价值。在复杂的实时系统中,触发机制是协调ADC与系统中其他事件(如PWM周期、定时器中断、外部信号)同步的关键。它决定了采样的“时机”,而这个时机往往比采样本身更重要。
2.1 触发源全景图:你的ADC可以由谁唤醒?
AM261x的ADC模块提供了极其丰富的触发源,这绝不是冗余设计,而是为了满足不同应用场景的同步需求。手册中的触发源表(Table 7-159)是理解这一切的起点。我们可以将其归类为几个核心类型:
软件触发(ADCTRIG0):这是最基础、最灵活的触发方式。通过直接写寄存器(如
ADCSOCFRC1.SOCx位)来启动一次转换。它适用于非周期性的、由应用程序逻辑控制的采样,比如上电自检、手动启动校准或响应某个非实时事件。但它的缺点也很明显:时序完全由软件决定,会受中断延迟、任务调度的影响,无法保证精确的、周期性的采样间隔。定时器触发(ADCTRIG1-4):来自RTI(Real-Time Interrupt)模块的定时器事件。这是实现固定频率采样的经典方式。例如,你可以配置RTI0每1ms产生一个触发信号,ADC就会严格地每1ms采样一次。这种方式时序精准,不占用CPU资源,非常适合需要稳定采样率的应用,如温度监控、电池电压巡检。
ePWM触发(ADCTRIG8-27等):这是电机控制和数字电源等领域的“灵魂”配置。ePWM模块的ADCSOCA和ADCSOCB信号可以与PWM的载波周期、相位精确绑定。为什么这如此重要?想象一下在电机控制中,你需要精确地在PWM波形的“谷底”或“中点”时刻采样相电流,以避开开关噪声并获得最真实的电流值。ePWM触发让你可以将ADC采样点“钉死”在PWM周期的特定相位上,这是软件触发或普通定时器触发无法实现的硬件级同步精度。
eCAP触发(ADCTRIG72-79):捕获模块的触发输出。当eCAP捕获到外部信号的边沿事件(如编码器Z脉冲、过零检测信号)时,可以立即触发ADC采样。这常用于与外部事件严格同步的采样,比如在旋转机械的某个固定机械角度进行采样。
外部输入触发(ADCTRIG5):通过INPUTXBAR连接到某个GPIO引脚。这为系统提供了最大的灵活性,允许一个外部数字信号(如另一个处理器的同步信号、传感器的就绪信号)来启动ADC转换。
实操心得:触发源的选择策略选择触发源不是拍脑袋决定的,它基于你的系统时序需求。我的经验法则是:
- 追求绝对周期性和低CPU开销:用RTI定时器触发。
- 需要与PWM开关动作严格同步(如电机相电流采样):必须使用ePWM的ADCSOCA/B触发。
- 响应非周期性的外部事件:使用eCAP或外部GPIO触发。
- 调试、单次采样或非关键任务:使用软件触发。 在AM261x上,一个SOC只能选择一个触发源,但不同的SOC可以选择不同的触发源。这意味着你可以用ePWM1触发SOC0来采样电流,同时用RTI定时器触发SOC1来采样温度,实现多速率、多目的的混合采样策略。
2.2 SOC:转换任务的“工单”
理解了谁可以发出“开始工作”的指令(触发源),接下来就要看ADC收到指令后具体“做什么”。这就是SOC(Start-Of-Conversion)的概念。你可以把每个SOC看作一个预先定义好的“工单”。
一份完整的ADC转换“工单”(即一个SOC的配置)包含三个核心要素:
- 触发源(TRIGSEL):谁有权下发这个工单?(对应上一节的选择)
- 通道(CHSEL):要去哪个模拟通道采集数据?
- 采样窗口(ACQPS):给这个通道多长的“采样准备时间”?
AM261x的每个ADC模块支持最多16个独立的SOC(SOC0-SOC15)。这意味着你可以预先定义好16张不同的“工单”。例如,SOC0的工单是:“当ePWM1的ADCSOCA信号来时,去采样通道A0(电流),并给予20个SYSCLK周期的采样时间”。SOC1的工单可以是:“当RTI0定时器溢出时,去采样通道A1(温度),给予50个SYSCLK周期的采样时间”。
当指定的触发事件发生时,ADC仲裁逻辑就会找到对应的SOC“工单”,并立即安排一次转换任务。如果多个触发同时到来,SOC的优先级(可配置为轮询或固定优先级)决定了执行顺序。
3. SOC的精细配置:让每一次采样都恰到好处
配置SOC不仅仅是填写三个寄存器,每一个参数背后都有硬件特性和系统需求的考量。
3.1 通道选择(CHSEL)与输入模式
ADCSOCxCTL.CHSEL寄存器不仅选择了物理引脚,还隐含了输入模式(单端或差分)。这是由硬件连接决定的。
- 单端模式:测量输入引脚对地(VREFLO)的电压。配置简单,占用引脚少。在AM261x上,选择CHSEL=0~6分别对应ADCIN0~ADCIN6。
- 差分模式:测量两个输入引脚之间的电压差。抗共模干扰能力强,适合测量小信号。配置时,CHSEL的值对应了一对正负输入引脚。例如,CHSEL=0在差分模式下意味着正输入为ADCIN0,负输入为ADCIN1。
注意事项:差分模式的“坑”手册中提到了一个关键点:在差分模式下,ADC的原始输出码有一个+2112(或+64 LSB)的偏移。这是因为其内部设计将零点放在了量程中间(类似双极性输入)。如果你直接读取结果寄存器,会得到一个围绕2112左右的值。务必在软件中减去这个偏移量,或者按照手册说明,通过配置
adcX_cfg_1p1v[79:80]位来补偿这个偏移,否则你的电压计算会完全错误。这是我早期调试时浪费了整整一天才发现的坑。
3.2 采样窗口(ACQPS)的计算:不仅仅是时间
ADCSOCxCTL.ACQPS寄存器定义了采样保持电容的充电时间,单位是系统时钟(SYSCLK)周期数。公式是:采样窗口时间 = (ACQPS + 1) * SYSCLK周期。
为什么这个值不能随便设?它必须满足两个条件:
- 绝对最小值:手册规定,对于AM261x,ACQPS的最小值必须至少为16。这是硬性规定。
- 信号建立需求:采样窗口必须足够长,让信号源通过外部和内部阻抗(参见手册中的输入模型图),将采样电容充电到目标电压的0.5 LSB误差范围内。如果时间不够,采样值就不准确。
如何计算所需的ACQPS?这需要结合你的信号源阻抗(Rs)、ADC内部开关电阻(Ron)和采样电容(Ch)。手册的电气参数表会给出Ron和Ch的典型值。假设你的信号源阻抗Rs=100Ω,SYSCLK=200MHz(周期5ns)。一个简化的估算方法是,RC时间常数 τ = (Rs + Ron) * Ch。为了让电容充电到99.3%的精度(达到5倍时间常数),你需要的时间约为 5τ。那么ACQPS需要满足:(ACQPS + 1) * 5ns > 5τ假设计算出的5τ是100ns,那么ACQPS至少需要(100ns / 5ns) - 1 = 19。为了留有余量,我们通常会设置得更大一些,比如25或30。
实操技巧:ACQPS的调试方法在实验室里,最直观的调试方法是:对一个已知的稳定直流电压(如1.65V)进行高速采样。先将ACQPS设为一个较大的安全值(如63),记录采样值。然后逐步减小ACQPS,观察采样值的波动和偏差。当发现采样值开始出现明显的跳动或系统性偏差时,说明ACQPS已经不足。将ACQPS设置在此临界值之上并留有30%-50%的余量,就是可靠值。对于高频交流信号采样,这个窗口时间还影响了系统的带宽。
3.3 外部多路复用器(EXTCHSEL)的妙用
AM261x的SOC配置中有一个非常实用的功能:ADCSOCxCTRL.EXTCHSEL字段。它允许SOC在转换时,自动控制连接在ADC输入引脚上的外部模拟多路复用器(Mux)的地址线。
这解决了什么问题?芯片的ADC输入引脚数量是有限的(例如8个)。但你的系统可能需要采样20个温度传感器。传统做法是用GPIO控制Mux,在软件中先设置GPIO,再触发ADC,这引入了软件延迟和时序不确定性。
EXTCHSEL如何工作?
- 你将外部Mux的输出连接到芯片的某个ADC输入引脚(如ADCIN0)。
- 将Mux的地址选择线连接到芯片的
ADCxEXTMUX[3:0]输出引脚(这些引脚需要通过GPIO交叉开关配置映射到物理GPIO)。 - 在配置SOC时,
CHSEL选择ADCIN0,EXTCHSEL写入你想要选择的Mux通道号(例如3)。 - 当该SOC被触发时,硬件会自动在开始采样前,将
ADCxEXTMUX引脚设置为EXTCHSEL的值(即二进制0011),选通Mux的第3通道。采样结束后,这些引脚可以恢复或保持。
这样一来,切换采样通道完全由硬件在触发时刻同步完成,实现了与触发事件(如PWM边沿)的完美同步,消除了软件延迟,精度极高。这在需要快速巡回检测多路模拟量的系统中非常有用。
4. 触发中继器:实现高级采样策略的“神器”
如果说基础的SOC配置是“单次命令”,那么触发中继器(Trigger Repeater)就是实现复杂采样序列的“自动化脚本”。它是AM261x ADC模块中最强大、也最容易用错的功能之一。
4.1 核心功能解析
每个ADC实例有两个独立的中继器模块(REP1, REP2)。它们可以对输入的触发信号进行“加工”,再输出给一个或多个SOC。加工方式主要有四种:
过采样模式(Oversampling):
- 行为:收到一个输入触发脉冲后,会连续、背靠背地输出N+1个触发脉冲(N由
REPxN.NSEL配置)。 - 应用场景:这是最常用的功能之一。用于对同一个信号在极短时间内进行多次采样,然后将结果平均,以抑制随机噪声,提高有效分辨率。例如,配置
NSEL=15,那么一个ePWM触发就能自动产生16次连续的ADC转换。你只需要配置一个SOC(例如SOC0)使用该中继器作为触发源,并设置好PPB(后处理块)进行累加和平均,就能轻松实现16倍过采样,将有效位数从12位提升到14位左右。
- 行为:收到一个输入触发脉冲后,会连续、背靠背地输出N+1个触发脉冲(N由
欠采样模式(Undersampling):
- 行为:每收到N+1个输入触发脉冲,只输出1个触发脉冲。
- 应用场景:降低采样频率。例如,你的ePWM以100kHz频率产生触发,但某个传感器(如慢速温度传感器)只需要1kHz的更新率。你可以设置
NSEL=99,让中继器每100个输入脉冲才输出1个,从而用同一个高速定时源驱动多个不同速率的采样任务,简化了系统定时设计。
相位延迟(Phase Delay):
- 行为:将输出触发脉冲整体延迟
PHASE个SYSCLK周期。 - 应用场景:
- 硬件消隐:在电机驱动中,IGBT/MOSFET开关瞬间会产生巨大的电压毛刺。即使你在PWM波谷触发采样,毛刺可能仍未完全消除。通过设置一个几十到几百纳秒的相位延迟,可以等毛刺平息后再开始采样,获得更干净的信号。
- 多ADC交错采样:如果你有多个ADC模块(如ADC0, ADC1, ADC2)采样同一个高速信号,可以让它们使用同一个触发源,但为每个ADC的中继器设置不同的相位延迟(例如0, 20, 40个周期)。这样,三个ADC的采样点就在时间上均匀错开,等效地将系统采样率提升了三倍。
- 行为:将输出触发脉冲整体延迟
重触发扩展(Re-trigger Spread):
- 行为:在过采样模式下,控制连续两个输出触发脉冲之间的间隔(
SPREAD个SYSCLK周期)。 - 应用场景:当背靠背的采样间隔太短,信号源或前端运放来不及建立时,可以插入一个固定的扩展时间,保证每次采样前信号都已稳定。
- 行为:在过采样模式下,控制连续两个输出触发脉冲之间的间隔(
4.2 配置流程与避坑指南
配置触发中继器需要遵循一个清晰的流程,乱序配置可能导致不可预知的行为。
标准配置流程:
- 先配置SOC:将目标SOCx的
ADCSOCxCTL.TRIGSEL设置为REP1TRIG或REP2TRIG。 - 再配置中继器: a. 写
REPxCTL寄存器:设置MODE(过采样/欠采样),选择输入TRIGGER源(如ePWM1_SOCA),配置同步源SYNCINSEL(如果需要)。 b. 写REPxN.NSEL寄存器:设置重复次数(过采样N+1次,欠采样每N+1次过1次)。 c. 写REPxPHASE.PHASE寄存器:设置相位延迟。 d. 写REPxSPREAD.SPREAD寄存器:设置重触发扩展(仅过采样模式有效)。 - 配置后处理块(PPB):如果用过采样做平均,需要配置
PPBxLIMIT等寄存器来设定累加次数和触发阈值。
避坑指南:中继器配置的常见陷阱
- 陷阱一:NSEL=0时的误解:当
NSEL=0时,中继器在过采样和欠采样模式下都只是简单的“直通”,但它仍然可以施加相位延迟。很多人忽略了这一点,觉得NSEL=0中继器就没用。实际上,仅用相位延迟功能来统一调整多个SOC的采样时刻非常方便。- 陷阱二:触发溢出:手册明确指出,在过采样模式且
NSEL>0时,如果一个新的输入触发到来,而之前由该中继器触发的所有SOC尚未完成(即SOC标志位仍为pending),那么REPxCTL.TRIGGEROVF标志会被置位。你的中断服务程序必须检查并处理这个溢出标志,否则会丢失触发,导致采样序列混乱。一个稳健的做法是,在触发频率固定的应用中,确保(采样+转换时间) * (NSEL+1) < 触发周期。- 陷阱三:同步源的使用:中继器的
SYNCINSEL可以配置为ePWM的SYNCOUT等信号。同步事件会将中继器内部计数器(NCOUNT, PHASECOUNT)重置为空闲状态。这用于将中继器的重复序列与一个外部事件(如PWM周期开始)重新对齐,防止误差累积。在电机控制中,通常将中继器同步到PWM的时基零点。- 陷阱四:动态重配置:手册提到可以在中继器工作时更新
NSEL、PHASE、SPREAD和MODE寄存器,新值会在下一个输入触发到来时生效。这是一个强大功能,允许你动态改变采样策略。但务必注意,这是一个“影子寄存器”机制,写完后不会立即改变当前正在进行的序列。
4.3 实战案例:电机相电流采样与过采样平均
假设我们在一个三相电机控制项目中,需要采样两相电流(Ia, Ib)。我们使用ePWM1的周期匹配事件(CTR=0)来触发采样,希望在PWM周期的中点进行采样以避开开关噪声,并通过4倍过采样来抑制噪声。
步骤分解:
- 硬件连接:电流传感器输出接ADCIN0(Ia)和ADCIN2(Ib)。
- ePWM配置:配置ePWM1的时基周期,并设置当计数器等于周期值的一半(TBCTR = TBPRD/2)时,置位
ETSEL[SOCAEN]并产生ADCSOCA触发脉冲。 - 触发中继器配置:
- 使用REP1。
REP1CTL.TRIGSEL= ePWM1_ADCSOCA。 REP1CTL.MODE= 0 (过采样模式)。REP1N.NSEL= 3 (产生4次触发)。REP1PHASE.PHASE= 10 (根据开关噪声的衰减时间,延迟10个SYSCLK周期,约50ns后开始第一次采样)。REP1SPREAD.SPREAD= 0 (背靠背采样)。
- 使用REP1。
- SOC配置:
- SOC0:
TRIGSEL=REP1TRIG,CHSEL=0 (ADCIN0, Ia),ACQPS=25 (根据信号源阻抗计算)。 - SOC1:
TRIGSEL=REP1TRIG,CHSEL=2 (ADCIN2, Ib),ACQPS=25。 - 注意:SOC0和SOC1都使用同一个中继器触发源。当REP1产生一个触发脉冲时,ADC会按优先级(假设为轮询)依次执行SOC0和SOC1的转换。然后,由于NSEL=3,REP1会等待SOC0和SOC1都完成后(
ADCSOCFLG1相应位清零),立即产生下一个触发脉冲,如此重复4次。
- SOC0:
- 后处理块(PPB)配置:
- 将SOC0的结果送到PPB1,SOC1的结果送到PPB2。
- 配置
PPBxLIMIT= 4。 - 配置PPB工作在累加模式。
- 中断与数据处理:
- 配置ADC在PPB累加4次后(即完成一组过采样)产生中断。
- 在中断服务程序中,直接读取
ADCPPB1SUM和ADCPPB2SUM寄存器,它们已经是4次采样的累加和。将其右移2位(除以4),即可得到平均后的电流值。
通过以上配置,我们实现了:与PWM中点严格同步、具有硬件消隐延迟、自动进行4次采样并累加、最终由CPU读取平均值的完整电流采样链。整个过程几乎不占用CPU时间,精度和实时性都得到了保障。
5. 全局软件触发与同步策略
除了外设硬件触发,AM261x还提供了强大的全局同步软件触发机制,通过ADCSOCFRCGBSEL和ADCSOCFRCGB寄存器实现。
它解决了什么问题?假设你的系统有三个ADC模块(ADC0, ADC1, ADC2),需要绝对同时启动采样。如果你用普通的软件触发(分别写三个ADC的ADCSOCFRC1寄存器),由于写寄存器操作有先后顺序,采样启动时刻会有几个时钟周期的偏差。这在需要多个ADC严格同步采样的应用中(如多相电流同步测量)是不可接受的。
全局软件触发如何工作?
- 通过
ADCSOCFRCGBSEL寄存器选择要同步触发的ADC实例(例如,同时选中ADC0和ADC1)。 - 向
ADCSOCFRCGB寄存器写入要触发的SOC位域(例如,写入0x0003以触发SOC0和SOC1)。 - 关键点:硬件会保证,对于所有在
ADCSOCFRCGBSEL中被选中的ADC模块,其指定的SOC会在完全相同的SYSCLK周期内启动。这是硬件保证的同步,精度远高于软件顺序执行。
注意事项:同步的代价全局软件触发是同步的,但它需要访问系统级的模拟子系统寄存器,其访问延迟可能比访问单个ADC的寄存器稍大。在极端追求低延迟的触发场景中,需要权衡绝对同步性和触发延迟。对于大多数应用,这种延迟可以忽略不计。
6. 时钟、参考电压与模式选择:确保ADC工作的基石
在深入玩转触发和SOC之前,必须打好ADC的基础,否则所有高级功能都是空中楼阁。
6.1 时钟配置:速度与精度的平衡
ADC的时钟链是:SYSCLK->PRESCALE分频 ->ADCCLK。
SYSCLK是系统主时钟,用于生成采样窗口。ADCCLK是转换器核心时钟,仅在转换阶段有效,采样保持期间被门控关闭以省电。
关键计算:手册指出,一次转换需要约11.5个ADCCLK周期。ADCCLK的最大频率为66.67MHz。如果SYSCLK为默认的200MHz,那么ADCCTL2.PRESCALE必须至少为3,因为200MHz / 3 ≈ 66.67MHz。
配置建议:在满足ADCCLK不超过最大频率的前提下,尽量选择更高的ADCCLK以获得更快的转换速度。转换时间Tconv ≈ 11.5 / ADCCLK。更快的转换意味着在同一个采样窗口内可以完成更多次转换(对于过采样)或者更快地释放ADC资源。但要注意,更高的ADCCLK可能对电源噪声更敏感。
6.2 参考电压:精度之源
AM261x的ADC参考电压设计需要特别注意:
- 内部参考:仅ADC2模块内部关联了一个1.8V的精密参考缓冲器
REFBUF0。ADC0和ADC1没有内部参考缓冲器。 - 外部参考:所有ADC都可以使用外部参考电压。
- 关键硬件连接:
ADC_VREF*_G0引脚连接到ADC0和ADC1。ADC_VREF*_G1引脚连接到ADC2和REFBUF0。- 如果ADC0/ADC1想使用内部参考:必须在PCB上通过走线将
ADC_VREF*_G0和ADC_VREF*_G1连接起来。这是很多硬件工程师容易遗漏的点,会导致ADC0/ADC1无法工作或精度极差。
- 启用内部参考的步骤: a. 将
MASK_ANA_ISO寄存器设置为0x7(暂时隔离模拟模块,防止电压监控器误触发复位)。 b. 通过ADC_REFBUF0_CTRL寄存器使能参考缓冲器。 c. 将MASK_ANA_ISO设回0x0,重新使能电压监控器。 d. 通过TOP_CTRL.ADC_REF_COMP_CTRL使能所需的参考电压监控比较器。 e. 检查ADC_REF_GOOD_STATUS寄存器确认参考电压稳定。
血的教训:参考电压的坑我曾在一个项目中,ADC采样值始终飘忽不定,噪声很大。排查了软件配置、采样窗口、信号源整整两天,最后才发现是硬件工程师忘记了连接
ADC_VREF*_G0和ADC_VREF*_G1的0欧姆电阻。ADC0和ADC1实际上在没有稳定参考电压的情况下工作。务必在硬件设计审查和调试初期,就确认参考电压的连接和监控状态。
6.3 单端与差分模式的选择
- 单端模式:输入电压范围是0V到VREF(通常为3.3V或1.8V)。代码简单,但易受地噪声干扰。
- 差分模式:输入电压范围是-VREF/2到+VREF/2(以共模电压为中心)。抗干扰能力强,特别适合测量小信号或远距离传输的信号,但需要占用两个引脚,并且要注意共模电压必须在ADC允许的范围内。
模式切换:通过chsel_1p1v和diff_mode_1p1v位配置。注意,同一个ADC模块的不同SOC可以配置为不同的输入模式,只要它们使用不同的通道对。
7. 常见问题排查与调试技巧实录
即使理解了所有原理,调试ADC时依然会遇到各种问题。下面是我总结的一些常见故障现象和排查思路。
7.1 问题一:ADC完全没有转换,结果寄存器始终为0或不变。
排查步骤:
- 检查电源和参考电压:这是第一步也是最关键的一步。测量ADC的模拟电源引脚(VDDA)和参考电压引脚(VREF)电压是否稳定、准确。使用
ADC_REF_GOOD_STATUS寄存器检查内部参考状态。 - 检查时钟:确认
SYSCLK是否运行,ADCCTL2.PRESCALE配置是否正确,ADCCLK是否在允许范围内(≤66.67MHz)。可以通过测量某个GPIO翻转的时钟来间接验证。 - 检查ADC使能:确认
ADCCTL1.ADCPWDNZ位已被置1(上电ADC核心)。 - 检查触发路径:
- 对于软件触发:单步调试,确认写
ADCSOCFRC1寄存器的操作确实执行了。 - 对于硬件触发(如ePWM):使用示波器或代码检查触发源(如ePWM的SOCA信号)是否确实产生了。检查INPUTXBAR或触发路由配置是否正确。
- 对于软件触发:单步调试,确认写
- 检查SOC配置:确认目标SOC的
ADCSOCxCTL寄存器已正确配置(TRIGSEL, CHSEL, ACQPS)。特别是TRIGSEL不能是保留值或禁用状态。 - 检查中断与标志位:即使你不使用中断,也应轮询
ADCSOCFLG1.SOCx位。触发发生后,该位应由硬件置1,转换完成后由硬件清0(或软件读结果后清0)。如果该位从未置1,说明触发根本没到达SOC或SOC未就绪。
7.2 问题二:ADC有转换,但采样值不准、噪声大或跳变严重。
排查步骤:
- 检查模拟信号本身:用示波器直接测量ADC输入引脚上的信号,观察是否稳定、有无毛刺、噪声是否在预期内。这是区分硬件问题还是配置问题的关键。
- 检查采样窗口(ACQPS):这是最常见的原因。使用上一节介绍的方法,逐步增大
ACQPS值,观察采样值是否趋于稳定。如果稳定了,说明原ACQPS值太小,信号未充分建立。 - 检查参考电压噪声:测量参考电压引脚上的纹波。如果噪声大,需要在PCB上加强滤波,使用高质量的退耦电容(通常是一个10uF钽电容并联一个100nF陶瓷电容,并尽量靠近芯片引脚)。
- 检查接地:确保模拟地(AGND)和数字地(DGND)的单点连接良好,模拟信号走线远离数字噪声源(如时钟线、PWM输出线)。
- 检查输入模式:如果你配置的是差分模式,但硬件接的是单端信号(负输入端悬空或接地不理想),结果会非常混乱。确保硬件连接与软件配置匹配。
- 检查过采样与平均:如果使用了过采样和后处理块(PPB),检查
PPBxLIMIT是否设置正确,是否在足够数量的采样完成后再去读取ADCPPBxSUM寄存器。
7.3 问题三:使用触发中继器过采样时,采样序列混乱或丢失触发。
排查步骤:
- 检查触发溢出标志:在中断或主循环中检查
REPxCTL.TRIGGEROVF和ADCSOCOVF1寄存器。如果它们被置位,说明新的触发到来时,旧的转换序列尚未完成。你需要:- 增加
SPREAD值,拉长两次触发之间的间隔。 - 减少
NSEL(减少过采样次数)。 - 提高
ADCCLK(减少单次转换时间)。 - 降低源触发频率。
- 增加
- 检查SOC pending标志逻辑:中继器判断“所有关联SOC已完成”的依据是
ADCSOCFLG1中相应位的状态。确保你的程序在读取转换结果后,正确地清除了这些标志位(如果是自动清除模式则无需操作)。如果标志位未被清除,中继器会认为SOC一直处于pending状态,从而不会产生下一次触发。 - 验证同步源:如果你配置了中继器同步(
SYNCINSEL),确认同步信号是否按预期产生。一个意外的同步脉冲会重置中继器内部状态,打断正在进行的序列。
7.4 问题四:多ADC同步采样时,采样时刻有偏差。
排查步骤:
- 确认使用全局软件触发:对于要求绝对同步的采样,必须使用
ADCSOCFRCGB全局触发,而不是分别触发各个ADC。 - 检查ADC时钟同步:即使触发同步,如果各个ADC模块的
ADCCLK不同步,转换速度也会有细微差别。确保所有ADC的ADCCTL2.PRESCALE配置相同,并且由同一个SYSCLK分频而来。手册提到,对不同ADC模块写入不同的时钟分频值会导致它们异步工作。 - 检查采样窗口(ACQPS):即使转换同时开始,如果不同SOC的
ACQPS设置不同,采样保持阶段的开始和结束时间也会不同。对于需要严格同步采样的多个通道,应尽量使用相同的ACQPS值。
调试ADC是一个系统工程,需要软件、硬件知识结合,并善用示波器、逻辑分析仪和芯片的寄存器调试工具。从电源、时钟、参考电压这些基础开始排查,再到触发逻辑、SOC配置,最后才是算法处理,层层递进,才能高效地定位和解决问题。