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:F28069上的 ADC Ping Pong/连续采样

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/567608/tms320f28069-adc-ping-pong-continuous-sampling-on-f28069

器件型号:TMS320F28069
Thread 中讨论的其他器件:controlSUITE

您好!

我们尝试在 F28069 (EVM)上测试 ADC Ping Pong/连续采样。

我们尝试从以下网站导入 F2802x 的示例代码。
e2e.ti.com/.../2060564

但该代码不适用于 F28069,ADC 无法对输入信号进行采样...
请告诉我、如果要在上面的源代码中添加或修改任何其他内容、以便在 F28069上工作吗?

void ADC_Config (void);
void setup_ADC (void);
void take 样片(uint16、uint16*);

//此示例中使用的全局变量:
uint16 bufferA[100];


MAIN ()


  #ifdef _flash
   memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
  #endif

//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2802x_sysctrl.c 文件中。
  InitSysCtrl();

//步骤2. 初始化 GPIO:
//此示例函数位于 F2802x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
// InitGpio(); //针对此示例跳过

//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
  Dint;

//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2802x_PIECTRL.c 文件中。
  InitPieCtrl();

//禁用 CPU 中断并清除所有 CPU 中断标志:
  IER = 0x0000;
  IFR = 0x0000;

//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。  这对于调试很有用。
//可以在 F2802x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2802x_PieVect.c 中找到
  InitPieVectTable();

//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
  EALLOW; //这是写入 EALLOW 受保护寄存器所必需的

  EDIS;   //这是禁止写入 EALLOW 受保护寄存器所必需的
  //步骤4. 初始化所有器件外设:
     InitAdc (); //对于此示例,初始化 ADC
     AdcOffsetSelfCal();

  //步骤5. 特定于用户的代码、启用中断:
  //在 PIE 中启用 ADCINT1
     PieCtrlRegs.PIEIER1.bit.INTx1 = 1;  //在 PIE 中启用 INT 1.1
     IER |= M_INT1;                      //启用 CPU 中断1
     EINT;                               //启用全局中断 INTM
     ERTM;                               //启用全局实时中断 DBGM

  //函数调用以设置用于乒乓的 ADC
     Setup_adc();



     对于(;;)//call sample function、每50000us 重复执行一次。
     {
       //take 样本(100、bufferA、bufferB);
       take _samples (100、bufferA);
       DELAY_US (50000);
     }
  }

