工具/软件:Code Composer Studio
你(们)好
我正在生成3PWM 波形。 我正在使用 EPW1、2、3。我可以得到3个波形、但我希望 PWM2和3相对于 PWM1的相移
我参考了 TI 提供的 ePWM 参考指南...我使用了示例13...图68
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.
工具/软件:Code Composer Studio
你(们)好
我正在生成3PWM 波形。 我正在使用 EPW1、2、3。我可以得到3个波形、但我希望 PWM2和3相对于 PWM1的相移
我参考了 TI 提供的 ePWM 参考指南...我使用了示例13...图68
谢谢您 Kris
我执行了它、但我没有得到它...这是我的代码、请仔细检查它
#include "F28x_Project.h"
#define PWM_PRD 5000;
#define PHI 500;
#define Phi2 50;
//函数原型
//
void InitEPwm1Examples(void);
void InitEPwm2Examples(void);
void InitEPwm3Examples(void);
_interrupt void epwm1_ISR (void);
_interrupt void epwm2_ISR (void);
_interrupt void epwm3_ISR (void);
//
//主函
//
void main (void)
{
//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
//
InitSysCtrl();
//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
// InitGpio();
//
//启用 PWM1、PWM2和 PWM3
//
CpuSysRegs.PCLKCR2.bit.EPWM1=1;
CpuSysRegs.PCLKCR2.bit.EPWM2=1;
CpuSysRegs.PCLKCR2.bit.EPWM3=1;
//
//在这种情况下、只需初始化 ePWM1、ePWM2、ePWM3的 GPIO 引脚
//这些函数位于 F2837xD_ePWM.c 文件中
//
InitEPwm1Gpio();
InitEPwm2Gpio();
InitEPwm3Gpio();
//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;
//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2837xD_PIECTRL.c 文件中。
//
InitPieCtrl();
//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xD_PieVect.c 中找到
//
InitPieVectTable();
//
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.EPWM1_INT =&epwm1_ISR;
PieVectTable.EPWM2_INT =&epwm2_ISR;
PieVectTable.EPWM3_INT =&epwm3/ISR;
EDIS; //这是禁止写入 EALLOW 受保护寄存器所必需的
//
//步骤4. 初始化器件外设:
//
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;
EDIS;
InitEPwm1Examples();
InitEPwm2Examples();
InitEPwm3Examples();
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;
//
//步骤5. 特定于用户的代码、启用中断:
//初始化计数器:
//
//EPwm1TimerIntCount = 0;
// EPwm2TimerIntCount = 0;
//EPwm3TimerIntCount = 0;
//
//启用连接到 EPWM1-3 INT 的 CPU INT3:
//
IER |= M_INT3;
//
//在 PIE 中启用 ePWM INTn:组3中断1-3
//
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
PieCtrlRegs.PIEIER3.bit.INTx3=1;
//
//启用全局中断和更高优先级的实时调试事件:
//
EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM
//
//步骤6. 空闲循环。 只需坐下来循环(可选):
//
for (;;)
{
ASM (" NOP");
}
}
_interrupt void epwm1_ISR (void)
{
EPwm1Regs.TBPHS.bit.TBPHS = 0;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
}
_interrupt void epwm2_ISR (void)
{
EPwm2Regs.TBPHS.bit.TBPHS = 0;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
}
_interrupt void epwm3_ISR (void)
{
EPwm3Regs.TBPHS.bit.TBPHS = 0;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
}
空 InitEPwm1示例(空)
{
EPwm1Regs.TBPRD = 1250; //设置定时器周期801 TBCLK
EPwm1Regs.TBPHS.bit.TBPHS = 0; //相位为0
EPwm1Regs.TBCTR = 0; //清除计数器
// //设置比较值0 //
EPwm1Regs.CMPA.bit.CMPA = 1250; //设置比较值
EPwm1Regs.CMPB.bit.CMPB = 1250;
// //设置计数器模式 //
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上和向下计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV =0;
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; //时钟与 SYSCLKOUT 之比
EPwm1Regs.TBCTL.bit.CLKDIV = 0;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
// //设置重影 //
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载
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
EPwm1Regs.ETSEL.bit.INTEN = 1; //启用 INT
EPwm1Regs.ETPS.bit.INTPRD = et_3rd; //在发生第三个事件时生成 INT
}
空 InitEPwm2Examples(空)
{
EPwm2Regs.TBPRD = 1250; //设置定时器周期801 TBCLK
EPwm2Regs.TBPHS.bit.TBPHS = 500; //相位为0
EPwm2Regs.TBCTR = 0; //清除计数器
// //设置比较值0 //
EPwm2Regs.CMPA.bit.CMPA = 1250; //设置比较值
EPwm2Regs.CMPB.bit.CMPB = 1250;
// //设置计数器模式 //
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上和向下计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; //启用相位加载
EPwm2Regs.TBCTL.bit.PHSDIR = TB_DOWN;
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //时钟与 SYSCLKOUT 的比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
// //设置重影 //
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// //设置操作 //
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; //在事件 A 上设置 PWM1A、向上
//计数
EPwm2Regs.AQCTLA.bit.ZRO = AQ_CLEAR; //在事件 A 上清除 PWM1A、
//倒计数
EPwm2Regs.AQCTLB.bit.CBU = AQ_CLEAR; //在事件 B 上设置 PWM1B,向上
//计数
EPwm2Regs.AQCTLB.bit.ZRO= AQ_SET; //在事件 B 上清除 PWM1B,
//倒计数
// //中断,我们将在其中更改比较值 //
EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //选择零事件时的 INT
EPwm2Regs.ETSEL.bit.INTEN = 1; //启用 INT
EPwm2Regs.ETPS.bit.INTPRD = et_3rd; //在发生第三个事件时生成 INT
}
空 InitEPwm3Examples(空)
{
EPwm3Regs.TBPRD = 1250; //设置定时器周期801 TBCLK
EPwm3Regs.TBPHS.bit.TBPHS = 500; //相位为0
EPwm3Regs.TBCTR = 0; //清除计数器
// //设置比较值0 //
EPwm3Regs.CMPA.bit.CMPA = 1250; //设置比较值
EPwm3Regs.CMPB.bit.CMPB = 1250;
// //设置计数器模式 //
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上和向下计数
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE; //启用相位加载
EPwm3Regs.TBCTL.bit.PHSDIR = TB_DOWN;
EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //时钟与 SYSCLKOUT 的比率
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
// //设置重影 //
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载
EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// //设置操作 //
EPwm3Regs.AQCTLA.bit.CAU = AQ_SET; //在事件 A 上设置 PWM1A、向上
//计数
EPwm3Regs.AQCTLA.bit.ZRO = AQ_CLEAR; //在事件 A 上清除 PWM1A、
//倒计数
EPwm3Regs.AQCTLB.bit.CBU = AQ_CLEAR; //在事件 B 上设置 PWM1B,向上
//计数
EPwm3Regs.AQCTLB.bit.ZRO= AQ_SET; //在事件 B 上清除 PWM1B,
//倒计数
// //中断,我们将在其中更改比较值 //
EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //选择零事件时的 INT
EPwm3Regs.ETSEL.bit.INTEN = 1; //启用 INT
EPwm3Regs.ETPS.bit.INTPRD = et_3rd; //在发生第三个事件时生成 INT
}