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/TMS320F2.8379万D:系统时钟计时器周期801 TBCLK

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/621257/ccs-tms320f28379d-system-clock-timer-period-801-tbclks

部件号:TMS320F2.8379万D
主题中讨论的其他部件: LAUNCHLL-F2.8379万D

工具/软件:Code Composer Studio

你好  

1.我正在为我的应用程序使用TMS320F2.8379万D.kit

以生成具有20kHz的PWM。

根据我的理解 ,SYSCLKOUT的器件脉冲宽度值=100 MHz。

根据该值,我应该得到TBPRD =5000(SYSCLKOUT/PWM频率)的值

但我不能 不去?

2.这是我正在工作的代码


#include "F28x_Project.h"
#define PWM_PRD 1250;
#define PHI 0;
void InitEPwm1示例(void);
__interrupt void epwm1_isr (void);
Void主(void)

InitSysCtrl();

CpuSysRegs.PCLKCR2.bit.EPWM1=1;

Initepwm1gpio();

色调;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectorTable();

EALLOW;
PieVectorTable.EPWM1_INT =&epwm1_ISR;

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

InitEPwm1Example();

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

IER |= M_INT3;

PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
PieCtrlRegs.PIEIER3.bit.INTx3 = 1;

EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM

对于(;;)

ASM (" NOP");
}
}

__interrupt void epwm1_isr (void)

EPwm1Regs.TBPHS.bit.TBPHS = 0;

EPwm1Regs.ETCLR.bit.INT = 1;

PieCtrlRegs.PIEACG.ALL = PIEACK_Group3;
}

void InitEPwm1example()

EPwm1Regs.TBPRD = PWM_PRD;//设置计时器周期801 TBCLK


EPwm1Regs.TBPHS.bit.TBPHS = 0;//相位为0
EPwm1Regs.TBCTR = 0;//清除计数器
////设置比较值0 //
EPwm1Regs.CMPA.bit.CMPA = 1250;// set比较值
EPwm1Regs.CMPB.bit.CMPB = 1250;


////设置计数器模式//
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//向上和向下计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//与SYSCLKOUT的时钟比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

////设置阴影//
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHAME;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADO;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZE;//零加载
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
////设置操作//
EPwm1Regs.AQCTLA.bit.CAU = AQ_set;//在事件A上设置PWM1A,up
//计数
EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR;//清除事件A上的PWM1A,
//向下计数

EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;//在事件B上设置PWM1B,UP
//计数
EPwm1Regs.AQCTLB.bit.ZRO= AQ_set;//清除事件B上的PWM1B,
//向下计数

////中断,我们将在此处更改比较值//
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//在零事件上选择INT
EPwm1Regs.ETSEL.bit.inten = 1;//启用INT
EPwm1Regs.ETPS.bit.INTPRD = ET_3;//在第三个事件上生成INT


}

