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.

[参考译文] TMS320F28335:如何将版本12.2代码转换为 v5.3.0。 ?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1317652/tms320f28335-how-to-convert-version-12-2-code-to-v5-3-0

器件型号:TMS320F28335
主题中讨论的其他器件:C2000WARE

尊敬的团队

我已经在版本12.2.0中编写针对闭环 PI 控制的 CCS 代码、但是我的微控制器与版本5.3.0兼容。

请推荐如何在 C2000版本、DCL.h 头文件、头文件兼容性方面继续进行。

谢谢。此致、

Ayush

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

    ##Code##

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



    //器件头文件和示例包括文件
    #include "DCL.h"
    #include "DSP2833x_Device.h"
    #include "DSP2833x_examples.h"
    #include "DSP2833x_GlobalPrototypes.h"

    #include "DCLF32.h"

    #include "dcl_fdlog.h"

    //#include "DCLC28.h"



    //
    //函数原型
    //
    浮点 rk = 20.0f;

    浮点 YK;

    浮动 lk;

    Float UK;

    浮动负荷;

    结构 DCL_PI pi1;
    DCL_pi pi1 = pi_defaults;




    //

    //函数原型

    //

    UINT16循环计数;

    UINT16转换计数;

    void ADC_ISR (void);

    void GPIO_select (void);

    void InitAdc (void);

    void InitEPwm1 (void);

    void control_ISR (void);







    浮点电压1;

    浮点 cmpa;






    //

    //主菜单

    //

    空 main (void)

    {

      InitSysCtrl();

      Dint;

      InitPieCtrl();

      EALLOW;

        #IF (CPU_FRQ_150MHz)   //默认- 150 MHz SYSCLKOUT

          //

          // HSPCLK=SYSCLKOUT/2*ADC_MODCLK2=150/  25.0 MHz

          //

          #define ADC_MODCLK 0x3

        #endif

        #IF (CPU_FRQ_100MHz)

          //

          // HSPCLK=SYSCLKOUT/2*ADC_MODCLK2=100/  25.0 MHz

          //

          #define ADC_MODCLK 0x2

        #endif

      EDIS;

      EALLOW;

        SysCtrlRegs.HISPCP.ALL = ADC_MODCLK;

      EDIS;

      IER = 0x0000;

      IFR = 0x0000;

      InitPieVectTable();




      EALLOW;      //这是写入 EALLOW 保护的寄存器所必需的

        PieVectTable.ADCINT =&ADC_ISR;

      EDIS;  //这是禁用对 EALLOW 保护寄存器的写入所必需的

      EALLOW;
        SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
        EDIS;
        EALLOW;
          SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
          EDIS;
      InitAdc (); //在本示例中,初始化 ADC
      //GPIO_select ();

     // InitEPwm1();




      PieCtrlRegs.PIEIER1.bit.INTx6 = 1;

      IER |= M_INT1;



      EINT;         //启用全局中断 INTM
       ERTM;         //启用全局实时中断 DBGM
       LoopCount = 0;
        ConversionCount = 0;




        /*初始化控制器变量*/

        PI1.KP=2.0f;

        pi1.ki=1.0f;

        PI1.Umax=0.8f;

        PI1.Umin=0.2f;




        Rk = 20.0f;                //控制参考的初始值

        lk = 1.0f;                //控制回路不饱和




        //

        //启用从 ePWM 到启动 SEQ1的 SOCA

        //
        //控制回路不饱和
        AdcRegs.ADCMAXCONV.all = 0x0001;    //在 SEQ1上设置2个转换

        AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3;//将 ADCINA3设置为第一次 SEQ1转换

        AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2;//将 ADCINA2设置为第二个 SEQ1转换
        AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;



        AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; //启用 SEQ1中断(每个 EOS)

        EPwm1Regs.ETSEL.bit.SOCAEN = 1;   //在组上启用 SOC
          EPwm1Regs.ETSEL.bit.SOCASEL = 4;  //在向上计数时从 CPMA 中选择 SOC
          EPwm1Regs.ETPS.bit.SOCAPRD = 1;   //在发生第1个事件时生成脉冲
          EPwm1Regs.CMPA.half.CMPA = 1875; //设置比较 A 值
          EPwm1Regs.TBPRD = 3750;       //设置 ePWM1的周期
          EPwm1Regs.TBCTL.bit.CTRMODE = 0;  //向上计数并开始




      用于(;;)

      {
        LoopCount++;
      }




    //

    // cpu_timer0_isr -



    void GPIO_select ()



    {



        EALLOW;

        GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;  //启用 GPIO0上的上拉

        GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;  //启用 GPIO0上的上拉

        GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0 = PWM1A

        GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // GPIO0 = PWM1B

        EDIS;

    void InitEPwm1()

    {

        EPwm1Regs.TBCTL.bit.CTRMODE = 0;//递减计数

        EPwm1Regs.TBPRD = 3750;    //设置计时器周期

        EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;  //禁用相位加载

        EPwm1Regs.TBPHS.half.TBPHS = 0x0000;    //相位为0

        EPwm1Regs.TBCTR = 0x0000;          //清除计数器

        EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x001;  //时钟与 SYSCLKOUT 的比率

        EPwm1Regs.TBCTL.bit.CLKDIV = 000;

        EPwm1Regs.TBCTL.bit.SYNCOSEL=1;

        EPwm1Regs.CMPA.half.CMPA = 1875;  //设置比较 A 值

        EPwm1Regs.CMPB = 1875;        //设置比较 B 值

        EPwm1Regs.CMPCTL.bit.LOADAMODE=1;

        EPwm1Regs.CMPCTL.bit.SHDWAMODE=0;

    /*     EPwm1Regs.DBCTL.bit.out_mode=3;

        EPwm1Regs.DBCTL.bit.POLSEL=2;

        EPwm1Regs.DBCTL.bit.IN_MODE=0;

        EPwm1Regs.DBRED=100;

        EPwm1Regs.DBFED=100;*/

        EPwm1Regs.AQCTLA.bit.ZRO=2;  //在零上设置 PWM1A

        EPwm1Regs.AQCTLA.bit.CAU=1;




          EPwm1Regs.ETSEL.bit.SOCAEN = 1;   //在组上启用 SOC

          EPwm1Regs.ETSEL.bit.SOCASEL = 1;  //在向上计数时从 CPMA 中选择 SOC

          EPwm1Regs.ETPS.bit.SOCAPRD = 1;   //在发生第1个事件时生成脉冲




    __interrupt void ADC_ISR (void)

    {

      YK=((int)AdcRegs.ADCRESULT0 >>4)*300.0f/4095.0f;




      //Voltage2[ConversionCount]= AdcRegs.ADCRESULT1 >>4;

      //DCL_runClamp_C1 (float *数据、float Umax、float Umin);

      //






      LK=0.0f;

      UK = DCL_runpi_c1 (&pi1、rk、YK);

      如果(英国>0.8f){

        英国=0.8f;

      }

      否则为(UK<0.1f){

        UK = 0.1f;

      }

      //Uk=0.5f;




      EPwm1Regs.CMPA.half.CMPA =(EPwm1Regs.TBPRD)*UK;  //设置比较 A 值

      EPwm1Regs.CMPB = EPwm1Regs.TBPRD*UK;        //设置比较 B 值

      //如果记录了40个转换,则重新开始

      //

      //

      //针对下一个 ADC 序列重新初始化

      //
     if (ConversionCount == 9)
      {
        ConversionCount = 0;
      }
      否则
      {
        ConversionCount++;
      }

      AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;      //重置 SEQ1

      AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;    //清除 INT SEQ1位

      PieCtrlRegs.PIEACK.all = PIEACK_Group1;  //确认到 PIE 的中断




      返回;

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

    DCL 不依赖于器件和 C2000Ware。 您可以在 C2000 Digital Power SDK 中找到使用 DCL 库的一些示例。

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

    尊敬的 Ayush:

    正如 Yanming 指出的、DCL 不依赖于 C2000Ware、它是一个独立的库、无论 CCS 和 C2000Ware 版本如何、都可以对其进行编译。

    尽管如此、如果您因较新版本而遇到任何错误或警告、请随时在此处发布、以便我们相应地解决问题。

    此致!

    王森