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/LAUNCHXL-F28379D:LAUNCHXL-F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/697879/ccs-launchxl-f28379d-launchxl-f28379d

器件型号:LAUNCHXL-F28379D

工具/软件:Code Composer Studio

您好!

我正在使用 PWM 进行 ADC 转换。 我已按如下方式配置 PWM 和 ADC。 我正在尝试读取超过50 KHz 的信号、但我的 ADC 转换在10 KHz 后会产生干扰。 根据我的配置、我假设在该频率读取信号。 即使我降低 TBPRD=400、我也无法再进一步低于、如果我再低于信号、则会更糟糕。 我的 SYSCLOCKOUT=200MHz。 我的代码和 ADC 转换图如下所示。 谢谢你。  

配置 ADC ()

  EALLOW;

 

  //

  //write configurations //………………………………… 好的

  //

  AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4

  AdcSetMode (ADC_ADCA、ADC_Resolution 12位、ADC_SIGNALMODE_SINGLE);//…… 好的

 

  AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4

  AdcSetMode (ADC_ADCB、ADC_Resolution 12位、ADC_SIGNALMODE_SINGLE);//…… 好的

 

  AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4

  AdcSetMode (ADC_ADCB、ADC_Resolution 12位、ADC_SIGNALMODE_SINGLE);//…… 好的

 

  //

  //将脉冲位置设置为延迟.................................. 好的

  //

  AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;//.......................... 好的

  AdcbRegs.ADCCTL1.bit.INTPULSEPOS=1;//.......................... 好的

  AdccRegs.ADCCTL1.bit.INTPULSEPOS=1;//.......................... 好的

 

  //

  //为 ADC 加电................................................... 好的

  //

  AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;  //.......................... 好的

  AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;  //.......................... 好的

  AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;  //.......................... 好的

  //

  //延迟1ms 以允许 ADC 加电时间

  //

  DELAY_US (1000);

 

  EDIS;

 

配置 EPWM ()

  EALLOW;

  //假设 ePWM 时钟已启用

  ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=1;

 

  EPwm1Regs.ETSEL.bit.SOCAEN  = 0;  //禁用组上的 SOC

  EPwm1Regs.ETSEL.bit.SOCASEL  = 4;  //在递增计数时选择 SOC

  EPwm1Regs.ETPS.bit.SOCAPRD = 1;      //在发生第一个事件时生成脉冲

  //EPwm1Regs.CMPA.bit.CMPA = 0x0800;   //将比较值设置为2048个计数

  //EPwm1Regs.TBPRD = 0x1000;            //将周期设置为4096个计数

 

  EPwm1Regs.CMPA.bit.CMPA =200;    //将比较值设置为2048个计数

  EPwm1Regs.TBPRD = 400;            //将周期设置为4096个计数

 

  EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;

  EPwm1Regs.TBCTL.bit.CTRMODE = 3;    //冻结计数器

  EDIS;

 

void SetupADCepwm()

 

 

  //

  //根据分辨率确定最小采集窗口(在 SYSCLKS 中)

  //

 

 

  //

  //选择要转换的通道和转换结束标志

  //

  EALLOW;

 

  // Ph 电流-------------------------------------------------------

 

  // Ph A 电流

      AdcaRegs.ADCSOC0CTL.bit.CHSEL = 14;// ADCIN14

      AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14;//采样窗口为 xx SYSCLK 周期14ns

      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;

中断 void adca1_ISR (void)

  IA= AdcaResultRegs.ADCRESULT0;        //------ 好的

 

  //AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT0;

  AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT0;

  if (results_buffer_size <= resultsIndex)

  {

      resultsIndex = 0;

      bufferFull = 1;

  }

  AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志

  PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

}e2e.ti.com/.../ADC-Fault.docx

 

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

    您好、Omer、

    看起来您的第三个 ADC 设置模式和设置预分频会再次配置 ADC-B、而不是 ADC-C

    我也不确定是否应设置  EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0。  最大 ePWM 时钟为100MHz。  

    您是否获得了正确的采样间隔、但结果失真、还是在将 EPWM 推至某个频率后才会出现问题?  

    • 在第一种情况下、您的来源是什么?  您是否将源设置保留为与提高采样率相同的设置?  源是缓冲的吗?  ADC 反冲频率的增加(如果不缓冲)是否会使信号失真?
    • 在第二种情况下、您可能需要继续查看软件设置。   

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

    您好 Devin、

    感谢您的回答。 我执行了以下步骤:  

    • 我修正了第三个 ADC 设置模式和设置预分频、这是再次配置 ADC-B、而不是 ADC-C
    • 我 设置  EPwm1Regs.TBCTL.bit.HSPCLKDIV=1。 因为我的 SYSCLCK=200MHz、所以我得到的 ePWM 时钟为100MHz。
    • 我从信号发生器正弦信号1-60 KHz 信号中提供源信号。
    • 问题是、当我提高频率1-30KHz 正常时、30KHz 之后、正弦信号失真。 我正在通过降低 EPwm1Regs.TBPRD 来提高采样率、如果低于380、1-30KHz 信号也会失真。 我将在附件文件中发送图解和代码。

    请参阅附件文件中的代码和图表。  

    e2e.ti.com/.../ADC-Fault2.docx

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

    我很确定您不想在 ISR 中重新同步 ePWM:
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;

    在所有情况下、信号似乎都失真;即使在10kHz 的情况下、也有一个非常尖锐的正弦波、看起来并不正确。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、
    我在 ISR 函数(adca1_ICR)中删除了重新同步 e-PWM。 结果相同。

    此致、

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

    我会查看以下几个方面:

    -您可以通过输出 X-Bar 将 ADCSOC 信号从 ePWM 传输到 GPIO。 最好在您认为触发 ADC 时绘制该图来验证其是否被触发。

    -我对 CCS 中的图形功能有点怀疑。 我想在某个设置中有刷新率。 确保设置足够高、以便跟上您的测量结果。 您可能希望将数据转储到数组中、然后将其导出到 Excel 或其他只需对图形进行双倍检查的内容中。

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

    您好、Kris、  

    感谢您的回复。 我已将数据传输到 Excel、但也有相同的问题。  

    -我已经检查了我的 PWM1A 信号、它工作正常、我获得了足够的频率分辨率。  

    —— 您能解释一下如何通过输出 X-Bar 信号从 ePWM 获取到 GPIO 的 ADCSOC 信号吗?

    感谢你的帮助。  

    此致、

    Omer  

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

    有两个信号 ADCSOCAO 和 ADCSOCBO 由 PWM 生成并通过输出 X-Bar。 输出 X-Bar 出现在 GPIO 多路复用器(OUTPUTXBAR1-8)上。 它们中的任何一个都将起作用。

    查看 TRM 中的 X-Bar 一章。 这是非常简单的设置。 我认为您不需要对 PWM 进行任何更改、因为您已经生成 SOC、但可能需要做一些小事情。

    此致、
    Kris