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**** 2606725 points


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

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

器件型号:TMS320F28379D

工具/软件:Code Composer Studio

您好,

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

我不理解 ADC 的时间结果。  我的程序即将结束

测试1) 、其中:

  • acqs = 14、
  • SYSCLK = 200MHz、
  • ADCCLK = 50MHz (AdcaRegs.ADCCTL2.bit.prescale = 6)

我测量的执行时间接近74ns。

测试2) 、其中:

  • acqs = 1、
  • SYSCLK = 200MHz、
  • ADCCLK = 50MHz (AdcaRegs.ADCCTL2.bit.prescale = 6)

我测量的执行时间接近77ns。

测试3) 、其中:

  • acqs = 35、
  • SYSCLK = 200MHz、
  • ADCCLK = 50MHz (AdcaRegs.ADCCTL2.bit.prescale = 6)

我几乎交替测量74和160ns 的执行时间。

测量技术:

1)计划:

GPIO => 1.
代码
GPIO => 0

2) 2)"时间代码"=时间测量- GPIO 时间

GPIO 时间= 160/170ns

我的问题是

  1. 为什么我测量近75ns?

I Expected for I) (14+1)* SYSCLK + tlat = 290ns  、Tlat = 43 * 5ns = 215ns

2.我的衡量标准是“采集窗口持续时间”?  

我预期:<<“采集窗口持续时间”+转换>> 因为我有:

AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;

我的计划:

/* cpu1.c -创建日期:1个服务器。 2018 -作者:Haris */

//包含
#include "F28x_Project.h"
#include "driverlib.h"
#include "math.h"


void ConfigureADC (void);
void SetupADCSoftware (void);
void Init_adc_jj (void);

//void APWM1 (void);
_interrupt void CPU_timer0_ISR (void);
_interrupt void CPU_Timer1_ISR (void);
_interrupt void CPU_timer2_ISR (void);
void PWM1_init (float duty1、int 分辨率);
void PWM1 (float duty1);
int i = 0;


//变量 jj
uint16分辨率= 200;//200 => PWM = 500kHz
uint16 AdcResult[4];

uint16 RapportCyclique;
int Flag_Timer1=0;


// PWM 优化
uint32_t 寄存器偏移;
uint16 Rapport =0;

uint16 acqps;


