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/TMS320F28379D:CCSv7

Guru**** 2606465 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/682663/ccs-tms320f28379d-ccsv7

器件型号:TMS320F28379D

工具/软件:Code Composer Studio

您好!

我正在使用 CCs7、C2000 V3和最新版本的编译器。 我使用 Launchpad。 我使用"优化关闭"

我想了解如何在最佳时间使用 ADC。

我使用来自 COntroleSUITE 的程序"adc_soc_software_sync_cpu01.c"。  (我的程序已结束)

我更改 CPU 时钟、查看 A1并对另一个 ADC 输入进行注释。

我使用 GPIO 进行测量、并在测量 GPIO 的时间之后(延迟_us 用于处于相同的情况)。  

在数据表中、I 高达3.5Mhz (窗口 s/h =(14 + 1)* 5ns =75ns /时间转换= 41*5ns = 205ns /周期 ADC = 280ns => 3.57Mhz)

我在 GPIO 0之前将 GPIO 22设置为1、  在 adcResult 之后将 GPIO 22设置为1。 我有:2,53E+6Hz

我尝试不使用 GPIO 0、在 adcResult 之前、我具有3.11E+6Hz。

我有三个问题:

   
为什么我没有3.5Mhz?

为什么当我尝试同步2个 ADC (如程序中的 A1和 B1与 SOC1)时,我会在转换时间中增加20ns?

为什么当我更改 ACQPS 时,转换时间不会改变?  


//######################################################################################################################
//
//文件:  adc_soc_software_sync_cpu01.c
//
//标题: F2837xD 的 ADC 同步软件触发。
//
//! addtogroup cpu01_example_list
//!

ADC 同步 SOC 软件强制(ADC_SoC_software_sync)


//!
//! 此示例使用的输入5转换 ADCA 和 ADCB 上的一些电压
//! 输入 X-BAR 作为软件力。 输入5通过切换 GPIO0触发、
//! 但可以使用任何备用 GPIO。 该方法将确保两个 ADC
//! 开始完全同时转换。
//!
//! 程序运行后、存储器将包含:
//!
//! -\b AdcaResult0 \b:引脚 A0\n 上电压的数字表示
//! -\b 结果1:引脚 A1上电压的数字表示\n
//! -\b AdcbResult0 \b:引脚 B0\n 上电压的数字表示
//! -\bAdcbResult1 \b:引脚 B1\n 上电压的数字表示
//!
//
//######################################################################################################################
//$TI 版本:F2837xD 支持库 V210 $
//$Release Date:Tue Nov1 14:46:15 CDT 2016 $
//版权所有:版权所有(C) 2013-2016 Texas Instruments Incorporated -
//            http://www.ti.com/ 保留所有权利$
//######################################################################################################################

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

//
//函数原型
//
void ConfigureADC (void);
void SetupADCSoftwareSync (void);
void SetupInputXBAR5 (void);

//
//全局
//
uint16 AdcaResult0;
uint16 AdcaResult1;
uint16 AdcbResult0;
uint16 AdcbResult1;

void main (void)

//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
//
   InitSysCtrl();
   InitSysPll (XTAL_OSC、IMULT_40、FULT_0、PLLCLK_By_2);
//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
   InitGpio();

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

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

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

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

//
//启用全局中断和更高优先级的实时调试事件:
//
   EINT; //启用全局中断 INTM
   ERTM; //启用全局实时中断 DBGM

//
//配置 ADC 并为其加电
//
   ConfigureADC();

//
//设置用于软件转换的 ADC
//
   SetupADCSoftwareSync();
   SetupInputXBAR5();