void setup_adc ()

   //启用带隙、时钟、上电等

   EALLOW;
   AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1;  //设置 ADC 时钟分频*
   AdcRegs.ADCCTL2.bit.CLKDIV4EN = 0;  //设置 ADC 时钟分频*
   //将所有 SOC 设置为指向通道 A4
   AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 0;//将 ADCNONOVERLAP 控制位设置 为允许*
   AdcRegs.ADCSOC0CTL.bit.CHSEL = 4;   //将 SOC0通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC1CTL.bit.CHSEL = 4;   //将 SOC1通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC2CTL.bit.CHSEL = 4;   //将 SOC2通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC3CTL.bit.CHSEL = 4;   //将 SOC3通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC4CTL.bit.CHSEL = 4;   //将 SOC4通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC5CTL.bit.CHSEL = 4;   //将 SOC5通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC6CTL.bit.CHSEL = 4;   //将 SOC6通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC7CTL.bit.CHSEL = 4;   //将 SOC7通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC8CTL.bit.CHSEL = 4;   //将 SOC8通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC9CTL.bit.CHSEL = 4;   //将 SOC9通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC10CTL.bit.CHSEL = 4;   //将 SOC10通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC11CTL.bit.CHSEL = 4;   //将 SOC11通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC12CTL.bit.CHSEL = 4;   //将 SOC12通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC13CTL.bit.CHSEL = 4;   //将 SOC13通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC14CTL.bit.CHSEL = 4;   //将 SOC14通道选择设置为 ADCINA4*/
   AdcRegs.ADCSOC15CTL.bit.CHSEL = 4;   //将 SOC15通道选择设置为 ADCINA4*/

   //在每个 SOC 上设置7个周期的最小采集时间
   AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;   //将 SOC0 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC1CTL.bit.ACQPS = 6;   //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC2CTL.bit.ACQPS = 6;   //将 SOC2 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC3CTL.bit.ACQPS = 6;   //将 SOC3 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC4CTL.bit.ACQPS = 6;   //将 SOC4 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC5CTL.bit.ACQPS = 6;   //将 SOC5 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC6CTL.bit.ACQPS = 6;   //将 SOC6 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC7CTL.bit.ACQPS = 6;   //将 SOC7 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC8CTL.bit.ACQPS = 6;   //将 SOC8 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC9CTL.bit.ACQPS = 6;   //将 SOC9 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC10CTL.bit.ACQPS = 6;   //将 SOC10 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC11CTL.bit.ACQPS = 6;   //将 SOC11 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC12CTL.bit.ACQPS = 6;   //将 SOC12 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC13CTL.bit.ACQPS = 6;   //将 SOC13 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC14CTL.bit.ACQPS = 6;   //将 SOC14 S/H 窗口设置为7个 ADC 时钟周期*/
   AdcRegs.ADCSOC15CTL.bit.ACQPS = 6;   //将 SOC15 S/H 窗口设置为7个 ADC 时钟周期*/


   //ADCINT 1和2被启用
   AdcRegs.INTSEL1N2.bit.INT1E = 1;      //启用/禁用 ADCINT1中断*
   AdcRegs.INTSEL1N2.bit.INT2E = 1;      //启用/禁用 ADCINT2中断*
   //ADCINT 1和2等待确认
   AdcRegs.INTSEL1N2.bit.INT1CONT = 0;      //启用/禁用 ADCINT1连续模式*/
   AdcRegs.INTSEL1N2.bit.INT2CONT = 0;      //启用/禁用 ADCINT2连续模式*/
   //SOC 6将触发 ADCINT1
   AdcRegs.INTSEL1N2.bit.INT1SEL = 6;      //设置 EOC6以触发 ADCINT1触发*
   //SOC 14将触发 ADCINT2
   AdcRegs.INTSEL1N2.bit.INT2SEL = 14;      //设置 EOC14以触发 ADCINT2触发*/

   //ADCINT2将触发前8个 SOC
   AdcRegs.ADCINTSOCSEL.bit.SOC0 = 2;      /* SOCx ADCINT2中断触发选择。*
   AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 2;
   AdcRegs.ADCINTSOCSEL1.bit.SOC2 = 2;      /* SOCx ADCINT2中断触发选择。*/
   AdcRegs.ADCINTSOCSEL1.bit.SOC3 = 2;
   AdcRegs.ADCINTSOCSEL1.bit.SOC4 = 2;      /* SOCx ADCINT2中断触发选择。*/
   AdcRegs.ADCINTSOCSEL1.bit.SOC5 = 2;
   AdcRegs.ADCINTSOCSEL.bit.SOC6 = 2;      /* SOCx ADCINT2中断触发选择。*
   AdcRegs.ADCINTSOCSEL1.bit.SOC7 = 2;

   //ADCINT1将触发第二个8个 SOC
   AdcRegs.ADCINTSOCSEL2.bit.SOC8 = 1;      /* SOCx ADCINT1中断触发选择。*
   AdcRegs.ADCINTSOCSEL2.bit.SOC9 = 1;
   AdcRegs.ADCINTSOCSEL2.bit.SOC10 = 1;   /* SOCx ADCINT1中断触发选择。*/
   AdcRegs.ADCINTSOCSEL2.bit.SOC11 = 1;
   AdcRegs.ADCINTSOCSEL2.bit.SOC12 = 1;   /* SOCx ADCINT1中断触发选择。*/
   AdcRegs.ADCINTSOCSEL2.bit.SOC13 = 1;
   AdcRegs.ADCINTSOCSEL2.bit.SOC14 = 1;   /* SOCx ADCINT1中断触发选择。*/
   AdcRegs.ADCINTSOCSEL2.bit.SOC15 = 1;
   EDIS;