int main (空)

   /***初始化 du Systeme et des PERIPHERIQUES***** /

   InitSysCtrl();
   InitGpio();
   InitPeripheralClocks();//初始化 DES 时钟
   InitFlash();//Initialize la RAM。
   FlashOff ();//Desactive la RAM。
   ServiceDoG();//初始化 DES Dog。
   InitEPwm1Gpio();//Initialize les GPIO pour generer un PWM sur la sortie 1.
   Dint;//清除所有中断
   InitPieCtrl();
   InitPieVectTable();


   InitSysPll (INT_OSC2、IMULT_20、FULT_0、PLLCLK_By_1);
   //INT_OSC2=>10MHz (= fOSCCLK)
   //fPLLSYSCLK = fOSCCLK *(SYSPLLMULT.IMULT + SYSPLLMULT.FAULT)/SYSCLKDIVSEL.PLLSYSCLKDIV
   //IMULT_X:乘法器 de r é quence (reglage de base 35)
   //FMULT_X:多路复用器(*0/*0.25/*0.5/*0.75)
   //PLLCLK_BY_X:PLLSYSCLKDIV:频率(最小1)
   EALLOW;
   ClkCfgRegs.PERCLKDIVSEL.BIT.EPWMCLKDIV = 1;//CLKDIV 会使频率下降
   EDIS;


   IER = 0x0000;//禁用 CPU 中断并清除所有 CPU 中断标志:
   IFR = 0x0000;
   //voir prog cpu_timers_cpu01覆铜和 d'info
   EALLOW; //这是写入 EALLOW 受保护寄存器所必需的
   PieVectTable.TIMER0_INT =&CPU_timer0_ISR;
   PieVectTable.Timer1_INT =&CPU_Timer1_ISR;
   PieVectTable.TIMER2_INT =&CPU_timer2_ISR;
   EDIS;   //这是禁止写入 EALLOW 受保护寄存器所必需的
   InitCpuTimer();

   //
   //将 CPU 定时器0、1和2配置为每秒中断一次:
   // 200MHz CPU 频率,1秒周期(以 uSeconds 为单位)
   //
       ConfigCpuTimer (&CpuTimer0、201、100000);// 201 est legerement plus proche que 200 de 1sec
       ConfigCpuTimer (&CpuTimer1、201、10);
       ConfigCpuTimer (&CpuTimer2、201、1000000);
       CpuTimer0Regs.TCR.ALL = 0x4000;
       CpuTimer1Regs.TCR.ALL = 0x4000;
       CpuTimer2Regs.TCR.ALL = 0x4000;
       IER |= M_INT1;//连接 LES 计时器到中断
       IER |= M_INT13;//timer 1 connecté à INT13
       IER |= M_INT14;
       PieCtrlRegs.PIEIER1.bit.INTx7=1;//自动 TINT0组1中断7
       EINT; //启用全局中断 INTM
       ERTM; //启用全局实时中断 DBGM


       init_adc_jjj ();
       PWM1_INIT (150、200);//初始化 du PWM1A

 GPIO_SetupPinOptions (22、1、GPIO_PULLUP);



 // asm ("  ESTOP0");//停止程序
   while (1){


       if (Flag_Timer1=1){


           GPIO_WritePin (22、1);
         // AdcRegs.ADCSOCFRC1.all = 0x0001;//强制 SOC 用于对 SOC 进行重新校准 A (1= SOC0、2= SOC1、3= S0C1和 SOC2)
         // AdcbRegs.ADCSOCFRC1.all = 0x0001;//强制 SOC 用于对 SOC 进行分频、使其复位 B (1= SOC0、2= SOC1、3= S0C1和 SOC2)
           while (AdcaRegs.ADCINTFlG.bit.ADCINT2 =0);// Flag INT2 :fin d'aquisiton pour le SOC0: ADCA0
           AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
         // while (AdcbRegs.ADCINTFlG.bit.ADCINT1 =0);//标志 INT 1:fin d'aquisiton pour le SOC0: ADCB3
           //AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
          // delay_US (0.290);
           AdcResult[0]= AdcResultRegs.ADCRESULT0;//依赖 SOC0 du Groupe A、缓冲存储器
           //AdcResult[2]= AdcbqResultRegs.ADCRESULT0;//依赖 SOC0 du Groupe B,缓冲存储




           GPIO_WritePin (22、0);


           Flag_Timer1 = 0;


           asm ("  ESTOP0");


       }
   }//fin Bouv无限制

  //返回0;// inutile avec la cle Bouvini




_interrupt void CPU_timer0_ISR (void)
{  CpuTimer0.InterruptCount++;

//
//确认此中断以从组1接收更多中断
//
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;


//
// CPU_Timer1_ISR - CPU Timer1 ISR
//
_interrupt void CPU_Timer1_ISR (void)

  CpuTimer1.InterruptCount++;

  Flag_Timer1 = 1;



//
// cpu_timer2_ISR CPU Timer2 ISR
//

_interrupt void CPU_timer2_ISR (void)

  CpuTimer2.InterruptCount++;




void PWM1_init (float duty1、int resolution)// LE PWM à une p é riode trop longue hors de du changement de rapport cyque si on ne fait pas
                                           //多路信号分离 PWM1_init et PWM1 (某些 reglage reste 配置)

//   浮点 Rapport;
  // Rapport = 1750 - duty1;// Reglage Haris
   rapport = resolution - duty1;

   /***定义 GPIO a utilizer **/

   GPIO_SetupPinOptions (0、1、GPIO_PULLUP);

   /**CARACTERISTIQUE DE LA PWM***** /
//ePWM_base selectionne quelle PWM on veut、第1条
   ePWM_setTimeBasePeriod (EPWM1_base、分辨率);//<-- 1750 de 分辨率

   ePWM_setTimeBasePeriod (EPWM1_base、(resolution));// resolution -1 comprendre pourquoi le -1 est (vrailevitile?) (程序)
   ePWM_setPhaseShift (EPWM1_base、0U);

   ePWM_setTimeBaseCounter (EPWM1_base、0U);//初始化 DU 计数器。

   ePWM_setCounterCompareValue (EPWM1_BASE、
                               ePWM_COUNTER_COMPARE_A、
                               友好关系);//<--- 环流环流环流环流环流环流环流环流环流环流环流环流环流



   ePWM_setTimeBaseCounterMode (EPWM1_base、
                               ePWM_COUNTER_MODE_UP);
   ePWM_DisablePhaseShiftLoad (EPWM1_base);
   ePWM_setClockPrescaler (EPWM1_base、
                          ePWM_CLOCK 分频器_1、
                          ePWM_HSCLOCK_DEVIDER_1);

   EPWM_setCounterCompareShadowImage LoadMode (EPWM1_BASE、
                                        ePWM_COUNTER_COMPARE_A、
                                        ePWM_COMP_LOAD_ON_CNTR_ZERO);

   ePWM_setActionQualifierAction (EPWM1_base、
                                 ePWM_AQ_OUTPUT A、
                                 ePWM_AQ_OUTPUT 高电平、
                                 ePWM_AQ_output_on_timebase_up_CMPA);
   ePWM_setActionQualifierAction (EPWM1_base、
                                 ePWM_AQ_OUTPUT A、
                                 ePWM_AQ_OUTPUT 低电平、
                                 ePWM_AQ_output_on_timebase_period);


void PWM1 (浮点型1)


   EPwm1Regs.CMPA.bit.CMPA =(uint16)(分辨率- duty1);




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

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

      //
      //循环无限地进行转换
      //
          AdcResult[0]= 0;
          AdcResult[1]= 0;
         AdcResult[2]= 0;
         AdcResult[3]= 0;// evite des valeurs 超出范围



空配置 ADC (空)

   EALLOW;

   //
   //写入配置
   //
   AdcaRegs.ADCCTL2.bit.prescale = 6;//divise 200MHz PAR 4 覆铜区最大自动量50MHz
   AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
   AdcSetMode (ADC_ADCA、ADC_resolution_12位 、ADC_SIGNALMODE_single);// ADC_resolution_12位常规 a la Place du 0
   AdcSetMode (ADC_ADCB、ADC_Resolution 12位 、ADC_SIGNALMODE_SINGLE);// ADC_Resolution 12位常规 a la Place du 0

   //
   //将脉冲位置设置为晚期
   //
   AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;//当前 INT 的解除结界时刻、1 =可分配
   AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;

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

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

   EDIS;


//
// SetupADCSoftware -设置 ADC 通道和采集窗口
//
空 SetupADCSoftware (空)

  // uint16 acqps;

   //
   //根据分辨率确定最小采集窗口(在 SYSCLKS 中)
   //
   if (adc_resolution_12bit  = AdcaRegs.ADCCTL2.bit.resolution)
   {
       acqps =14;//par 默认值:14 = 75ns => 1/2 LSB (15覆1/4LSB)
                  // 75ns =(14 + 1)* SYSCLK
   }
   否则、//分辨率为16位
   {
       acqps = 63;//320ns
   }

   //
   //选择要转换的通道和转换结束标志
   //ADCA
   //
   EALLOW;

   AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0将转换引脚 A0引脚30
   AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
                                          //1个 SYSCLK 周期
   AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 2;//SOC0 se d é clenche sur 定时器1

   //Trois lignes suivante attribut un flag à la conversion、c'est optionnel。
   AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 0;// SOC0结束将设置 INT2标志
   AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1;  //启用 INT2标志
   AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;//确保 INT2标志被清除



    AdcbRegs.ADCSOC0CTL.bit.CHSEL = 3; //SOC0将转换引脚 B3
    AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
                                           //1个 SYSCLK 周期
    AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 2;//SOC0 se d é clenche sur 定时器1

     AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志/0=> SOC0
     AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;  //启用 INT1标志
     AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除


   EDIS;






提前感谢,

此致

JJ.

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

    您对预期 ADC 时间的计算正确。 您可能还会注意到、在时序图中、从触发到 S+H 窗口启动的时间将有2个 SYSCLK 周期、您可以考虑这些周期。

    我想、由于 CPU 计时器触发 ADC、在进入 CPU 计时器 ISR 时、"Flag_Timer1"设置为1、执行分支回主线程、 第一个 SPIn 等待循环可实现设置"Flag_Timer1" ADC 已完成、您只需测量 SPIn 等待循环的时间即可实现 ADC INT 标志已设置、然后 CPU 读取 ADC 结果。

    您似乎有一些注释掉的代码、用于根据软件强制 ADC 触发来测量时间;这可能会让您更好地了解时间。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我理解原因。 很清楚!

    我使用 Sotfware 触发器进行测量!

    设想一下!  

    此致

    JJ.