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/TMS320F28377S:在移植至200MHz 后、内部 ADC 不再正常运行

Guru**** 2448780 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/960110/ccs-tms320f28377s-internal-adc-does-not-run-properly-anymore-after-porting-to-200-mhz

器件型号:TMS320F28377S

工具/软件:Code Composer Studio

我接管了在 Piccolo 上运行的大量传统代码。 我尝试将代码移植到具有200MHz 频率的 Delfino。 对于120MHz 的旧频率、一切似乎都很好、但当升至200MHz 时、ADC 至少在一个特定通道上提供垃圾值。

这是初始化。

EALLOW;
// TI 上电序列
//最大 ADCCLK:50MHz
AdcaRegs.ADCCTL2.bit.prescale = 14;//输入时钟分频器= 8 -> 120MHz/8 = 15MHz。
AdcbRegs.ADCCTL2.bit.prescale = 14;//输入时钟分频器= 8 -> 120MHz / 8 = 15MHz
CpuRegs.PCLKCR13.all = 0x0003;//启用 ADC A 和 ADC B 的时钟

AdcSetMode (ADC_ADCA、ADC_resolution_12bit、ADC_SYSADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADSCALE_ADC12BIT、ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_SESHOLUTION、ADC_ADC_SEST_ADCK_
ADC_SIGNALMODE_SINGLE);
AdcRegs.ADCCTL1.bit.ADCPWDNZ = 1;//为 ADC A 电路加电
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;//为 ADC B 电路加电

DELAY_US (1000);

uint32 cpufreq = CquadtruencyTM = 1;(uquetInquale= UcpuF
)= 1);(uqualeInqualuF = 1) 0x57:0x93;
//ADCA
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0x07;// ePWM2、ADCSOCA 作为触发
AdcaRegs.ADCSO0CTL.bit.CHSEL = 0x0;AdcaRegs.ADCCO0CTL.bit.ADCSOCSRG=0x07

;ADCSOC1ADCADCADCCORegs.ADCCOL.ADCADCADCCOL.ADCADCADCADCADCADCADCADCADCADCADCCOL.TCL.ADCADCADCADCADCADCADCADCADC1CL.ADCADCADCADCADCADCADCADCADCADCCOL.TCL.ADCADCADCADCADCADCADCADCADCADCADCADCADCADCADCADCADCCOL.TL.TCL.ADCADCADCADCADCADCADCADCADCADCADCADCADCADCADCADCADCADC








// ePWM2、ADCSOCA 作为触发
器 AdcRegs.ADCSO3CTL.bit.CHSEL = 0x3;
AdcRegs.ADCSO3CTL.bit.ACQPS = acqWindow;Adcoc3CTL.bit.ADCCORegs.ADCSOC.ADCSRC.07.ADCSOC.ADCSRC.ADC5TRS.ADCSOC.ADCADCCOL.ADCADCADCCOL.TCL.ADCADCADCADCCOL.ADCADCADCADCCOL.ADCADCADCCOL.TCCS.ADCADCADCADCADCADCADCADCADCADCADCTRL.TC.TRS.ADCCP.ADCCPS.ADCCP.ADCCPS.ADCCPS.ADCCP.ADCCP.ADCCP.ADCCP.ADCCP.ADCCP.ADCCP.ADCCP.ADCCP.ADCCP.ADCADCCP.ADCCP.ADCADCADCADCADCADCADCADCADCTR











AdcRegs.ADCSOC6CTL.bit.ACQPS = acqWindow;

// ADCB
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 0x13;// ePWM8、ADCCOCA 作为触发
器 Adcb Regs.ADCCO0CTL.bit.CH8 = 0x0;ADCCOCL.ADCSRC.ADC1ADCSRC.ADC1ADCCOM.ADCTRL






= 0xADCCOM.ADCCOM.ADCSRC.ADC1ADCTRL.ADCCOM.ADCSRC.ADCSRC.ADCTRL = 0xbADC1ADCSOC.ADCTRL.ADCTRL.ADCSRC.ADC1ADCTRL.ADCCOM.ADCSRC.ADCSRC.ADCTRS.ADC1ADCTRL.ADCTRS.ADCTRS.ADCTRS.ADCTRS.ADCCP.ADCCP.ADCCP.ADCCP.ADCCP.ADCTRS.ADCCP.ADCTRS.ADCTRS.ADCTRS.ADCTRL.ADCTRS.AD



// ePWM8、ADCSOCA 作为触发
器 AdcbRegs.ADCSOC3CTL.bit.CHSEL = 0x3;
AdcRegs.ADCSO3CTL.bit.ACQPS = acqWindow;Adcoc3CTL.bit.ADCSRG=0x13

