请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 频率。 如果您能帮助我理解我可能会出问题的地方、我将不胜感激。
提前感谢您的帮助。