我的计划的红色部分改变了吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我写这封信是为了让您知道,一位C2000小组成员已被指派担任此职位。 我们将尽力解答您的疑问。 但是,由于我们的其中一个站点受到恶劣天气的影响,因此可能会延迟响应。

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

    您好,

    kudithi nageswararao 说:
    根据此值,我应该得到TBPRD = 5000 (SYSCLKOUT/PWM频率)的值[/QUOT]

    您如何计算此值? 它应该使用以下公式:请验证从SYSCLK派生的TBCLK值。

    此致,

    Gautam

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

    我在这里设置了20kHz的5000

    EPwm1Regs.TBPRD = 5000; //设置定时器周期801 TBCLK
    EPwm1Regs.TBPHS.bit.TBPHS = 0; //相位为0
    EPwm1Regs.TBCTR = 0; //清除计数器


    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //与SYSCLKOUT的时钟比率
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;


    最后两个说明是否正确
    否则,如何编写?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于向上-向下计数模式,TBPRD应为2500。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复...
    但即使是2500,我也不会得到20kHz的频率
    对于1250,我不了解F2.8379万D的系统时钟设置

    这是我的代码
    void InitEPwm1example()

    EPwm1Regs.TBPRD = 1250; //设置定时器周期801 TBCLK
    EPwm1Regs.TBPHS.bit.TBPHS = 0; //相位为0
    EPwm1Regs.TBCTR = 0; //清除计数器
    ////设置比较值0 //
    EPwm1Regs.CMPA.bit.CMPA = 1250;// set比较值
    EPwm1Regs.CMPB.bit.CMPB = 1250;
    ////设置计数器模式//
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//向上和向下计数
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载




    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //与SYSCLKOUT的时钟比率
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;


    否则,我必须在这里设置


    //步骤4. 初始化所有设备外围设备:
    //此函数位于F28M36x_InitPeripherals.c中
    // InitPeripherals();//本示例不需要

    //在此示例中,仅初始化ePWM

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

    EDIS;

    InitEPwm1Example();
    InitEPwm2Example();
    InitEPwm3Example();

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

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

    TBCTL.CTRMODE设置为UP-DOWN。 因此,TBPRD = fTBCLK/(2 * fPWM)。
    在此设备中,
    最大SYSCLKOUT = 200 MHz,
    最大EPWMCLK = 100MHz,
    TBCLK = EPWMCLK/(HSPCLKDIV * CLKDIV)

    谢谢
    Vasudha
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    检查TB_DIV1的值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Vasudha
    谢谢你
    我能得到任何程序代码示例,表示最大EPWMCLK = 100MHz
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Kudithi,

    您使用的是哪种套件? 它是启动板还是controlCARD?
    您是否可以检查示例中的pllsysclk设置。 是设置为100MHz还是200MHz?

    复位时,CLK_CFG_regs.PERCLKDIVSEL.EPWMCLKDIV设置为/2。 如果SYSCLK被设置为100MHz,尝试将EPWMCLKDIV更改为0以保持EPWMCLK = SYSCLK / 1。

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

    CLK_CFG_REGS.PERCLKDIVSEL.EPWMCLKDIV在复位时设置为/2。 如果SYSCLK设置为100MHz,请尝试将EPWMCLKDIV更改为0,以保持EPWMCLK = SYSCLK / 1。[/QUET]

    完全正确! 对于TBPRD = 2500;HSPCLKDIV和CLKDIV应为/1。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Vasudha
    我正在使用LAUNCHTXL-F2.8379万D。

    这是我的程序...我必须在程序中为PLL SYSCLK设置编写说明,以获得100MHz。

    #include "F28x_Project.h"
    #define PWM_PRD 1250;
    #define PHI 0;
    void InitEPwm1示例(void);
    __interrupt void epwm1_isr (void);
    Void主(void)

    InitSysCtrl();

    CpuSysRegs.PCLKCR2.bit.EPWM1=1;

    Initepwm1gpio();

    色调;

    InitPieCtrl();

    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectorTable();

    EALLOW;
    PieVectorTable.EPWM1_INT =&epwm1_ISR;

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

    InitEPwm1Example();

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

    IER |= M_INT3;

    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
    PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
    PieCtrlRegs.PIEIER3.bit.INTx3 = 1;

    EINT;//启用全局中断INTM
    ERTM;//启用全局实时中断DBGM

    对于(;;)

    ASM (" NOP");
    }
    }

    __interrupt void epwm1_isr (void)

    EPwm1Regs.TBPHS.bit.TBPHS = 0;

    EPwm1Regs.ETCLR.bit.INT = 1;

    PieCtrlRegs.PIEACG.ALL = PIEACK_Group3;
    }

    void InitEPwm1example()

    EPwm1Regs.TBPRD = 1250; //设置定时器周期801 TBCLK
    EPwm1Regs.TBPHS.bit.TBPHS = 0; //相位为0
    EPwm1Regs.TBCTR = 0; //清除计数器
    ////设置比较值0 //
    EPwm1Regs.CMPA.bit.CMPA = 1250;// set比较值
    EPwm1Regs.CMPB.bit.CMPB = 1250;
    ////设置计数器模式//
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//向上和向下计数
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载




    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //与SYSCLKOUT的时钟比率
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;



    ////设置阴影//
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHAME;
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADO;

    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZE;//零加载
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
    ////设置操作//
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; //在事件A上设置PWM1A
    //计数
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR; //在事件A上清除PWM1A,
    //向下计数

    EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; //在事件B上设置PWM1B,启动
    //计数
    EPwm1Regs.AQCTLB.bit.ZRO= AQ_set; //在事件B上清除PWM1B,
    //向下计数

    ////中断,我们将在此处更改比较值//
    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //选择INT ON Zero Event
    EPwm1Regs.ETSEL.bit.inten = 1; //启用INT
    EPwm1Regs.ETPS.bit.INTPRD = ET_3; //在第三个事件上生成INT


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

    由于它是一个启动板,pllsysclk在InitSysCtrl()中被设置为100MHz,因为外部晶体在启动板中是10MHz。 尝试添加以下行,将epwmclk div设置为0,使epwmclk = pllsysclk/1。

    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;

    谢谢
    Vasudha
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Vasudha
    谢谢你
    案例:1.
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
    EPwm1Regs.TBCTL.bit.CLKDIV = 0;

    如果我使用了类似的方法,则TBPRD=2500获得10kHz的频率;

    案例:2.
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1;
    EPwm1Regs.TBCTL.bit.CLKDIV = 1;

    如果我使用这样的系统,则TBPRD=2500的频率为2.5KHz;
    这意味着x/4

    案例:3.
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    如果我使用了类似的方法,则TBPRD=2500获得10kHz的频率;

    案例:4.
    根据你的建议:如果我使用了这样的

    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;

    我得到了10kHz的TBPRD=2500;


    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=1;

    如果我使用了类似的方法,则TBPRD=2500获得5kHz的频率;

    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=TB_DIV1;

    如果我使用了类似的方法,则TBPRD=2500获得10kHz的频率;


    所以我无法理解如何使用SYSCLK设置TBPRD
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Gautam
    谢谢你
    我无法明白
    案例:1.
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
    EPwm1Regs.TBCTL.bit.CLKDIV = 0;

    如果我使用了类似的方法,则TBPRD=2500获得10kHz的频率;

    案例:2.
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1;
    EPwm1Regs.TBCTL.bit.CLKDIV = 1;

    如果我使用这样的系统,则TBPRD=2500的频率为2.5KHz;
    这意味着x/4

    案例:3.
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    如果我使用了类似的方法,则TBPRD=2500获得10kHz的频率;

    案例:4.
    根据你的建议:如果我使用了这样的

    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;

    我得到了10kHz的TBPRD=2500;


    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=1;

    如果我使用了类似的方法,则TBPRD=2500获得5kHz的频率;

    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=TB_DIV1;

    如果我使用了类似的方法,则TBPRD=2500获得10kHz的频率;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Nageswara,

    假设SYSCLK为100 MHz。 您需要配置以下所有项:

    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; //表示 /1

    EPwm1Regs.TBCTL.bit.CLKDIV = 0;      //表示/1.

    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0; //表示pllsysclk的/1

     

    使用上述设置:

    SYSCLK = 100 MHz

    epwmclk = SYSCLK/epwmclkdiv = 100 MHz

    TBCLK = epwmclk/(hspclkdiv*clkdiv)= 100 MHz

    tbprd = 100MHz/(2 * 20kHz)= 2500

    同样,案例1和案例3与TB_DIV1相同,应为0。

    对于案例4,hspclkdiv和clkdiv值是什么?

    谢谢

    Vasudha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Vasudha
    非常感谢,现在我就明白了。


    案例:1.
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
    EPwm1Regs.TBCTL.bit.CLKDIV = 0;

    如果我使用类似的方法,则TBPRD=2500获得20kHz的频率;

    案例:2.
    //ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;
    ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV =0;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
    EPwm1Regs.TBCTL.bit.CLKDIV = 0;

    如果我使用类似的方法,则TBPRD=2500获得20kHz的频率;


    案例:3.
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    如果我使用类似的方法,则TBPRD=2500获得20kHz的频率;

    但是

    如何为TBPRD=5000获得20kHz?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于上下计数器模式,TbPRD = 2500 (20kHz)。
    您可以将CTR模式更改为向上或向下,然后TBPRD = 4999将提供20kHz。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CTRMODE怎么可能?
    因为它是200MHz处理器