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.

[参考译文] TMS320F28069M:慢速 ADC 转换

Guru**** 2517220 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1120879/tms320f28069m-slow-adc-conversion

器件型号:TMS320F28069M

您好!

我尝试查看使用 ePWM 触发 ADC 中断的速度、我达到了大约700kHz 的限制、但它应该会提高一点。 如何提高这一比例? 我特别想使用 ePWM 来轻松更改采样率。  

以下是我的初始化代码:  

    EALLOW;

    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;

    AdcRegs.ADCCTL2.bit.CLKDIV4EN = 0;
    AdcRegs.ADCCTL2.bit.CLKDIV2EN = 0;
    AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 0; // Enable non-overlap mode    
    AdcRegs.ADCCTL1.bit.INTPULSEPOS	= 1;    
    AdcRegs.INTSEL1N2.bit.INT1E     = 1;  // Enabled ADCINT1
    AdcRegs.INTSEL1N2.bit.INT1CONT  = 0;  // Disable ADCINT1 Continuous mode    
    AdcRegs.INTSEL1N2.bit.INT1SEL 	= 0;    
    AdcRegs.ADCSOC0CTL.bit.CHSEL 	= 4;  // set SOC0 channel select to ADCINA4
    AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 0;   
    AdcRegs.ADCSOC0CTL.bit.TRIGSEL 	= 5;   
    AdcRegs.ADCSOC0CTL.bit.ACQPS 	= 6;    

    EDIS;

    EPwm1Regs.TBCTL.bit.CLKDIV      = 0;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV   = 0;
    EPwm1Regs.ETSEL.bit.SOCAEN	    = 1;		
    EPwm1Regs.ETSEL.bit.SOCASEL	    = 2;
    EPwm1Regs.ETPS.bit.SOCAPRD 	    = 1;		
    EPwm1Regs.TBPRD 			    = 0x02;	
    EPwm1Regs.TBCTL.bit.CTRMODE     = TB_COUNT_UP;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV   = TB_DIV1;
    EPwm1Regs.TBCTL.bit.CLKDIV      = TB_DIV1;

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;

    while(1);
}

__interrupt void
adc_isr(void)
{
   GpioDataRegs.GPADAT.bit.GPIO12 = 0;

   AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; 
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;  

   GpioDataRegs.GPADAT.bit.GPIO12 = 0;
}


谢谢、

