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.

[参考译文] TMS320F28379D:ADC 问题

Guru**** 2609255 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/682482/tms320f28379d-adc-problem

器件型号:TMS320F28379D

大家好、

我的 F28379的 ADC 有问题。 我尝试使用 ePWM1-SOCA 信号同时读取 ADCINA2-A3-A4、B2-B3-B4、C2-C3、C4和 D2-D3-D4。  ADC 执行转换、但问题出在 AdcResult 寄存器。 我在不同的 adcresult 寄存器中看到一次转换的结果。 例如、我使用 SOC0转换 ADCINB2信号。 因此、我期望从 AdcbResultRegs.ADCRESULT0获取结果。 但结果有时可能是 ADCRESULT1或 ADCRESULT1 2。 我知道我缺少一些东西。 但我找不到它。 我们将感谢您的任何帮助。

这是我的 ADC 的初始化代码。  请注意、我在另一个函数中初始化 ePWM1 SOCA 信号。 此外、我确信我会给 ADC 充足的时间来执行转换。 因此、采集窗口大小不是问题。

void InitializeADCs()
{
EALLOW;

//设置分频器以确定 ADC 的 ADCCLK
AdcaRegs.ADCCTL2.bit.prescale = 0;//将 ADCCLK 分频器设置为/1
AdcbRegs.ADCCTL2.bit.prescale = 0;//将 ADCCLK 分频器设置为/1
AdccRegs.ADCCTL2.bit.prescale = 0;//将 ADCCLK 分频器设置为/1
AdcdRegs.ADCCTL2.bit.prescale = 0;//将 ADCCLK 分频器设置为/1

//设置 ADC 的分辨率和信号模式
AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);
AdcSetMode (ADC_ADCC、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);
AdcSetMode (ADC_ADCD、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);

//为 ADC 加电
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdcdRegs.ADCCTL1.bit.ADCPWDNZ = 1;

//延迟1ms 以允许 ADC 加电时间
DELAY_US (1000);

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2;//SOC0将转换引脚 A2
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 2; //SOC0将转换引脚 B2
AdccRegs.ADCSOC0CTL.bit.CHSEL = 2; //SOC0将转换引脚 C2
AdcdRegs.ADCSOC0CTL.bit.CHSEL = 2; //SOC0将转换引脚 D2

AdcaRegs.ADCSOC1CTL.bit.CHSEL = 3; //SOC1将转换引脚 A3
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 3; //SOC1将转换引脚 B3
AdccRegs.ADCSOC1CTL.bit.CHSEL = 3; //SOC1将转换引脚 C3
AdcdRegs.ADCSOC1CTL.bit.CHSEL = 3; //SOC1将转换引脚 D3

AdcaRegs.ADCSOC2CTL.bit.CHSEL = 4; //SOC2将转换引脚 A4
AdcbRegs.ADCSOC2CTL.bit.CHSEL = 4; //SOC2将转换引脚 B4
AdccRegs.ADCSOC2CTL.bit.CHSEL = 4; //SOC2将转换引脚 C4
AdcdRegs.ADCSOC2CTL.bit.CHSEL = 4; //SOC2将转换引脚 D4

uint16 AcquionWindowRegValue = 28;
AdcaRegs.ADCSOC0CTL.bit.ACQPS = AcquiionWindowRegValue;
AdcbRegs.ADCSOC0CTL.bit.ACQPS = AcquisionWindowRegValue;
AdccRegs.ADCSOC0CTL.bit.ACQPS = AcquiionWindowRegValue;
AdcdRegs.ADCSOC0CTL.bit.ACQPS = AcquiionWindowRegValue;

AdcaRegs.ADCSOC1CTL.bit.ACQPS = AcquiionWindowRegValue;
AdcbRegs.ADCSOC1CTL.bit.ACQPS = AcquisionWindowRegValue;
AdccRegs.ADCSOC1CTL.bit.ACQPS = AcquiionWindowRegValue;
AdcdRegs.ADCSOC1CTL.bit.ACQPS = AcquiionWindowRegValue;

AdcaRegs.ADCSOC2CTL.bit.ACQPS = AcquiionWindowRegValue;
AdcbRegs.ADCSOC2CTL.bit.ACQPS = AcquisionWindowRegValue;
AdccRegs.ADCSOC2CTL.bit.ACQPS = AcquiionWindowRegValue;
AdcdRegs.ADCSOC2CTL.bit.ACQPS = AcquiionWindowRegValue;

// ePWM1 SOCA 将触发 SOC0
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
AdccRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 5;

// ePWM1 SOCA 将触发 SOC1
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5;
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 5;
AdccRegs.ADCSOC1CTL.bit.TRIGSEL = 5;
AdcdRegs.ADCSOC1CTL.bit.TRIGSEL = 5;

// ePWM1 SOCA 将触发 SOC1
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 5;
AdcbRegs.ADCSOC2CTL.bit.TRIGSEL = 5;
AdccRegs.ADCSOC2CTL.bit.TRIGSEL = 5;
AdcdRegs.ADCSOC2CTL.bit.TRIGSEL = 5;

AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;// 1 =转换结束时的 INT
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;// 1 =启用 ADC 中断1
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 2;// 2 = INT SOURCE:EOC2
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;// 1 =清除 INT 标志

EDIS;
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我解决了我的问题。 它与预分频值有关。 必须对其进行调整、使 ADC 时钟小于50MHz、这是数据表中写入的 ADC 时钟的最大值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Kadir、

    很高兴您解决了这个问题。 如果您尝试对器件或特定模块进行超频、肯定会遇到问题。 这些问题可能是瞬态的、也可能仅出现在某些器件子集或特定条件下(例如高温或低温或电源电压)、因此请务必始终保持在建议的工作条件内!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、

    感谢您的建议。 我始终尝试保持在数据表值范围内。 但在这里、我错误地对 ADC 进行了超频。