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.

[参考译文] TMS320F28376S:当 CPU 速率发生变化时、ADC 返回错误的值

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/706898/tms320f28376s-adc-returns-wrong-values-when-cpu-rate-is-changed

器件型号:TMS320F28376S

你好

我们固件上的 DAC 在120MHz 的 CPU 时钟频率下工作正常。 但是、当我通过在 cfg 文件中将 SPLLIMULT 从12设置为16并将 CPU_RATE 从8.333L 更改为6.250L 来将时钟切换为160MHz 时、结果(readADC 的输出参数、请参阅下面的代码)始终为 ADCINC2零、而不是正确的值。  ADCIN0和 ADCIND1的结果在大约30%的时间内为零。

我尝试更改采集窗口、更改发生频率、但问题仍然存在。

我还尝试使用 ADCINTFlG.bit.ADCINT1 代替 ADCCTL1.bit.ADCBSY 进行轮询、从而更好地适应 TI 示例(adc_ppb_offset_cpu01.c)、 然后固件崩溃。

我以10MHz 的步长检查了120至200MHz 之间的所有时钟频率。 错误 从150MHz 开始、 高于160MHz 时、错误 频率降低。

此致
1月

编译器 V16.9.5 LTS
SYS/BIOS V6.51.0.15

静态空 readADC (uint16& chC2、uint16& chD0、uint16& chD1)
{
EALLOW;
AdccRegs.ADCSOCFRC1.ALL = 0x0001;//强制 SOC0启动转换
AdcdRegs.ADCSOCFRC1.ALL = 0x0003;//强制 SOC0-SOC1开始转换
EDIS;

DELAY_US (200);

uint32 busyWait=0;
//等待 ADC 转换完成
while (AdccRegs.ADCCTL1.bit.ADCBSY = 1 || AdcdRegs.ADCCTL1.bit.ADCBSY = 1)
{
busyWait++;
DELAY_US (100);
}

chC2 = AdcResultRegs.ADCRESULT0;
chD0 = AdcdResultRegs.ADCRESULT0;
CHD1 = AdcdResultRegs.ADCRESULT1;

AdccRegs.ADCINTFLGCLR.ALL = 0x0003; //清除 ADCINT1和 ADCINT2标志
AdcdRegs.ADCINTFLGCLR.ALL = 0x0003; //清除 ADCINT1和 ADCINT2标志
}

静态空 configureADC()
{
EALLOW;
AdccRegs.ADCCTL2.bit.prescale = 14; // InputClock 分频器= 8 -> 120MHz/8 = 15MHz。
AdcdRegs.ADCCTL2.bit.prescale = 14;
CpuSysRegs.PCLKCR13.ALL = 0x000C; //为 ADC C 和 D 启用时钟

AdcSetMode (ADC_ADCC、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);
AdcSetMode (ADC_ADCD、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);

AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1; //为 ADC C 电路加电
AdcdRegs.ADCCTL1.bit.ADCPWDNZ = 1; //为 ADC D 电路加电

DELAY_US (1000);

// ADCC
AdccRegs.ADCSOC0CTL.bit.CHSEL = 2; // ADCINC2
AdccRegs.ADCSOC0CTL.bit.ACQPS = 43; //采集窗口

// ADCD
AdcdRegs.ADCSOC0CTL.bit.CHSEL = 0; // ADCIND0
AdcdRegs.ADCSOC0CTL.bit.ACQPS = 43; //采集窗口

AdcdRegs.ADCSOC1CTL.bit.CHSEL = 1; // ADCIND1
AdcdRegs.ADCSOC1CTL.bit.ACQPS = 43; //采集窗口

EDIS;
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看到您在写入 PCLKCR13之前正在写入 ADCCTL2.预 分频字段、但在您启用 PCLKCR13中的 ADC 之后、ADCCTL2寄存器才是不可写入的。 我怀疑您的 ADCCLK 超出了数据表中详细说明的建议限值。 检查采集窗口的数学计算、确保其符合数据表的最小值。

    惠特尼