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.

[参考译文] TMS320F28377D:正确的 ADC 采样时间

Guru**** 2511985 points
Other Parts Discussed in Thread: OPA320, THS4031

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/700243/tms320f28377d-correct-sample-time-of-a-adc

器件型号:TMS320F28377D
主题中讨论的其他器件:OPA320THS4031

社区好、我在以正确的速度设置从 ADC 中获取数据时遇到了问题。 我的配置的基础是"ADC_SoC_ePWM"(不在控制套件中)。 我想测量1us (10^-6 s)的每一个时间步长并保存数据、以便我可以使用 CCS7观察图形中的数据并导出到 csv 文件以保存并在以后进行分析。

我更改了 ePWM 的速度并将 ADC-clk 的预分频设置为0。 1us 的建议外转配置为:
   EPwm1Regs.CMPA.bit.CMPA = 50;    //设置比较 A 值
   EPwm1Regs.TBPRD = 99;            //设置周期
但是、通过分析保存的数据、似乎每个采样点的时间间隔大约为8、7us。

我的配置是否错误? 我可以做些什么来提高 ADC 的速度并保存数据。

此致 Basti

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    //######################################################################################################################
    //
    ////文件:adc_soc_ePWM_cpu01.c
    //
    标题:通过 ePWM 触发 F2837xD 的 ADC。
    //
    //! addtogroup cpu01_example_list
    //! 

    ADC ePWM 触发(ADC_SoC_ePWM)

    //! //! 此示例设置 EPWM 以定期触发 ADC。 //! //! 程序运行后、内存将包含:\n //! -\b 结果:一系列来自 //的模数转换样本! 引脚 A0。 采样之间的时间根据周期 //! PWM 计时器的功能。 // //########################################################################################################################## //$TI 发行版:F2837xD 支持库 V210 $// $发行 日期:星期二11月1日14:46:15 CDT 2016 $// 版权所有:版权所有(C) 2013-2016德州仪器(TI)公司-// http://www.ti.com/ 保留所有权利$ //############################################################################################################ // //包含的文件 // #include "F28x_Project.h" // 函数原型 // void ConfigureADC (void); void ConfigureEPWM (void); void SetupADCepwm (uint16通道); 中断 void adca1_ISR (void); // //#define results_buffer_size_s/ void /uint16;/[void Resumpts1/uints1/uints1/uints/simumpts/simumpth;/u.1/uint16 buffers/simumpth ;/u./uints/simuminumpts /u./uint16 buffers/in 初始化系统控制: // PLL、看门狗、启用外设时钟 //此示例函数位于 F2837xD_sysctrl.c 文件中。 // InitSysCtrl(); // //步骤2。 初始化 GPIO: //此示例函数位于 F2837xD_GPIO.c 文件中, //说明了如何将 GPIO 设置为其默认状态。 // InitGpio();//针对本例跳过 // //步骤3。 清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 // Dint; // //将 PIE 控制寄存器初始化为默认状态。 //默认状态是禁用所有 PIE 中断并 清除标志//。 //此函数位于 F2837xD_PIECTRL.c 文件中。 // InitPieCtrl(); // 禁用 CPU 中断并清除所有 CPU 中断标志: // IER = 0x0000; IFR = 0x0000; // //初始化 PIE 矢量表,其中包含指向 shell 中断 //服务例程(service routines,ISR)的指针。 //这将填充整个表,即使在 本示例中未使用中断//也是如此。 这对于调试很有用。 //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程 //此函数可在 F2837xD_PieVect.c 中找到 // InitPieVectTable(); // //映射 ISR 函数 // EALLOW; PieVectTable.ADCA1_INT =&adca1_ISR;//针对 ADCA 中断1的函数 EDIS; // //配置 ADC 并为其加电 // ConfigureADC(); // 配置 ePWM // ConfigureEPWM (); // //将 ADC 设置为通道0上的 ePWM 触发转换 // SetupADCepwm (0); // //启用全局中断和更高优先级的实时调试事件: // IER |= M_INT1;//启用组1中断 EINT;//启用全局中断 INTM ERTM;//启用全局实时中断 DBGM // 初始化结果缓冲 区// for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++) { AdcaResults[resultsIndex]= 0; } resultsIndex = 0; bufferFull = 0; // //启用 PIE 中断 // PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // 同步 ePWM // EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; // //在循环中无限期地进行转换 // 操作 { // //启动 ePWM // EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结、并进入递增计数模式 // //等待、而 ePWM 导致 ADC 转换、然后导致中断、 //填充结果缓冲区,最终设置 bufferFull //flag // while (!bufferFull); bufferFull = 0;//清除缓冲区已满标志 // //停止 ePWM // EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用 SOCA EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器 // //此时,AdcaResults[]包含一系列转换 //从所选通道 // // //软件断点,再次点击运行以获取更新的转换 // asm (" NOP"); }while (1);//ESTOP0);--> NOP"); } // // ConfigureADC -写入 ADC 配置并为//两者加电 ADC ADC A 和 ADC B // void ConfigureADC (void) { EALLOW; // //写入配置 // AdcaRegs.ADCCTL2.bit.prescale = 0;//将 ADCCLK 分频器设置为/4 AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE); // //将脉冲位置设置为晚期 // AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1; // //为 ADC 加电 // AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; // //延迟1ms 以允许 ADC 加电时间 // DELAY_US (1000); EDIS; } // // ConfigureEPWM -配置 ePWM SOC 和比较值 // void ConfigureEPWM (void) { EALLOW; //假设 ePWM 时钟已启用 EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的 SOC EPwm1Regs.ETSEL.bit.SOCASEL = 1;//4;//在递增计数时选择 SOC EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲 EPwm1Regs.CMPA.bit.CMPA = 100; //将比较 A 值设置为2048个计数 EPwm1Regs.TBPRD = 199; //将周期设置为4096个计数 //EPwm1Regs.TBCTL.bit.CTRMODE = 3; //冻结计数器 EDIS; } // SetupADCepwm - Setup ADC ePWM acquisition window // void SetupADCepwm (uint16 channel) { uint16 acqps; // //根据分辨率确定最小采集窗口(在 SYSCLKS 中) // if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution) { acqps = 14;//75ns } 否则、//分辨率为16位 { acqps = 63;//320ns } // //选择要转换的通道和转换结束标志 // EALLOW; AdcaRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换引脚 A0 AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期 AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发 AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志 AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志 AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除 EDIS; } // // adca1_ISR -在 ISR 中读取 ADC 缓冲 区// 中断 void adca1_ISR (void) { AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT0; if (results_buffer_size <= resultsIndex) { resultsIndex = 0; bufferFull = 1; } AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志 PieCtrlRegs.PIEACK.all = PIEACK_Group1; } // //文件结束 //

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

    除非以50MHz 或更低的频率运行 CPU、否则将 ADCCLK 分频器设置为/1将导致 ADC 结果出现错误。

    同样、您应该确保 ePWM 以100MHz 或更低的频率运行、并且 CPU 以200MHz 或更低的频率运行、以实现正确运行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devin、

    感谢您提供这些提示。 ´ve 我必须校正 ADC 的预分频。 昨天、我发现输出的数据似乎因 ADC 必须测量的不同信号形式而出错。
    但我认为通过下面的表10-10可以实现1的预分频比。 SPRUHM8G 文档中的12位模式下的 ADC 时序(SYSCLK 周期)。
    在我的配置中、CPU 运行频率为200MHz、因为我需要 ePWM 以100MHz 运行。
    对于该配置、ADC 模块的最大可能时钟为50MHz。

    此致 Basti

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

    您好 Devin、
    通常可以在1us (~1MHz)的高速率下获得 ADC 样本吗?
    我更改了 ADC 预分频器、并尝试测量一些频率不同的正弦波。
    AdcaRegs.ADCCTL2.bit.prescale = 2;
    (I 以100Hz 开始、以100Hz 的步长结束1kHz、在大多数频率下、CCS 中的输出数据显示的不是设置的正弦波。)
    仍然是此配置:
    EPwm1Regs.CMPA.bit.CMPA = 100;
    EPwm1Regs.TBPRD = 199;
    在我的测试中、我使用分压器将介于- 3V 和+ 3V 之间的正弦波信号馈入 ADC、并将其调节为介于0和+ 3.3V 之间的输入电压


    现在、我将配置改回项目的原始状态、并获取似乎适合正弦波形状的正弦波数据。
    EPwm1Regs.CMPA.bit.CMPA = 2048;
    EPwm1Regs.TBPRD = 4096;

    通过为 ADC 配置 ePWM、我还需要注意什么吗?

    2.或者此配置是否为最大速度?

    3.我的守则是否有其他错误?
    我只更改了开头的一些值。

    提前感谢您的帮助。

    此致 Basti

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

    您好、Basti、

    AdcaRegs.ADCCTL2.bit.prescale = 2;将导致 ADC 时钟分频器为/2。  您实际上需要预分频= 6、从而产生一个/4分频器。

    ADC (在12位模式下)可以在3.5MSPS 左右的速率下运行、在16位模式下可以在1.1MSPS 左右运行、因此这是可以实现的。   

    对于最大速度、您可能需要查看 ADC_SoC_Continuous 示例。  这将移除中断并直接收集 ADC 数据、因为它是通过背靠背转换设置生成的。

    应该可以采用1MHz 的 ISR、但您可能需要注意的是 ISR 不是限制因素。  

    只要您的样本间隔均匀且输入为正弦波、您就会得到正弦波输出。  但是、如果采样率太慢、频率可能会因混叠而出现差异。   

    分压器的阻抗是多少?  您通常需要使用高速、低噪声运算放大器来驱动 ADC 以进行高速采样。  

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

    您好 Devin、
    //AdcaRegs.ADCCTL2.bit.prescale = 2;将导致 ADC 时钟分频器为/ 2。 您实际上需要预分频= 6、从而得到一个分频值/ 4。
    ->为什么要预分频= 6 (/ 4)?
    是否存在技术需求、因为我想以1MHz 的频率获取样片? 这些预分频= 6会将 ADC 减慢至~8、3MHz。
    或者、这些"所需预分频"是否指代码中的注释?

    //ISR 应该可以在1MHz 下运行、但您可能需要注意的是 ISR 不是限制因素。
    -->这是指"adc_soc_continue"?

    //分压器的阻抗是多少? 您通常需要使用高速、低噪声运算放大器来驱动 ADC 以进行高速采样。

    --> Vcc
    --
    |
    +-+
    |  | R1
    +-+
    |
    +--o Uadc
    |
    +-+
    |  | R2
    +-+
    |
    uin - o -+

    VCC= 3、3V;R1=R2= 7、5kOhm;uin-=发电机的正弦波;Uadc= ADC 端口的电压

    您能说出一个示例产品的名称吗(价格不高且简单、太棒了)?

    感谢您提供的其他提示和意见。 我将看另一个示例。

    此致 Basti

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

    设置器件配置时、请参阅技术文档。 我还非常确信示例中的所有内容都已正确设置。

    有关最大 ADC 速度、请参阅数据表中的"ADC 工作条件(12位单端模式)"表、其中列出了最大 ADCCLK 为50MHz。

    您可以在数据表" 12位模式下的 ADC 时序(SYSCLK 周期)"表中看到时序。 这表明预分频= 6会导致 ADCCLK = SYSCLK/4。

    此外、您还可以在 ADC 工作条件表中看到最小 S+H 持续时间为75ns。 通过从时序表中将此值添加到 Teoc、得到的 ADC 转换时间为75ns + 41*5ns = 280ns、这在1us 之内。

    至于运算放大器、我们通常使用 OPA320或 THS4031、但我们通常使用非常好的运算放大器来表征性能。 对于~5MHz 带宽且噪声、失调电压和 THD 可为您的应用所接受的运算放大器、您应该是可以接受的(5MHz 可能仍需要将 S+H 从75ns 的最小值稍高一点)。 如果您需要更多帮助、可访问精密放大器 e2e 论坛。

    您仍然可以在不使用运算放大器的情况下对信号进行采样、但除非您真正耗尽 S+H 时间、否则可能会出现一些失真(因为您的输入阻抗为7.5k/2、75ns 的最小 S+H 适合~50欧姆的输入阻抗)。 这不应影响"眼图测试"级别的信号太差、因此为了进行测试、可以原样使用分频器来获得一般设置正常(只需将 S+H 增加到可容忍的值即可...例如 295ns 的 S+H 仍应提供大约500ns 的总 ADC 转换时间)。

    ADC 设置为 ADC 时间<目标触发周期后、接下来需要设置 ePWM。 您应该查看 ePWM 示例和文档、并获取除了触发 ADC 之外、每个周期切换引脚的 ePMW。 然后、您可以在示波器上验证触发频率是否确实是预期的1MHz。

    请注意、这假设您仅希望在每个 ePWM 周期对1个 ADC 通道进行采样。 如果您需要多达4个 ADC 转换、则可以使用4个 ADC 并行执行所有转换。 如果您需要更多、则需要设置 ADC、使一个触发器导致多个 SOC。 在这种情况下、您需要确保每个 ADC 的 ADC 时间*转换数<(ePWM 触发时间+ ISR 开销)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     现在它起作用了。
    问题出在 PC 的"更新转换数据"命令上。

    感谢您的支持。