Thread 中讨论的其他器件: C2000WARE
工具与软件:
您好!
下面的原理图显示了我正在使用的控制板、其中包括 TMS320F28377S。 如图所示、该电路板设计为使用 EPWM6A 及更高版本。 
在 TI 的 C2000Ware 中提供的示例中、EPWM_UP_AQ 示例仅采用 EPWM1至 EPWM3。 为了根据我的需求调整它、我修改了 EPWM_UP_AQ_cpu01.c 文件、以仅使用 EPWM6A、如下所示。 (但是、我没有对 F2837xS_GPIO.c 或 F2837xS_EPWM.c 等其他文件进行任何更改。)
========================================================================================================================================================================================================================================
#include "F28x_Project.h"
#define EPWM6_TIMER_TBPRD 2000 //周期寄存器
#define EPWM6_MAX_CMPA 950
#define EPWM6_MIN_CMPA 50
#define EPWM6_MAX_CMPB 1950
#define EPWM6_MIN_CMPB 1050
epwm_info epwm6_info;
void InitEPwm6Example (void);
_interrupt void epwm6_isr (void);
void main (void)
{
InitSysCtrl();
CpuSysRegs.PCLKCR2.bit.EPWM6=1;
颜色;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;//要写入 EALLOW 保护的寄存器、需要执行此操作
PieVectTable.EPWM6_INT =&epwm6_ISR;
EDIS;//这是禁用对 EALLOW 保护寄存器的写入所必需的
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
IER |= M_INT3;
PieCtrlRegs.PIEIER6.bit.INTx6 = 1;
EINT;//启用全局中断 INTM
erTM;//启用全局实时中断 DBGM
for (;;)
{
ASM (" NOP");
}
}
//
// epwm6_ISR - EPWM6 ISR 以更新比较值
//
_interrupt void epwm6_isr (void)
{
//
//更新 CMPA 和 CMPB 值
//
update_compare (&epwm6_info);
//
//清除此计时器的 INT 标志
//
EPwm6Regs.ETCLR.bit.INT = 1;
//
//确认该中断以接收来自组3的更多中断
//
PieCtrlRegs.PIEACK.all = PIEACK_Group3;
}
//
// InitEPwm6Example -初始化 EPWM6值
//
void InitEPwm6Example()
{
//
//设置 TBCLK
//
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//递增计数
EPwm6Regs.TBPRD = EPWM6_TIMER_TBPRD;//设置计时器周期
EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE;// Disable phase loading (禁用相位加载)
EPwm6Regs.TBPHS.bit.TBPHS = 0x0000;// Phase 为0
EPwm6Regs.TBCTR = 0x0000;//清除计数器
EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;//时钟与 SYSCLKOUT 的比率
EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV2;
//
//将影子寄存器加载设置为零
//
EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;
EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//
//设置比较值
//
EPwm6Regs.CMPA.bit.CMPA = EPWM6_MIN_CMPA;//设置比较一个值
EPwm6Regs.CMPB.bit.CMPB = EPWM6_MIN_CMPB;//设置比较 B 值
//
//设置操作
//
EPwm6Regs.AQCTLA.bit.ZRO = AQ_SET;//将 PWM6A 设置为零
EPwm6Regs.AQCTLA.bit.CAU = AQ_clear;//在事件 A 上清除 PWM6A、
//向上计数
EPwm6Regs.AQCTLB.bit.ZRO = AQ_SET;//将 PWM6B 设置为零
EPwm6Regs.AQCTLB.bit.CBU = AQ_clear;//在事件 B 上清除 PWM6B、
//向上计数
//
// Interrupt (中断)、其中我们将更改 Compare (比较)值
//
EPwm6Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//在发生归零事件时选择 INT
EPwm6Regs.ETSEL.bit.INTEN = 1;// Enable INT (启用 INT)
EPwm6Regs.ETPS.bit.INTPRD = ET_3RD;//在发生第3个事件时生成 INT
//
//信息此示例用于跟踪
// CMPA/CMPB 值的方向
//移动、允许的最小值和最大值和
//指向正确 ePWM 寄存器的指针
//
epwm6_info.ePWM_CMPA_DIRECTION = ePWM_CMP_UP;//通过增大开始
// CMPA & CMPB
epwm6_info.ePWM_CMPB_direction = ePWM_CMP_UP;
epwm6_info.EPwmTimerIntCount = 0;//将中断计数器归零
epwm6_info.EPwmRegHandle =&EPwm6Regs;//将指针设置为
// ePWM 模块
epwm6_info.EPwmMaxCMPA = EPWM6_MAX_CMPA;//设置最小值/最大值
// CMPA/CMPB 值
epwm6_info.EPwmMinCMPA = EPWM6_MIN_CMPA;
epwm6_info.EPwmMaxCMPB = EPWM6_MAX_CMPB;
epwm6_info.EPwmMinCMPB = EPWM6_MIN_CMPB;
}
//
// update_compare -更新指定 ePWM 的比较值
//
void update_compare (ePWM_info * ePWM_info)
{
//
//每隔10'CMPB 中断一次、更改 th CMPA/CMPB 值
//
if (EPWM_INFO->EPwmTimerIntCount == 10)
{
EPWM_INFO->EPwmTimerIntCount = 0;
//
//如果我们要增加 CMPA、请检查是否
//我们达到了最大值。 如果不是这样、请增加 CMPA
//否则、更改方向并减小 CMPA
//
if (EPWM_INFO->EPWM_CMPA_DIRECTION == EPWM_CMP_UP)
{
if (EPWM_INFO->EPwmRegHandle->CMPA.bit.CMPA < EPWM_INFO->EPwmMaxCMPA)
{
EPWM_INFO->EPwmRegHandle->CMPA.bit.CMPA++;
}
设计
{
EPWM_INFO->EPWM_CMPA_DIRECTION = EPWM_CMP_DOWN;
EPWM_INFO->EPwmRegHandle->CMPA.bit.CMPA--;
}
}
//
//如果我们要降低 CMPA、请检查是否
//我们达到了最小值。 否则、请降低 CMPA
//否则、更改方向并增加 CMPA
//
设计
{
if (ePWM_info->EPwmRegHandle->CMPA.bit.CMPA == ePWM_info->EPwmMinCMPA)
{
EPWM_INFO->EPWM_CMPA_DIRECTION = EPWM_CMP_UP;
EPWM_INFO->EPwmRegHandle->CMPA.bit.CMPA++;
}
设计
{
EPWM_INFO->EPwmRegHandle->CMPA.bit.CMPA--;
}
}
//
//如果我们要增大 CMPB、请检查是否
//我们达到了最大值。 如果不是这样的话、增加 CMPB
//否则、更改方向并减小 CMPB
//
if (EPWM_INFO->EPWM_CMPB_DIRECTION == EPWM_CMP_UP)
{
if (EPWM_INFO->EPwmRegHandle->CMPB.bit.CMPB < EPWM_INFO->EPwmMaxCMPB)
{
EPWM_INFO->EPwmRegHandle->CMPB.bit.CMPB++;
}
设计
{
ePWM_INFO->EPWM_CMPB_DIRECTION = ePWM_CMP_DOWN;
EPWM_INFO->EPwmRegHandle->CMPB.bit.CMPB--;
}
}
//
//如果我们降低了 CMPB、请检查是否
//我们达到了最小值。 如果不是这样、请减小 CMPB
//否则、更改方向并增加 CMPB
//
设计
{
if (EPWM_INFO->EPwmRegHandle->CMPB.bit.CMPB ==
EPWM_INFO->EPwmMinCMPB)
{
EPWM_INFO->EPWM_CMPB_DIRECTION = EPWM_CMP_UP;
EPWM_INFO->EPwmRegHandle->CMPB.bit.CMPB++;
}
设计
{
EPWM_INFO->EPwmRegHandle->CMPB.bit.CMPB--;
}
}
}
设计
{
EPWM_INFO->EPwmTimerIntCount++;
}
返回;
}
//
//文件结尾
//
================================================================================================================================================================================================================================================
尽管已根据修改后的文件完成了调试过程、但在使用示波器进行检查时、我在 PWM6A 上没有看到任何输出。
您能否提供有关需要修改哪些文件和特定代码来启用 EPWM6A 输出的指导?
非常感谢您的建议。
此致、
金承洙









