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.

[参考译文] TMDSCNCD28388D:生成 PWM 自动更改时基周期

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1468309/tmdscncd28388d-generate-a-pwm-automatically-changing-the-time-base-period

器件型号:TMDSCNCD28388D
Thread 中讨论的其他器件:C2000WARE

工具与软件:

#include "f28x_project.h"
#include "sysctl.h"
//#include "f2838x_epwm.h"

// DEFINIZIONI

#define MYPWM_FREQUENCY 40000
#define MYDEADBAND_VALUE 0.001
#define OSC_FREQ 25000000
uint32_t MYSYSCLK;
uint32_t tbprd;
uint32_t clockDivider;
uint32_t timebaseclk;

//PROTOTIPI

void inizializzapwm1(void);
void inizializzapwm2(void);

// Main

void main(void)
{

    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    //This example function is found in the f2838x_sysctrl.c file.

    InitSysCtrl();


    // enable PWM1, PWM2

    CpuSysRegs.PCLKCR2.bit.EPWM1=1;
    CpuSysRegs.PCLKCR2.bit.EPWM2=1;

   // For this case just init GPIO pins for ePWM1, ePWM2, ePWM3
   // These functions are in the f2838x_epwm.c file

    InitEPwm1Gpio();
    InitEPwm2Gpio();
    //
    // Step 3. Clear all interrupts and initialize PIE vector table:
    // Disable CPU interrupts
    //
        DINT;

    //
    // Initialize the PIE control registers to their default state.
    // The default state is all PIE interrupts disabled and flags
    // are cleared.
    // This function is found in the f2838x_piectrl.c file.
    //
        InitPieCtrl();

    //
    // Disable CPU interrupts and clear all CPU interrupt flags:
    //
        IER = 0x0000;
        IFR = 0x0000;

    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    // This will populate the entire table, even if the interrupt
    // is not used in this example.  This is useful for debug purposes.
    // The shell ISR routines are found in f2838x_defaultisr.c.
    // This function is found in f2838x_pievect.c.
    //

        EALLOW;
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
        EDIS;

        inizializzapwm1();


        EALLOW;
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
        EDIS;

        for(;;)
            {
                asm ("    NOP");
            }
}
void inizializzapwm1()
        {
            //
            // Setup TBCLK

            //ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0x1;
            MYSYSCLK = SysCtl_getClock(OSC_FREQ);
            EPwm1Regs.TBCTL.bit.HSPCLKDIV = 2;      // Clock ratio to SYSCLKOUT
            EPwm1Regs.TBCTL.bit.CLKDIV = 2;
            clockDivider = EPwm1Regs.TBCTL.bit.HSPCLKDIV * EPwm1Regs.TBCTL.bit.CLKDIV;
            tbprd = (MYSYSCLK/clockDivider)/(2*MYPWM_FREQUENCY);
            EPwm1Regs.TBPRD = tbprd;
            EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

            EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // Load registers every ZERO
            EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
            EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
            EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

            EPwm1Regs.CMPA.bit.CMPA = tbprd/2;    // Set compare A value duty 50%
            EPwm1Regs.CMPB.bit.CMPB = tbprd/2;
            // Set Compare B value duty 50%

            EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;            // Set PWM1A on event A, up count
            EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;          // Clear PWM1A on event A, down count
            EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;            // Set PWM1B on event B, up count
            EPwm1Regs.AQCTLB.bit.CBD = AQ_SET;          // Clear PWM1B on event B, down count
            EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
            EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
            EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;
            EPwm1Regs.DBRED.bit.DBRED = 20;
            EPwm1Regs.DBFED.bit.DBFED = 20;

         }

尊敬的 Texas 支持部门:

我是意大利 Enea 的博士生、我想创建一个自动更新的代码 时基周期(TBPRD) 值、以便在给定频率下实现所需的 PWM 信号频率。 在我的代码中 时基期间 发生变化、但它无法使我实现所需的 PWM 频率。 如果您能帮助我理解我可能会出问题的地方、我将不胜感激。

提前感谢您的帮助。

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

    您好 Gianluca:

    请查找  可简化配置(包括计算 TBPRD)的应用手册 C2000 ePWM 开发人员指南。 您计算的是向上计数器或向下计数器。 请使用加减计数器公式来获取正确的值。

    此外、您还可以在 C2000Ware (C:\ti\c2000\C2000Ware_5_02_00_00\examples)中参考/使用我们的 EPWM 示例。 您可以从 https://www.ti.com/tool/C2000WARE 下载并安装相同组件。 这些示例还包含 TI SysConfig 工具、该工具可简化 ePWM 外设的配置。

    此致、

    Sumit