TMS320F2838x ADC同步采样配置:从原理到电机控制实战
1. 项目概述与同步操作的核心价值在电机控制、并网逆变器或者多轴伺服驱动这类对实时性要求极高的嵌入式系统中我们常常需要同时采集多路模拟信号比如三相电流、母线电压、位置传感器反馈等。这时候如果几个ADC模块各采各的采样时刻存在微秒甚至纳秒级的偏差后续的算法比如克拉克变换、锁相环算出来的结果就会“失真”轻则控制环路产生抖动重则系统失稳。TMS320F2838x这类高性能微控制器集成了多个独立的ADC模块ADCA ADCB ADCC ADCD其核心价值就在于能让这些ADC“齐步走”实现真正意义上的同步采样。所谓ADC同步操作其本质就是让设备上所有的ADC模块在采样和转换这两个关键阶段在时钟周期级别上保持精确对齐。这不仅仅是让它们“同时开始”而是确保从采样开关闭合Sample、电容保持Hold到逐次逼近转换Conversion的整个流程时序完全一致。数据手册里那些漂亮的性能参数比如信噪比SNR、无杂散动态范围SFDR往往都是在同步模式下测得的。如果配置不当ADC运行在异步模式这些指标可能会打折扣在高精度应用里这点性能损失可能就是成败的关键。要实现这种锁步lockstep操作并不是简单地把所有ADC的使能位打开就行。它需要工程师对ADC的启动转换SOC配置、触发机制和时序有透彻的理解。你需要像指挥一个交响乐团一样为每个ADC的每个声部SOC设定相同的节拍触发源和相同的音符时长采样窗口。接下来我就结合在多个电机控制项目中的实战经验拆解F2838x ADC同步操作的配置要点、常见陷阱以及那些数据手册里不会明说的调试技巧。2. 同步操作的核心原理与配置基石要让多个ADC同步工作核心思想是消除所有可能导致时序差异的变量。你可以把它想象成让多个短跑运动员在同一个起跑枪声下以完全相同的姿势起跑并且跑步的步频和步幅也强制一致。在F2838x的ADC语境下这意味着以下几个关键配置点必须完全一致。2.1 触发源TRIGSEL的统一指挥触发源是ADC开始一次采样转换过程的“发令枪”。要实现同步所有ADC的对应SOC例如SOC0必须使用同一个“枪声”。这个枪声可以来自ePWM模块的SOCA/B事件、CPU定时器、外部GPIO事件通过X-BAR等。最关键的一点是这个触发信号必须同时在同一个SYSCLK周期内送达所有ADC的对应SOC配置寄存器。硬件上像ePWM产生的SOC事件是广播到所有ADC模块的因此天然满足这个条件。这也是为什么在同步应用中ePWM是最常用、最可靠的触发源。一个重要的禁忌是软件触发。通过写ADCSOCFRC1寄存器来强制启动SOC你无法保证写入所有ADC该寄存器的指令能在同一个周期内完成。CPU执行指令有先后哪怕你写在一行代码里编译器也可能将其分解为多个存储指令。因此绝对不要试图用软件触发来实现同步其结果必然是异步的。2.2 采样窗口ACQPS的精确对齐采样窗口即采样保持SH阶段的持续时间由ACQPS寄存器位控制。其实际时间为(ACQPS 1)个SYSCLK周期。如果两个ADC的同一个SOC比如都是SOC0对这个参数的设置不同那么一个ADC的采样电容还在充电另一个可能已经结束采样进入转换了这直接破坏了采样时刻的一致性。因此对于需要同步采样的那组SOC它们的ACQPS值必须严格相等。这里有一个容易混淆但非常重要的概念同步操作并不要求所有SOC都使用同一个全局的ACQPS值。例如SOC0和SOC1可以使用不同的ACQPS值。只要ADCA的SOC0和ADCB的SOC0的ACQPS相同ADCA的SOC1和ADCB的SOC1的ACQPS相同那么当SOC0被触发时两个ADC的采样窗口对齐当SOC1被触发时两个ADC的采样窗口也对齐。这为不同通道需要不同采样时间的应用提供了灵活性。2.3 优先级与突发模式Burst Mode的协同配置F2838x的ADC支持轮询Round-Robin和高优先级两种调度模式。在同步操作中所有ADC的SOC优先级配置必须相同。如果ADCA的SOC0被设置为高优先级而ADCB的SOC0是默认的轮询优先级那么当一个高优先级触发到来时ADCA会立即响应SOC0而ADCB可能还在处理队列中的其他SOC同步立刻被破坏。突发模式Burst Mode允许一个触发信号启动一连串的转换。在同步配置下所有ADC的突发模式使能、突发触发源和突发大小Burst Size也必须配置成相同的值。否则一个ADC触发后转换1个通道另一个ADC触发后转换4个通道它们的时序很快就会分道扬镳。2.4 基础同步配置代码实例与解析理解了以上原则我们来看一个最基础的同步配置例子。假设我们需要使用ePWM3的SOCB事件同步触发ADCA和ADCB的SOC0分别采样通道A4和B0。// 配置 ADCA SOC0 AdcaRegs.ADCSOC0CTL.bit.CHSEL 4; // SOC0 转换 ADCINA4 通道 AdcaRegs.ADCSOC0CTL.bit.ACQPS 19; // 采样窗口 (191) 20 个 SYSCLK 周期 AdcaRegs.ADCSOC0CTL.bit.TRIGSEL 10; // 触发源选择 ePWM3 SOCB (具体值需查表) // 配置 ADCB SOC0 - 关键TRIGSEL 和 ACQPS 必须与 ADCA 的 SOC0 一致 AdcbRegs.ADCSOC0CTL.bit.CHSEL 0; // SOC0 转换 ADCINB0 通道通道号可以不同 AdcbRegs.ADCSOC0CTL.bit.ACQPS 19; // 必须与 ADCA SOC0 的 ACQPS 相同 AdcbRegs.ADCSOC0CTL.bit.TRIGSEL 10; // 必须与 ADCA SOC0 的 TRIGSEL 相同这段代码的精髓在于CHSEL通道选择是可以按需设置的它决定了采哪个物理引脚不影响同步时序。而TRIGSEL和ACQPS则是同步的“生命线”必须保持一致。当ePWM3的SOCB事件产生时它会同时到达ADCA和ADCB的SOC0配置逻辑两者都会以持续20个SYSCLK周期的相同采样窗口开始对各自指定的通道进行采样随后同时进入转换阶段。这就实现了精确的同步采样。3. 高级同步场景与实战配置策略在实际项目中需求往往比基础同步更复杂。可能需要多个触发源、各ADC采样通道数量不同甚至混合使用不同分辨率。下面我们探讨几种高级场景及其配置策略。3.1 多触发源下的同步操作一个系统里可能有多个定时触发需求。例如一个ePWM模块以50kHz频率触发关键电流采样另一个CPU定时器以1kHz频率触发温度、电压等慢速信号采样。只要遵循“同一组同步SOC使用同一触发源”的原则多触发源依然可以保持全局同步。假设系统需求如下快速环ePWM3 SOCB (TRIGSEL10) 触发采样电流通道A4, B0需要较短的采样时间ACQPS19。慢速环CPU Timer1 (TRIGSEL2) 触发采样温度通道A0, B2信号变化慢需要较长采样时间ACQPS63。配置代码如下// ---- 配置 ePWM3 SOCB 触发的同步采样组 (SOC0, SOC1) ---- // ADCA SOC0 SOC1 AdcaRegs.ADCSOC0CTL.bit.CHSEL 4; // 电流通道 A4 AdcaRegs.ADCSOC0CTL.bit.ACQPS 19; // 短采样窗 AdcaRegs.ADCSOC0CTL.bit.TRIGSEL 10; // ePWM3 SOCB AdcaRegs.ADCSOC1CTL.bit.CHSEL 5; // 另一电流通道 A5 AdcaRegs.ADCSOC1CTL.bit.ACQPS 19; AdcaRegs.ADCSOC1CTL.bit.TRIGSEL 10; // ADCB SOC0 SOC1 - 保持与ADCA对应SOC的TRIGSEL和ACQPS一致 AdcbRegs.ADCSOC0CTL.bit.CHSEL 0; // 电流通道 B0 AdcbRegs.ADCSOC0CTL.bit.ACQPS 19; AdcbRegs.ADCSOC0CTL.bit.TRIGSEL 10; AdcbRegs.ADCSOC1CTL.bit.CHSEL 1; // 电流通道 B1 AdcbRegs.ADCSOC1CTL.bit.ACQPS 19; AdcbRegs.ADCSOC1CTL.bit.TRIGSEL 10; // ---- 配置 CPU Timer1 触发的同步采样组 (SOC2) ---- // ADCA SOC2 AdcaRegs.ADCSOC2CTL.bit.CHSEL 0; // 温度传感器通道 A0 AdcaRegs.ADCSOC2CTL.bit.ACQPS 63; // 长采样窗 AdcaRegs.ADCSOC2CTL.bit.TRIGSEL 2; // CPU Timer1 // ADCB SOC2 AdcbRegs.ADCSOC2CTL.bit.CHSEL 2; // 另一温度通道 B2 AdcbRegs.ADCSOC2CTL.bit.ACQPS 63; // 必须与ADCA SOC2的ACQPS一致 AdcbRegs.ADCSOC2CTL.bit.TRIGSEL 2; // 必须与ADCA SOC2的TRIGSEL一致在这个配置下ePWM3 SOCB事件会同步触发ADCA和ADCB的SOC0和SOC1CPU Timer1事件会同步触发两者的SOC2。虽然系统中有两个不同的触发源但在每个触发源内部ADC之间的操作仍然是严格同步的。时序上这两组触发可以任意发生互不干扰。3.2 SOC数量不均衡时的同步挑战与应对有时ADCA需要采样6个通道而ADCB只需要采样4个通道。如果使用单一的、周期性的触发源比如一个ePWM事件直接配置会导致问题。因为ADCB完成4个转换后就空闲了而ADCA还在进行第5、第6个转换。此时下一个周期触发到来ADCB会立刻开始新一轮的SOC0转换而ADCA必须等当前的SOC5转换完成后才能响应新的触发同步立刻失效。解决方案是使用突发模式Burst Mode。将ADCA需要多采的那几个通道例如SOC4 SOC5配置为由同一个触发启动的突发转换。这样一个触发脉冲会启动ADCA的一连串转换比如SOC0-SOC5而ADCB则是它自己的一串转换SOC0-SOC3。关键在于突发模式下的所有转换其采样窗口是背靠背连续进行的并且突发开始的时刻对所有ADC是同步的。只要确保突发大小设置正确且下一个触发脉冲的间隔时间大于最长的那个突发转换序列的总时间就能维持同步。配置要点使能ADCA和ADCB的突发模式ADCBURSTCTL寄存器。为ADCA和ADCB设置相同的突发触发源BURSTTRIGSEL。设置ADCA的突发大小为6ADCB的突发大小为4。将ADCA的SOC0-SOC5和ADCB的SOC0-SOC3的TRIGSEL都配置为“突发模式触发源”。计算总转换时间总时间 (突发大小) * (采样时间转换时间)。确保触发周期 总时间。3.3 混合12位与16位分辨率下的同步策略F2838x的ADC支持12位和16位模式但16位模式的转换时间比12位模式长。如果ADCA配置为12位ADCB配置为16位即使使用相同的触发和ACQPS由于转换阶段无法对齐同步也会失败。实现混合分辨率同步的唯一方法是分时复用。你不能让一个ADC以12位转换而另一个以16位转换的同时还保持同步。但你可以让所有ADC先以12位模式同步采样转换一批通道然后由CPU统一切换所有ADC到16位模式再用另一个同步触发事件采样转换另一批通道。操作流程初始化所有ADC为12位模式。配置一组SOC如SOC0 SOC1用于12位同步采样使用触发源A如ePWM1。配置另一组SOC如SOC2 SOC3用于16位同步采样使用触发源B如ePWM2但此时先不使能触发源B。在触发源A的转换完成中断ADCINT中执行以下操作 a. 读取12位结果。 b.通过软件几乎同时地修改所有ADC的ADCTL2.bit.RESOLUTION位将其从12位切换到16位。注意需要查阅手册确认切换该位是否需要特殊序列或延迟。 c. 使能触发源B例如启动另一个ePWM计数器或产生一个软件事件通过X-BAR触发。触发源B事件同步启动所有ADC的16位模式转换SOC2 SOC3。在触发源B的转换完成中断中读取16位结果并将所有ADC分辨率切换回12位为下一个周期做准备。这种方法牺牲了部分时间密度但保证了在每种分辨率下采样动作本身是同步的。它适用于对同步性要求高但对不同信号有不同分辨率要求的场景。3.4 非重叠转换另一种“等效同步”思路如果两个ADC的触发事件在时间上绝对不会重叠那么即使它们的配置不完全相同也能达到“性能上等效于同步”的效果。典型的例子是两个相位相差180度的ePWM事件分别触发两个ADC。假设ePWM3的SOCA和SOCB输出两个互补的、占空比很小的脉冲分别触发ADCA和ADCB。// ADCA 由 ePWM3 SOCB 触发 AdcaRegs.ADCSOC0CTL.bit.CHSEL 4; AdcaRegs.ADCSOC0CTL.bit.ACQPS 19; AdcaRegs.ADCSOC0CTL.bit.TRIGSEL 10; // ePWM3 SOCB // ADCB 由 ePWM3 SOCA 触发 AdcbRegs.ADCSOC0CTL.bit.CHSEL 0; AdcbRegs.ADCSOC0CTL.bit.ACQPS 19; // ACQPS 可以不同因为触发时刻错开 AdcbRegs.ADCSOC0CTL.bit.TRIGSEL 9; // ePWM3 SOCA在这种情况下ADCA和ADCB永远不会同时进行转换因此不存在相互间的干扰系统的整体性能与它们独立运行时相同。但这并不是严格意义上的同步采样因为两个ADC的采样时刻在时间轴上是错开的。它适用于那些不需要瞬时同时采样但需要高吞吐率交错采样的场景。设计时必须通过严格的时序分析确保一个ADC的转换过程完全结束后另一个ADC的触发才会到来避免硬件冲突。4. 采样窗口ACQPS的计算与优化实战ACQPS的设置绝非随意填一个值它直接决定了采样电容能否在给定的时间内充电到足够的精度。设置过小信号未稳定转换结果误差大设置过大浪费转换时间限制了系统最高采样率。数据手册会给出一个最小值但实际值需要根据你的前端驱动电路来计算。4.1 基于RC模型的理论计算ADC的输入可以等效为一个RC充电电路。计算所需采样时间t_acq的步骤如下确定系统参数n: ADC分辨率12或16。R_ON: ADC内部采样开关电阻数据手册提供例如500Ω。C_H: ADC采样电容数据手册提供例如12.5pF。C_P: ADC引脚寄生电容数据手册提供例如12.7pF。Settling Error: 可接受的建立误差通常设为1/2 LSB或1/4 LSB以获得更好精度。R_S: 你的前端驱动电路的输出阻抗包括运放输出阻抗、串联电阻等。C_S: ADC输入引脚上的外部电容包括滤波电容、PCB寄生电容。计算时间常数ττ (R_S R_ON) * C_H R_S * (C_S C_P)这个公式计算的是整个充电回路的总时间常数。计算所需的时间常数个数kk ln( (C_S C_P) / C_H ) / ln(1 / (Settling Error / (2^n)))这个公式有点复杂它描述了需要多少个τ才能使电压建立到目标精度。可以理解为误差越小LSB分数越小需要的τ个数k就越多。计算最小采样时间t_acq_min k * τ转换为ACQPS值ACQPS ceil(t_acq_min / T_sysclk) - 1其中T_sysclk是系统时钟周期例如200MHz对应5ns。ceil是向上取整。举例计算假设一个12位ADC应用前端运放输出阻抗R_S100Ω输入引脚有一个C_S100pF的滤波电容。从手册查得R_ON500Ω,C_H12.5pF,C_P12.7pF。要求建立误差小于1/2 LSB。τ (100500)*12.5e-12 100*(100e-1212.7e-12) 7.5ns 11.27ns ≈ 18.77nsSettling Error 0.5 / 4096 ≈ 0.000122k ln((100e-1212.7e-12)/12.5e-12) / ln(1/0.000122) ≈ ln(9.016) / ln(8192) ≈ 2.199 / 9.011 ≈ 0.244(这里似乎有误原公式可能笔误或理解有偏差。更常见的简化计算是k -ln(Settling Error)对于1/2 LSBk -ln(0.5/4096) ≈ -ln(1.22e-4) ≈ 9.01) 我们采用常见公式k -ln( settling_error )其中settling_error是相对误差1/2 LSB对应 0.5/40961.22e-4。k -ln(0.5/4096) ≈ 9.01t_acq_min 9.01 * 18.77ns ≈ 169.1ns若T_sysclk5ns(200MHz)则所需周期数 169.1ns / 5ns 33.82向上取整为34个周期。ACQPS 34 - 1 33因此在这个例子中ACQPS至少应设置为33。重要提示这个RC模型是一个简化估算。它没有考虑运放的压摆率Slew Rate限制。如果信号变化幅度很大运放可能需要先以最大压摆率“追赶”信号然后才进入线性建立阶段。此时RC模型计算的时间可能不足。4.2 仿真验证与实测调整对于高性能或高精度应用强烈建议使用SPICE工具如LTspice TINA-TI进行仿真。TI通常提供ADC的输入模型IBIS或SPICE子电路。你可以在仿真中搭建包括信号源、驱动运放、RC滤波网络和ADC输入模型的完整电路然后施加一个阶跃信号直接观察采样点SH开关断开瞬间的电压与最终稳定值的误差是否小于1/2 LSB。这是最可靠的方法。实测调整技巧保守起步在理论计算或仿真值的基础上增加20%-50%的余量作为初始ACQPS值。注入测试信号向ADC输入一个已知的、干净的直流或低频正弦波信号。采集与评估运行ADC采集大量样本。分析噪声和误差如果ACQPS设置过小你会看到转换结果的噪声明显增大或者存在固定的偏移误差。因为采样电容未充分充电电压未稳定到真实值。计算采集数据的标准差噪声和与预期值的平均误差。迭代优化逐步减小ACQPS值重复测试直到噪声和误差开始显著增大。此时的ACQPS值加回一些余量比如2-3个周期就是最优值。温度与电压验证在极端工作温度高温、低温和电源电压条件下重复测试确保ACQPS在整个工作范围内都足够。5. 同步操作相关的硬件设计与软件要点5.1 外部基准源设计同步的“尺子”要准多个ADC同步采样除了时间要对齐参考电压这把“尺子”也要一致。如果ADCA用3.300V基准ADCB用3.305V基准那么即使采样完全同步对同一个1V信号两个ADC读出的数字码也会不同。因此强烈建议所有ADC模块共享同一个高精度、低噪声的电压基准源。典型的推荐电路使用一个精密电压基准芯片如REF50xx系列产生2.5V或3.0V的初始电压然后通过一个高精度、低输出阻抗的运放如OPA320进行缓冲并分别驱动到各个ADC的VREFHIA/B/C/D引脚。每个VREFHI引脚到地都需要一个去耦电容通常1-10uF钽电容并联一个0.1uF陶瓷电容并且必须尽可能靠近芯片引脚放置。一个关键技巧是在VREFHI和VREFLO引脚之间直接跨接一个0.1uF的陶瓷电容这个电容对于吸收ADC转换瞬间产生的高频电流尖峰至关重要能有效稳定基准电压减少转换噪声。有时为了运放稳定性还需要在这个电容上串联一个小于1欧姆的小电阻。5.2 结果寄存器读取与多核/CLA/DMA访问F2838x的ADC结果寄存器ADCRESULTx在硬件层面为每个总线控制器CPU1 CPU2 CLA DMA都做了镜像。这意味着CPU1和CLA可以同时读取ADCRESULT0而不会发生冲突或需要软件仲裁。这个特性对于多核协同处理或使用CLA进行快速控制律运算时极其重要。在同步采样应用中通常会在所有ADC转换完成后产生一个中断例如将最后一个SOC的INTEN置位。在中断服务程序ISR中你可以安全地同时读取多个ADC的结果寄存器硬件保证了数据的一致性。如果使用DMA可以将多个ADC的结果寄存器配置为DMA的触发源让DMA自动将同步采集的数据搬运到指定的内存区域极大减轻CPU负担。5.3 内部温度传感器的同步采样要点F2838x内部有一个温度传感器连接到ADCA的通道13ADCINA13。采样它对于监控芯片结温、进行温度补偿很有用。但需要注意必须工作在12位单端模式。在16位模式下采样温度传感器内部仍然以12位分辨率进行但这不会影响其他通道的16位模式转换。采样温度传感器同样可以纳入同步采样序列。只需像配置普通通道一样配置ADCA的某个SOC例如SOC15的CHSEL13并使其触发、ACQPS与其他需要同步的ADC SOC保持一致即可。转换结果需要通过TI提供的GetTemperatureC()函数在F2838x_TempSensorConv.c中进行校准计算才能得到实际的摄氏温度值。这个函数会处理传感器的非线性特性。6. 常见问题排查与调试经验实录即便按照手册配置在实际调试中也可能遇到同步失败的问题。下面是一些我踩过的坑和解决方法。6.1 同步失效的典型症状与排查步骤症状两个ADC对同一信号通过物理连接确保输入相同采样结果存在固定的、随时间漂移的相位差或数值差异。排查清单检查触发源确认所有ADC SOC的TRIGSEL寄存器值完全一致。不要依赖宏定义直接查看寄存器映射地址和值。使用示波器或CCS的寄存器实时查看功能确认触发信号如ePWM的SOCA脉冲确实已经产生。绝对避免使用软件触发。检查采样窗口确认所有需要同步的SOC跨ADC的相同SOC编号的ACQPS值完全一致。根据前端电路重新计算ACQPS确保其大于数据手册规定的最小值并满足信号建立要求。检查优先级与突发模式如果使用了高优先级SOC检查所有ADC的ADCSOCPRIORITYCTL寄存器配置是否相同。如果使用了突发模式检查所有ADC的ADCBURSTCTL寄存器使能、触发源、大小是否相同。检查ADC工作模式确认所有ADC的ADCTL2.RESOLUTION位分辨率设置相同。12位和16位模式无法同步。确认所有ADC的时钟源和分频器配置一致。通常它们都使用相同的时钟源默认SYSCLK但需检查ADCTL2.CLKDIV等位。检查ADC状态在触发事件发生后读取ADCINTFLG寄存器检查中断标志位是否在同一时间点置起。如果不同步置起时间会有差异。更精确的方法是使用CCS的Event Combiner或CPU定时器在中断内翻转一个GPIO用示波器观察两个ADC中断服务程序产生的脉冲之间的时间差。6.2 由“触发溢出”导致的异步问题这是SOC数量不均衡配置中最常见的问题。如下图所示当ADCA有3个SOCSOC0 SOC1 SOC2而ADCB只有2个SOCSOC0 SOC1时如果触发周期T小于ADCA完成3个转换的总时间就会发生“触发溢出”。时间轴 触发1 - ADCA开始 SOC0, SOC1, SOC2 ADCB开始 SOC0, SOC1, (空闲) 触发2 - 此时ADCB已空闲立刻开始新的SOC0。 但ADCA的SOC2还未完成它无法响应触发2。 同步被破坏。解决方法延长触发周期保触发间隔大于最长的ADC转换序列时间。总时间 SOC数量 * (采样窗口时间 转换时间)。转换时间在数据手册的“ADC Conversion Timing”部分查找。使用突发模式如前所述将长序列配置为突发模式确保突发开始的时刻是同步的并合理安排触发周期。使用DMA或PIE中断管理如果必须高频率触发可以考虑让一个ADC如ADCA采集所有通道然后通过DMA将数据拆分给不同的处理单元。但这失去了硬件同步的优势。6.3 电源噪声与地平面干扰同步配置正确但ADC读数噪声大或不同ADC间存在共模干扰。这往往是硬件问题。模拟电源滤波确保每个ADC的VDDA引脚都有独立的LC或RC滤波网络并靠近芯片引脚。数字电源VDD和模拟电源VDDA的磁珠或电感隔离要做好。地平面分割正确的单点接地或接地平面设计至关重要。模拟地AGND和数字地DGND通常在芯片下方通过最短路径连接在一起。确保ADC输入信号的回流路径干净远离数字噪声源如时钟、PWM输出线。基准电压旁路再次检查VREFHI与VREFLO之间的0.1uF陶瓷电容是否已焊接并且位置极其靠近芯片引脚。6.4 软件读取时序导致的“假异步”有时硬件是同步的但软件读取结果的时机不对造成了数据“不同步”的假象。在正确的时刻读取务必在所有参与同步的ADC都完成转换后再读取数据。最佳实践是将最后一个SOC通常是编号最大的那个配置为产生中断EOC。在这个中断服务程序中一次性读取所有ADC的结果寄存器。使用影子寄存器在中断中读取数据后立即存入一个全局的“影子”缓冲区。应用主循环或其他任务从影子缓冲区中读取数据进行计算。避免在中断外直接读取ADCRESULT寄存器因为此时可能正在进行新的转换。32位访问优化F2838x支持32位访问。对于16位的结果寄存器可以使用32位指针一次读取两个结果效率更高且能保证这两个结果的读取是原子的来自同一个转换周期。例如int32_t result_pair *(int32_t *)AdcaResultRegs.ADCRESULT0;。我个人在调试一个双电机控制项目时曾遇到一个棘手问题两个ADC的电流采样值在高速运行时相位差逐渐增大。排查了所有配置都正确。最后发现是其中一个ADC的VREFHI去耦电容虚焊导致其基准电压随负载轻微波动虽然同步采样时刻是准的但“尺子”本身在抖换算出的值自然就有漂移。这个经历让我深刻体会到同步是一个系统工程配置、软件、硬件缺一不可。