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/TMS320F28335:DSP 28335三相逆变器的正弦 PWM 的 CCS 程序帮助

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/698524/ccs-tms320f28335-help-for-ccs-program-for-sinusoidal-pwm-for-three-phase-inverter-for-dsp-28335

器件型号:TMS320F28335

工具/软件:Code Composer Studio

您好!

我使用以下 CCS 程序来帮助三相逆变器的正弦 PWM。

我正在获得输出、但我对采样时间有疑问、尤其是在两条线路之后

   SAMPLE_TIME = 20000.0/(200.0*A);

   ConfigCpuTimer (&CpuTimer0、150、sample_time);

应花费多少采样时间。 对于不同样本、iAM 会在输出中发生变化。

请帮助。 如果您有用于三相逆变器的正弦 PWM 的其他代码、请发送。

以下是程序:

void main (void)

   InitSysCtrl();   // DSP2833x_sysctrl.c 中的基本内核初始化

   EALLOW;
     SysCtrlRegs.WDCR= 0x00AF;   //重新启用看门狗
     EDIS;             // 0x00AF 要不禁用看门狗、预分频器= 64

   Dint;                //禁用所有中断

   GPIO_SELECT();             //选择所需的引脚作为输出

   InitPieCtrl();             // PIE 表的基本设置;

   InitPieVectTable();         // PIE 中的默认 ISR



   EALLOW;
   PieVectTable.TINT0 =&CPU_timer0_ISR;

   EDIS;

   InitCpuTimer();         //基本设置 CPU Timer0、1和2

     PieCtrlRegs.PIEIER1.bit.INTx7=1;


   IER |=1;             //为 ePWM1启用 INT3

   EINT;
   ERTM;


   SETUP_ePWM1 ();             // ePWM 引脚初始化

   SAMPLE_TIME = 20000.0/(200.0*A);

   ConfigCpuTimer (&CpuTimer0、150、sample_time);
   CpuTimer0Regs.TCR.bit.TSS = 0;     //启动 timer0

   while (1)
   {

         while (CpuTimer0.InterruptCount = 0);
         CpuTimer0.InterruptCount = 0;
   
         EALLOW;
         SysCtrlRegs.WDKEY = 0x55;   //服务 WD #1
         EDIS;
         sine_value1 =(a*sin (2*3.141593* index/200.0)+0.9999)/2.0;
         EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD -_IQsat (_IQ10mpy (_IQ10 (sine_value1)、EPwm1Regs.TBPRD)、EPwm1Regs.TBPRD、0);
         
         sine_value2 =(a*sin (((2*3.141593*index/200.0)+(2*3.141593/3))+0.9999)/2.0;
         EPwm2Regs.CMPA.half.CMPA = EPwm2Regs.TBPRD -_IQsat (_IQ10mpy (_IQ10 (sine_value2)、EPwm2Regs.TBPRD)、EPwm2Regs.TBPRD、0);
         
         sine_value3 =(a*sin (((2*3.141593* index/200.0)+(4*3.141593/3))+0.9999)/2.0;
         EPwm3Regs.CMPA.half.CMPA = EPwm3Regs.TBPRD -_IQsat (_IQ10mpy (_IQ10 (sine_value3)、EPwm3Regs.TBPRD)、EPwm3Regs.TBPRD、0);
         
            索引+=1;                  //转到下一个样本
         如果(索引>199)索引=0;



}   // while 循环结束
}// main 的末尾()


void GPIO_select (void)

   EALLOW;
   GpioCtrlRegs.GPAMUX1.ALL = 0;      // GPIO15... GPIO0 =通用尸体 I/O
   GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;   // ePWM1A 有效
   GpioCtrlRegs.GPAMUX1.bit.GPIO1=1;   // ePWM1B 激活
   GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;   // ePWM2A 有效
   GpioCtrlRegs.GPAMUX1.bit.GPIO3=1;   // ePWM2B 有效
   GpioCtrlRegs.GPAMUX1.bit.GPIO4=1;   // ePWM3A 激活
   GpioCtrlRegs.GPAMUX1.bit.GPIO5=1;   // ePWM3B 有效

   GpioCtrlRegs.GPAMUX2.ALL = 0;      // GPIO31... GPIO16 =通用 I/O
   GpioCtrlRegs.GPBMUX1.ALL = 0;      // GPIO47... GPIO32 =通用 I/O
   GpioCtrlRegs.GPBMUX2.ALL = 0;      // GPIO63... GPIO48 =通用 I/O
   GpioCtrlRegs.GPCMUX1.ALL = 0;      // GPIO79... GPIO64 =通用 I/O
   GpioCtrlRegs.GPCMUX2.ALL = 0;      // GPIO87... GPIO80 =通用 I/O

   GpioCtrlRegs.GPADIR.ALL = 0;
   GpioCtrlRegs.GPBDIR.ALL = 0xFFFFFFFF;  //
   GpioCtrlRegs.GPCDIR.ALL = 0xFFFFFFF;  //
   EDIS;


void Setup_ePWM1 (void)

   //EPwm1Regs.TBCTL.ALL = 0xC932;
   EPwm1Regs.TBCTL.bit.CLKDIV = 0;      // CLKDIV = 1
   EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;      // HSPCLKDIV = 1
   EPwm1Regs.TBCTL.bit.CTRMODE = 2;      //向上-向下计数模式
   EPwm1Regs.AQCTLA.ALL = 0x0060;         //在 CMPA 上设置 ePWM1A
   EPwm1Regs.TBPRD =(150000*1000/(2100*2.0));   // 2.100KHz 的定时器周期

   EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2;   //首先占空比为50%
   EPwm1Regs.CMPB = EPwm1Regs.TBPRD/2;

   EPwm1Regs.DBRED = 19;             // 2微秒死区
   EPwm1Regs.DBFED = 19;
   EPwm1Regs.DBCTL.bit.OUT_MODE = 3;
   EPwm1Regs.DBCTL.bit.POLSEL = 2;
   EPwm1Regs.DBCTL.bit.IN_MODE = 0;
///----------------------------------------------
   EPwm2Regs.TBCTL.bit.CLKDIV = 0;      // CLKDIV = 1
   EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0;      // HSPCLKDIV = 1
   EPwm2Regs.TBCTL.bit.CTRMODE = 2;      //向上-向下计数模式
   EPwm2Regs.AQCTLA.ALL = 0x0060;         //在 CMPA 上设置 ePWM2A
   EPwm2Regs.TBPRD =(150000*1000/(2100*2.0));   // 2.100KHz 的定时器周期

   EPwm2Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2;   //首先占空比为50%
   EPwm2Regs.CMPB = EPwm1Regs.TBPRD/2;

   EPwm2Regs.DBRED = 19;             // 2微秒死区
   EPwm2Regs.DBFED = 19;
   EPwm2Regs.DBCTL.bit.OUT_MODE = 3;
   EPwm2Regs.DBCTL.bit.POLSEL = 2;
   EPwm2Regs.DBCTL.bit.IN_MODE = 0;
///----------------------------------------------
   EPwm3Regs.TBCTL.bit.CLKDIV = 0;      // CLKDIV = 1
   EPwm3Regs.TBCTL.bit.HSPCLKDIV = 0;      // HSPCLKDIV = 1
   EPwm3Regs.TBCTL.bit.CTRMODE = 2;      //向上-向下计数模式
   EPwm3Regs.AQCTLA.ALL = 0x0060;         //在 CMPA 上设置 ePWM2A
   EPwm3Regs.TBPRD =(150000*1000/(2100*2.0));   // 2.100KHz 的定时器周期

   EPwm3Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2;   //首先占空比为50%
   EPwm3Regs.CMPB = EPwm1Regs.TBPRD/2;

   EPwm3Regs.DBRED = 19;             // 2微秒死区
   EPwm3Regs.DBFED = 19;
   EPwm3Regs.DBCTL.bit.OUT_MODE = 3;
   EPwm3Regs.DBCTL.bit.POLSEL = 2;
   EPwm3Regs.DBCTL.bit.IN_MODE = 0;

///----------------------------------------------
   EPwm1Regs.ETSEL.ALL = 0;
   EPwm1Regs.ETSEL.bit.INTEN = 1;      //针对 ePWM1启用中断
   EPwm1Regs.ETSEL.bit.INTSEL = 5;      // CMPA 上的中断向下匹配
   EPwm1Regs.ETPS.bit.INTPRD = 1;     //第一个事件发生中断

   EPwm2Regs.ETSEL.ALL = 0;
   EPwm2Regs.ETSEL.bit.INTEN = 1;      //针对 ePWM2启用中断
   EPwm2Regs.ETSEL.bit.INTSEL = 5;      // CMPA 上的中断向下匹配
   EPwm2Regs.ETPS.bit.INTPRD = 1;      //第一个事件发生中断

   EPwm3Regs.ETSEL.ALL = 0;
   EPwm3Regs.ETSEL.bit.INTEN = 1;      //针对 ePWM2启用中断
   EPwm3Regs.ETSEL.bit.INTSEL = 5;      // CMPA 上的中断向下匹配
   EPwm3Regs.ETPS.bit.INTPRD = 1;      //第一个事件发生中断





中断空 CPU_timer0_ISR (空)
// ISR 每2000ns 运行一次(PWM 频率= 500KHz)
//且由 ePWM1比较事件触发
//运行- ISR 的时间为630ns

   CpuTimer0.InterruptCount++;
    //每个中断处理看门狗
     EALLOW;
   SysCtrlRegs.WDKEY = 0xAA;      //服务监视器#2
   EDIS;


     //确认此中断以接收来自组3的更多中断
   PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    林根、
    您如何选择采样时间?
    当您改变采样时间时会发生什么情况?

    此致、
    Cody