;// eCCCRC.ADCSRG=0xCCS.ADC5CCS.ADCTRL.ADCADCTRL.ADCADCADCTRL.ADCADCADCCR.ADCCOM.ADCTRS.ADCTRS.ADCCPS.ADCADCTRS.ADCTRS.ADCADCTRS.ADCTRS.ADCCPS.ADCTRS.ADCTRS.ADCTRS.ADCTRS.ADCCPS.ADCTRS.ADCTRS.ADCCPS.ADCADCADCADCADCADCADCTRL.ADCTRS.ADCTRS.ADCTRS.ADCCPS.ADCCPS.ADCTRS.ADCADCTRS.ADCCPS.ADCTRS.ADCADCADCADCADCADCTRL.ADCTR









PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 组1中启用 ADCA_INT1

//在 CPU 中断门
IER 中启用 PIE 组1 |= M_INT1;
EDIS; 

要触发的 PWM 将被操作、并且在 ISR 之外连续等待转换、如所示

while (AdcaRegs.ADCCTL1.bit.ADCBSY = 1 || AdcbRegs.ADCCTL1.bit.ADCBSY = 1)
{
m_busyWait++;
} 

之后、寄存器被读取、中断标志被清除。 由于某种原因、在200MHz 下、该寄存器中的值

//...
M_ADCA.OutCh[5]= AdcaResultRegs.ADCRESULT5;
AdcaRegs.ADCINTFLGCLR.ALL = 0x0003; //清除 ADCINT1和 ADCINT2标志
AdcbRegs.ADCINTFLGCLR.ALL = 0x0003; //清除 ADCINT1和 ADCINT2标志 

是垃圾。 更具体地说:我知道值必须是多少(范围)、但它会关闭大约50 %(掷一枚硬币同样准确)。 在120 MHz 下工作正常。 此处应重新评估哪些 ADC 配置参数?

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

    尊敬的 Maximilian:

    由于美国感恩节假期、主题专家已不在办公室。 请在12月1日星期二之前回复。 对给您带来的不便深表歉意。

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

    谢谢、Santosh。 感恩节快乐!

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

    [引用用户="Maximilian Stiefel86"]旧频率为120 MHz 时,一切似乎都很好

    您能看到在120MHz 上设置预分频= 6 (/4.0)是否会有什么不同吗?  这将有助于消除作为变量的 ADC 时钟频率。

    EPWMCLKDIV=1使 ePWM 时钟<= 100MHz 吗?

    我看到、ACQPS 是根据 CPU 频率计算的、这是很好的。  您能否从 SOC 寄存器读回该值以确保其按预期写入?

    [引用 user="Maximilian Stiefel86"] ADC 至少在一个特定通道上传递垃圾值

    与其他通道相比、在 PCB 上处理该通道的方式是否有什么特殊之处?  从 ADC 架构的角度来看、CH5没有什么不同。

    如果您通过 SOC15配置未使用的 SOC7并转换 CH5、那么 SOC 之间的结果是否一致?

    其他通道是否存在明显的误差?

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

    感谢您的建议、谢谢。

    我仔细研究了您提出的问题。 当我运气不好时、我开始尝试错误地更改代码、我发现的结果相当不满意。 如果我简单 地更改初始化中的前三行代码、如所示

    EALLOW;
    // TI 上电序列
    //最大 ADCCLK:50MHz
    
    CpuSysRegs.PCLKCR13.ALL = 0x0003; //为 ADC A 和 ADC B 启用时钟
    
    AdcaRegs.ADCCTL2.bit.prescale = 14; // InputClock 分频器= 8 -> 120MHz/8 = 15MHz。
    AdcbRegs.ADCCTL2.bit.prescale = 14; // InputClock 分频器= 8 -> 120MHz/8 = 15MHz
    

    ADCA 再次正常运行。 在调试器中、在"打开" ADC 的时钟门后、在原始版本的代码中、AdcRegs.ADCCTL2.bit.prescale 中的值为0

    《TMS320F2837xS 微控制器技术参考手册》(2019年9月)第1449页

    因此、我不理解背后发生的情况。 你能向我解释一下吗?

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

     [引用 user="Maximilian Stiefel86"]在"打开" ADC 的时钟门之后、代码的原始版本中 AdcRegs.ADCCTL2.bit.prescale 的值为0 [/quot]

    这是一个很好的发现、说明了发生的情况。  我自己没注意到。

    当 PCLKCRn 位禁用 ADC 时钟时、整个 ADC 状态机被保持在一个冻结状态。  到 ADC 寄存器的内部总线连接也被禁用、这样写入被忽略并且读取返回0。

    因此、当 PCLKCRn 禁用 ADC 时钟时、尝试配置预分频值将不起作用。  看起来这是 ADC 超频时原始代码中的一个错误。