This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28069:1MHz ADC 采样频率问题

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/598188/ccs-tms320f28069-1mhz-adc-sampling-frequency-question

器件型号:TMS320F28069

工具/软件:Code Composer Studio

我正在使用28069 controlSTICK 来实现一个简单示波器、该示波器具有2个 ADC 通道、均为1MHz 采样率。

ADCCLK 为45MHz

ADCINA2和 ADCINB2在连续模式下按顺序采样、由 ADCINT1触发 SOC0/1、EOC0触发 ADCINT1、EOC1触发 ADCINT2

因此、我认为以下设置应该为每个通道提供1MHz 的频率: 45MHz/(6+16)/2 = 1.022MHz

EALLOW;
AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1;
AdcRegs.ADCCTL2.bit.CLKDIV4EN = 0; //ADCCLK=SYSCLK/2
DELAY_US (ADC_USDELAY); //转换 ADC 通道前的延迟
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //延迟中断脉冲
AdcRegs.INTSEL1N2.bit.INT1E = 1; //启用 ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 1; //启用 ADCINT1连续模式
AdcRegs.INTSEL1N2.bit.INT2E = 1; //启用 ADCINT2
AdcRegs.INTSEL1N2.bit.INT2CONT = 1; //启用 ADCINT2连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL = 0; //设置 EOC0以触发 ADCINT1触发
AdcRegs.INTSEL1N2.bit.INT2SEL = 1; //设置 EOC1以触发 ADCINT2触发
AdcRegs.ADCSOC0CTL.bit.CHSEL = 2; //将 SOC0通道选择设置为 ADCINA2
AdcRegs.ADCSOC1CTL.bit.CHSEL = 10; //将 SOC1通道选择设置为 ADCINB2
AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 1; // ADCINT1将触发 SOC0
AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 1; // ADCINT1将触发 SOC1
AdcRegs.ADCSOC0CTL.bit.ACQPS = 15; //将 SOC0 S/H 窗口设置为16个 ADC 时钟周期(15个 ACQPS 加1)
AdcRegs.ADCSOC1CTL.bit.ACQPS = 15; //将 SOC1 S/H 窗口设置为16个 ADC 时钟周期(15个 ACQPS 加1)
EDIS; 

因此、如果我在测量10kHz 正弦信号时显示100个点、它应该提供一个完整的正弦波周期。 但我在这里得到5、这意味着采样率大约为200kHz。

是否有人可以指出我的代码中的任何问题或我遗漏的任何内容?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我想您可能还有 AdcOffsetSelfCal()函数遗留的一些寄存器配置(我假设您在应用程序的早期某个位置调用该函数?) 这会导致触发比预期更多的 SOC。 在为 SOC0和 SOC1配置 ADCINTSOCSEL1之前、请尝试清除 ADCINTSOCSEL1和 ADCINTSOCSEL2寄存器。

    惠特尼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢! 问题已解决。

    另一个问题是、在2806x doc 中、ADCCLK 是45MHz 时 SYSCLK 的一半、通过设置 CLKDIV2EN = 1和 CLKDIV4EN = 0实现 maxium。 我尝试将这两个值都设置为零、这将提供90MHz ADCCLK。 我可以看到采样率翻倍。 因此、ADCCLK 可配置为最大90MHz。 它是正确的吗?? 为什么该规格显示为45MHz
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当数据表显示最大值为45MHz 时、数据表是正确的。 我个人不知道他们如何确定测试中的最大值、以及在更高的速度下具体出现了什么问题。 请保持在45MHz 以避免可能的不良行为。

    惠特尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    王宁

    当频率高于45MHz 时、ADC 性能超出数据表规格。

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨、Tommy、

    就 ADC 性能而言、我认为如果我为 S/H 窗口提供足够的时间、应该可以吗?
    例如、在45MHz ADCCLK 下、数据表显示 S/H 窗口至少为7个周期。 因此、如果我将 ADCCLK 配置为90MHz、那么我将 S/H 窗口设置超过14个周期。 我猜是这样吗?
    我之所以尝试这样做、是因为我确实希望拥有一个完美的1MHz SR、而对于45MHz ADCCLK、我无法获得这一结果。
    另一个问题是、我能否在 ADC 运行时更改其配置(TRIG 源、TRIG 模式等)? 或者、我是否必须在重新配置期间再次禁用和启用它?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    王宁

    ADC 状态机未获准进行90MHz 运行。 这就是需要将模块时钟限制为45MHz 的原因--这不是 ACQPS 窗口引起的问题。

    您可以使用不同的 SYSCLK 频率来尝试实现所需的采样率。 例如、以60MHz、CLKDIV2、NONVERLAP 和 ACQPS=16运行器件应提供1MSPS。

    还有一种方法是使用 ePWM 以周期性1MHz 速率触发转换、而不是在连续采样模式下使用 ADC。

    Tommy