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.

[参考译文] TMS320F28069:当我在 TMS320F28069上运行 ADC 时发现了一些奇怪的东西。 请帮助。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/726650/tms320f28069-i-found-something-odd-when-i-ran-the-adc-on-the-tms320f28069-please-help

器件型号:TMS320F28069

您好!

我已经设置了 ADC 转换后的中断请求。

但是、我观察到一些奇怪的行为。

当 INT1SEL 位为0至7时、可以确认 ADC 中断的调用频率与 ePWM 定时器事件周期相同。

但是、如果 INT1SEL 位设置为8至15、则以大于100kHz 的频率调用中断、速度要快得多。

我想知道导致上述情况的原因是什么。

下面是我测试过的代码。

----------------------------------------

//
//包含的文件
//
#include "DSP28x_Project.h"

//
//函数原型
//
_interrupt void ADC_ISR (void);
void ADC_Config (void);

//
//全局
//
uint16环计数;
UINT16转换计数;
uint16 Voltage0;
uint16 Voltage1;
uint16 Voltage2;
uint16 Voltage3;
uint16 Voltage4;
uint16 Voltage5;
uint16 Voltage6;
uint16 Voltage7;
uint16 Voltage8;
uint16电压9;
uint16 Voltage10;
uint16 Voltage11;
uint16 Voltage12;
uint16 Voltage13;
uint16 Voltage14;
uint16 Voltage15;

//
//主函
//
void main (void)

   Dint;
    IER = 0x0000;
   IFR = 0x0000;

   InitSysCtrl();

   EALLOW;
   GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;
   GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
   GpioDataRegs.GPADD.bit.GPIO0 = 0;
   EDIS;

   InitPieCtrl();
   InitPieVectTable();

   EALLOW;
   PieVectTable.ADCINT1 =&ADC_ISR;
   EDIS;

   PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
   IER |= M_INT1;

   InitAdc();
   AdcOffsetSelfCal();
   ADC_Config ();

   LoopCount = 0;
   ConversionCount = 0;

   EINT;
   ERTM;

   for (;;)
   {
       LoopCount++;
   }

//
//函数
//
_interrupt void ADC_ISR (void)

   GpioDataRegs.GPASET.bit.GPIO0 = 1;

   Voltage0 = AdcResult.ADCRESULT0;
   Voltage1 = AdcResult.ADCRESULT1;
   Voltage2 = AdcResult.ADCRESULT2;
   Voltage3 = AdcResult.ADCRESULT3;
   Voltage4 = AdcResult.ADCRESULT4;
   Voltage5 = AdcResult.ADCRESULT5;
   Voltage6 = AdcResult.ADCRESULT6;
   Voltage7 = AdcResult.ADCRESULT7;
   Voltage8 = AdcResult.ADCRESULT8;
   Voltage9 = AdcResult.ADCRESULT9;
   Voltage10 = AdcResult.ADCRESULT10;
   Voltage11 = AdcResult.ADCRESULT11;
   Voltage12 = AdcResult.ADCRESULT12;
   Voltage13 = AdcResult.ADCRESULT13;
   Voltage14 = AdcResult.ADCRESULT14;
   Voltage15 = AdcResult.ADCRESULT15;

   ConversionCount++;

   GpioDataRegs.GPACLEAR.bit.GPIO0=1;

   AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
   PieCtrlRegs.PIEACk.bit.ACK1=1;

空 ADC_Config (空)

   EALLOW;
   AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 0;
   AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;
   AdcRegs.INTSEL1N2.bit.INT1E = 1;
   AdcRegs.INTSEL1N2.bit.INT1CONT = 0;
   AdcRegs.INTSEL1N2.bit.INT1SEL = 15;

   AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;
   AdcRegs.ADCSOC2CTL.bit.CHSEL = 1;
   AdcRegs.ADCSOC4CTL.bit.CHSEL = 2;
   AdcRegs.ADCSOC6CTL.bit.CHSEL = 3;
   AdcRegs.ADCSOC8CTL.bit.CHSEL = 4;
   AdcRegs.ADCSOC10CTL.bit.CHSEL = 5;
   AdcRegs.ADCSOC12CTL.bit.CHSEL = 6;
   AdcRegs.ADCSOC14CTL.bit.CHSEL = 7;

   AdcRegs.ADCSAMPLEMODE.BIT.SIMULEN0 = 1;
   AdcRegs.ADCSAMPLEMODE.BIT.SIMULEN2 = 1;
   AdcRegs.ADCSAMPLEMODE.BIT.SIMULEN4 = 1;
   AdcRegs.ADCSAMPLEMODE.BIT.SIMULEN6 = 1;
   AdcRegs.ADCSAMPLEMODE.BIT.SIMULEN8 = 1;
   AdcRegs.ADCSAMPLEMODE.BIT.SIMULEN10 = 1;
   AdcRegs.ADCSAMPLEMODE.BIT.SIMULEN12 = 1;
   AdcRegs.ADCSAMPLEMODE.BIT.SIMULEN14 = 1;

   AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
   AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5;
   AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 5;
   AdcRegs.ADCSOC6CTL.bit.TRIGSEL = 5;
   AdcRegs.ADCSOC8CTL.bit.TRIGSEL = 5;
   AdcRegs.ADCSOC10CTL.bit.TRIGSEL = 5;
   AdcRegs.ADCSOC12CTL.bit.TRIGSEL = 5;
   AdcRegs.ADCSOC14CTL.bit.TRIGSEL = 5;

   AdcRegs.ADCSOC0CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC1CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC2CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC3CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC4CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC5CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC6CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC7CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC8CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC9CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC10CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC11CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC12CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC13CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC14CTL.bit.ACQPS = 10;
   AdcRegs.ADCSOC15CTL.bit.ACQPS = 10;

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

   EPwm1Regs.ETSEL.bit.SOCAEN = 1;
   EPwm1Regs.ETSEL.bit.SOCASEL = 4;
   EPwm1Regs.ETPS.bit.SOCAPRD = 1;
   EPwm1Regs.CMPA.half.CMPA = 0x0080;
   EPwm1Regs.TBPRD = 5999;
   EPwm1Regs.TBCTL.bit.CTRMODE = 0;
   EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
   EPwm1Regs.TBCTL.bit.CLKDIV = 0;

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

----------------------------------------

提前感谢。

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

    我使用 ADCINT2而不是 ADCINT1。
    当我这么做时、我可以观察到 ADC 的其他一些奇怪行为。

    *如果 INT2SEL 位的值介于0和7之间:观察到奇数行为。 (如上)
    *如果 INT2SEL 位的值介于8和15之间:ADC INT 和 ePWM SOC 事件时序相等。

    这与我上面所说的相反。

    在上述问题中、

    *使用 ADCINT1
    *如果 INT1SEL 位的值介于0和7之间:ADC INT 和 ePWM SOC 事件时序相等。
    *如果 INT1SEL 位的值介于8和15之间:观察到奇数行为。 (如上)

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

    如果未调用 AdcOffsetSelfCal(),该行为是否符合您的预期?

    该函数将为每个 SOC 配置自触发、因此如果您不禁用 ADCINTSOCSELn 中的自触发配置、您可能会看到 SOC 意外触发。

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有一个个人时间表,我的答复很晚了。
    我认为你所说的是我问题的原因。
    谢谢您、我解决了我的问题。
    感谢您的快速响应。