void take 样片(uint16 sample_size、uint16*缓冲区)

   uint16索引= 0;

   //启用乒乓采样所需的 adcint1和 adcint2
   AdcRegs.INTSEL1N2.bit.INT1E = 1;      //启用/禁用 ADCINT1中断*
   AdcRegs.INTSEL1N2.bit.INT2E = 1;      //启用/禁用 ADCINT2中断*

   AdcRegs.ADCSOCFRC1.ALL = 0x00FF;//软件强制前8个 SOC 挂起标志
   while (index < sample_size){
      while (AdcRegs.ADCINTFlG.bit.ADCINT1 =0){/*等待、不执行任何操作*/}
      AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1

      //ADCINT1由 SOC6结束时触发。
      //由于完成了这些操作,因此将 SOC0-SOC7读取到缓冲器中
      //(这假设将通过转换 SOC7
      //代码到达它以放入缓冲区的时间)。
      //另请注意、SOC6触发了 ADCINT1
      //然后触发 SOC8-SOC15挂起。
      //这些新挂起的 SOC 将开始转换
      //在 SOC7完成后立即执行。

      Buffer[index++]= AdcResult.ADCRESULT0;
      Buffer[index++]= AdcResult.ADCRESULT1;
      Buffer[index++]= AdcResult.ADCRESULT2;
      Buffer[index++]= AdcResult.ADCRESULT3;
      Buffer[index++]= AdcResult.ADCRESULT4;
      Buffer[index++]= AdcResult.ADCRESULT5;
      Buffer[index++]= AdcResult.ADCRESULT6;
      Buffer[index++]= AdcResult.ADCRESULT7;

      while (AdcRegs.ADCINTFlG.bit.ADCINT2 ==0){/*等待、不执行任何操作*/}
      AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;//清除 ADCINT2

      //ADCINT2由 SOC14结束触发。
      //完成后,将 SOC8-SOC15读取到缓冲区中
      //(这假设 SOC15将由完成转换
      //代码到达它以放入缓冲区的时间)。
      //另请注意、SOC14触发了 ADCINT2
      //然后触发 SOC0-SOC7挂起。
      //这些新挂起的 SOC 将开始转换
      //在 SOC15完成后立即执行。

      Buffer[index++]= AdcResult.ADCRESULT8;
      Buffer[index++]= AdcResult.ADCRESULT9;
      Buffer[index++]= AdcResult.ADCRESULT10;
      Buffer[index++]= AdcResult.ADCRESULT11;
      Buffer[index++]= AdcResult.ADCRESULT12;
      Buffer[index++]= AdcResult.ADCRESULT13;
      Buffer[index++]= AdcResult.ADCRESULT14;
      Buffer[index++]= AdcResult.ADCRESULT15;
   }

   //禁用 adcint1和 adcint2以停止乒乓采样
   AdcRegs.INTSEL1N2.bit.INT1E = 0;
   AdcRegs.INTSEL1N2.bit.INT2E = 0;


此致
库米

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

    ADC 未能对信号进行采样的具体情况是什么? 软件是否在某个点挂起? 是否对信号进行了采样、但未按预期进行采样? 转换结果全为0吗?

    您使用什么信号源来驱动器件? 您是否已验证您可以使用 controlSUITE 中的其他 ADC 示例之一对此进行采样?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、

    谢谢你。

    目前、我们尝试通过将输入短接至 GND 来输入0V、
    但我们将获得随机值、而不是"0"。
    用于 controlSUITE 中 F28069的 ADC 示例代码工作正常。

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

    如果您使用不同的 controlSUITE ADC 示例、您是否能够在通道 A4上获得良好的转换结果? 这可能是一个很好的起点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、

    谢谢你。

    它与不同的 F28069示例代码一同工作、但是连续采样代码有问题。
    代码似乎在"_interrupt void ADCINT1_ISR (void)"处执行。尝试注释掉
    并发现实际 ADC 输入未反映在寄存器中。

    请告诉我是否有任何有效的示例代码
    F28069上的 Ping Pong/连续采样?

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

    已尝试使用 A4和 A2通道(来自 controlsuite 的 F28069示例代码)。
    如果我们将输入连接/短接至 GND、则获得正确的转换结果0V。

    如果有任何有效的示例代码、请告诉我
    F28069上的 Ping Pong/连续采样?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有什么建议吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Kummi、

    连续转换不应使用 ISR;数据速率太高、因此 CPU 应直接收集数据。  上述代码中的情况似乎就是这种情况、但您关于代码滞留在"_interrupt void ADCINT1_ISR (void)" ISR 中的注释中则不是这样。