//
//循环无限地进行转换
//
   GPIO_SetupPinOptions (22、1、GPIO_PULLUP);
   操作
   {
       //
       //convert、等待完成并存储结果
       //

       //
       //在软件中切换 GPIO0。  这将导致触发
       //通过输入 XBAR 第5行来选择两个 ADC。
       //

       GpioDataRegs.GPADAT.bit.GPIO22 = 1;
       GpioDataRegs.GPADD.bit.GPIO0 = 1;
       GpioDataRegs.GPADD.bit.GPIO0 = 0;
       //GpioDataRegs.GPADD.bit.GPIO22 = 1;
       //GpioDataRegs.GPADD.bit.GPIO22 = 1;//除数网格
       //
       //等待 ADCA 完成,然后确认标志
       //由于两个 ADC 都同步运行,因此没有必要
       //等待两个 ADC 的完成通知
       //
       while (AdcaRegs.ADCINTFlG.bit.ADCINT1 = 0);
       AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;



       //
       //存储结果
       //
      // AdcaResult0 = AdcaResultRegs.ADCRESULT0;
       AdcaResult1 = AdcaResultRegs.ADCRESULT1;
      // AdcbResult0 = AdcbResultRegs.ADCRESULT0;
     // AdcbResult1 = AdcbResultRegs.ADCRESULT1;
GpioDataRegs.GPADAT.bit.GPIO22 = 0;

       //
       //此时,转换结果存储在中
       //AdcResult0、AdcResult1、AdcbResult0和 AdcbResult1
       //

       //
       //软件断点,再次点击运行以获取更新的转换
       //

          //   delay_US (0.1);
         //    GpioDataRegs.GPADAT.bit.GPIO22 = 0;
       asm ("  ESTOP0");

   } while (1);


//
// ConfigureADC -写入 ADC 配置并为两者加电
//               ADC A 和 ADC B
//
空配置 ADC (空)

   EALLOW;

   //
   //写入配置
   //
   AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
   AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
   AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
   AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);

   //
   //将脉冲位置设置为晚期
   //
   AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;
   AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;

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

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

   EDIS;

想象一下吧!

此致

JJ.

我的计划:
//
// SetupInputXBAR5 -设置 GPIO 0以触发输入 XBAR 第5行。  使用 GPIO0
//                  作为示例,但可以使用任何备用 GPIO。 。
//                  应允许物理 GPIO 引脚悬空、因为
//                  代码将其配置为输出并更改值。
//
void SetupInputXBAR5 (void)


   EALLOW;
   InputXbarRegs.INPUT5SELECT = 0;//GPIO0将触发输入 XBAR 第5行

   //
   //GPIO0作为输出
   //
   GPIO_SetupPinOptions (0、GPIO_OUTPUT、GPIO_PushPull);
   GPIO_SetupPinMux (0、GPIO_MUX_CPU1、0);

   //
   //GPIO0设为低电平
   //
   GpioDataRegs.GPADD.bit.GPIO0 = 0;
   EDIS;


//
// SetupADCSoftwareSync -设置 ADC 采集窗口和比较值
//
void SetupADCSoftwareSync (void)

   uint16 acqps;

   //
   //根据分辨率确定最小采集窗口(在 SYSCLKS 中)
   //
   if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)
   {
       acqps = 14;//75ns
   }
   否则、//分辨率为16位
   {
       acqps = 63;//320ns
   }

   //
   //选择要转换的通道和转换结束标志
   //ADCA
   //
   EALLOW;
/*   AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0将转换引脚 A0
   AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
                                          //1个 SYSCLK 周期
   AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 4;//输入 X-bar 的线路5将会
                                        //触发 ADC
   *
   AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1将转换引脚 A1
   AdcaRegs.ADCSOC1CTL.bit.ACQPS = 22;//采样窗口为 acqps +
                                          //1个 SYSCLK 周期
   AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 4;//输入 X-bar 的线路5将会
                                        //触发 ADC
   AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 1;// SOC1结束将设置 INT1标志
   AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;  //启用 INT1标志
   AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
   //
   //ADCB
   //
   /*
   AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0将转换引脚 B0
   AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
                                          //1个 SYSCLK 周期
   AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 4;//输入 X-bar 的第5行将会
                                        //触发 ADC

*
   /*
   AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1将转换引脚 B1
   AdcbRegs.ADCSOC1CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
                                          //1个 SYSCLK 周期
   AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 4;//输入 X-bar 的第5行将会
                                        //触发 ADC
*



//
//文件结束
//


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

    如果您使用的是 SW 强制背对背转换、则采样率将受到环路开销、触发至 SOC 启动时间(2个周期)和 GPIO 开销的限制。 如果您使用 XBAR 并行触发 ADC、这也会增加一些开销、使信号通过 XBAR 传播并在 ADC 触发逻辑中符合条件。

    如果您希望尽快转换、ePWM 或连续转换"乒乓"采样方法将是更好的起点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    好的

    谢谢你