Ryan

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

    您好、Ryan、

    [~引语 userid="523640" URL"/support/microset/C2000-microset-group/C2000/f/C2000-microset-forum/1120879/tms320f28069m-slow-adc-conversion "]我如何提高这一比例?

    您必须更改 ePWM 频率、这是通过 TBPRD 寄存器完成的。

    有关根据所需频率选择正确的 TBPRD 值的更多信息、请访问 :https://training.ti.com/c2000-enhanced-pulse-width-modulator-epwm-time-base-submodule 

    此致、

    Marlyn

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

    我认为您误解了我的问题。

    如果您查看上述代码、周期将设置为尽可能快的速度。  可达到的最大频率为700kHz。  

    谢谢、

    Ryan

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

    Ryan、

    您能否为 ePWM 模块设置 AQ 设置并对输出进行范围调整以检查 ePWM 的频率?  

    此致、

    Marlyn

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

    是的、我会尝试一下、然后返回给您。 具体哪一个模块?  

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

    您好、Ryan、

    这应该是对您拥有的代码的简单添加。 例如、请参考下面的代码。 您只需设置比较值和操作限定符事件即可。 之后、您应该能够监控 EPWM1A。  

      EPwm1Regs.TBPRD                 = 0xFFFF;   // Set period for ePWM1
      EPwm1Regs.CMPA.half.CMPA    = 0x0080;       // Set compare A value
      EPwm1Regs.AQCTLA.bit.CAU = 2;  // Set ouptut high
      EPwm1Regs.AQCTLA.bit.ZRO = 1;  // Set output low

    此致、

    Marlyn

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

    好的、我将 AQC 放在尽可能快的位置、我得到45MHz。 因此、ePWM 不是问题、而是我要假设的 ADC 的 SOC。 有什么想法吗?  

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

    Ryan、

    是否可以尝试在进入 ISR 时切换 GPIO、而不是在 ISR 中进行设置、然后将其清除?

    此致、

    Marlyn

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

    那么、现在 ePWM 设置为1MHz。 以之前的速度除以2来切换 GPIO 触发器。 我的最大速率约为772khz。 进入 ISR 时切换 GPIO 会产生386kHz 的速率、如预期的那样。  

    从 EPWM1 (CPMA)的上升到 GPIO 的上升、预计约为440ns。 一旦我使用 ePWM 超过这个~772kHz、ISR 就不会以更快的速度触发。  

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

    您好、Ryan、

    这里的限制因素不是 ePWM 频率、而是 ADC 和分支到 ISR、执行 ISR 中的内容、然后分支所需的时间。 即使 ePWM 以尽可能快的速度触发、ADC 采样和执行转换所需的时序+ ISR 时序也将是固定的。  

    此致、

    Marlyn

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

    ADC 能够以3.46MSPS 采样。 如果 ISR 内部除了 GPIO 切换之外没有代码、则应能够超过1MHz。 根据其他条款,这是可能的。 您是否可以将我推荐给一位对该问题有了解的同事?

    谢谢、

    Ryan

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

    Ryan、

    您能否尝试将 INTPULSEPOS 更改为0 (ADC 开始转换时会产生 INT 脉冲)? 这应该有助于将转换时间的结束与 ISR 上下文切换重叠。 此外、您是否看到正在设置任何溢出标志(ADCINTOVF 寄存器)?

    此致、

    Marlyn

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

    重叠已设置为0,但我将检查溢出,谢谢。  

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

    因此 INTPULSEPOS 已设置为0。 溢出标志正在被设置、但如果我将其清除、它不会产生影响。  

    即使 DMA 传输到缓冲器中、ADC 处于连续模式(无需复位标志)、我仍会获得相同的速度上限。  

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

    您好、Ryan、

    感谢您检查这些设置。 只需确认一下、您的器件以90MHz 运行、对吧? 请注意、ADC 的最大工作频率为45MHz。 在初始化过程中 、CLKDIV4EN 和 CLKDIV2EN 都设置为0。 如果您的器件以90MHz 运行、则应将 ADC 配置为以45MHz 运行、否则我们不保证 ADC 的行为。 在我们继续之前、如果您的申请适用、您是否可以在申请中进行更改?

    此致、

    Marlyn

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

    是的、器件以90MHz 运行。 如我的第一个帖子中的上述代码所示、在配置 ADC 时 CLKDIV4EN 和 CLKDIV2EN 设置为0。 因此、ADC CLK 应该运行在45MHz 上。  

    谢谢、

    Ryan

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

    Ryan、

      Marlyn 今天不在办公室、明天回来时会回复。 感谢您的耐心和理解。

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

    Ryan、

    如果 CLKDIV2EN 和 CLKDIV4EN 位都设置为0、则 ADC 将配置为在 SYSCLK 而非 SYSCLK/2下运行。

    此致、

    Marlyn

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

    抱歉、我忽略了我认为0都是 SYSCLK/2。 如果我使用 SYSCLK/2、那么现在触发的最大频率将减半、大约为 386kHz。 有什么想法?  

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

    Ryan、

    由于溢出标志被置位、这意味着 ADC 在我们清除标志之前处理了另一个转换。  这可能意味着 ISR 无法根据 ADC 速度进行足够快的处理。

    您能否从工程中附加.map 文件(此文件应生成到与.out 文件相同的目录)。  我想确保 ADC ISR 在存储器中的执行位置。

    最棒的
    Matthew