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.
我的问题是这样的:
EPWM已经全部用作PWM的发生单元,还有两路PWM打算使用ECAP的APWM功能。
这两部分PWM频率是一样的,现在想问下他们之间的相位是怎样的?
我知道EPWM内部是可以调节之间的相位关系,APWM内也可以 调节互相的相位关系,但是EPWM和APWM可以调节相位关系吗?
或者我不做设置时,EPWM和APWM是自动同相的吗?
期待高手解疑,在线等。
非常感谢!
你C2000哪个系列产品,EPWM通道几要和APWM同步?EPWM的同步拓扑在目前的几个系列中有区别,比如F28035就是完全从上到下串联,然后ECAP1并联在PWM1模块上的
谢谢您 但是我改了下 EPWM还是和APWM有一个250ns的延迟,下面是我的程序 您看下 哪里写的不对 麻烦了
void SetupAPWM(void)//ecap产生APWM
{
ECap1Regs.CAP1 = 0x5DC; // Set Period value按照150M计算的
ECap1Regs.CTRPHS=0x1; //相位控制寄存器
ECap1Regs.ECCTL2.bit.CAP_APWM = 1; // Enable APWM mode
ECap1Regs.ECCTL2.bit.APWMPOL=0;//1:输出为低电平有效 0:高电平
ECap1Regs.ECCTL2.bit.SYNCI_EN=1;//同步信号选择
ECap1Regs.CAP2 = 0x2EE; // Set Compare value50%处
ECap1Regs.ECCLR.all = 0x0FF; // Clear pending interrupts
ECap1Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int
ECap3Regs.CAP1 = 0x5DC; // Set Period value按照150M计算的
ECap3Regs.CTRPHS=0x1; //相位控制寄存器
ECap3Regs.ECCTL2.bit.CAP_APWM = 1; // Enable APWM mode
ECap3Regs.ECCTL2.bit.APWMPOL=0;//1:输出为低电平有效 0:高电平
ECap3Regs.ECCTL2.bit.SYNCI_EN=1;//同步信号选择
ECap3Regs.CAP2 = 0x2EE; // Set Compare value50%处
ECap3Regs.ECCLR.all = 0x0FF; // Clear pending interrupts
ECap3Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;
ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1;
}
void SetupEPwmAB_A1A2(void) //byJJ 上下桥臂50% 完全互补
{
//setup TimeBase(TB)
EPwm1Regs.TBPRD = 1500; //Tpwm=TBPRD*Ttbclk Set PWM period 10us 100kHz
EPwm1Regs.TBPHS.half.TBPHS = 1; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter
// Setup TBCTL
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // updown count mode
EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 不使用移相方式
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; //变化TBPRD时,使用shadow寄存器(即当计数器为0时才更新)
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // 计数到0时输出同步清零信号
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT150MHz
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; //两个均直通,即计数器时钟为系统时钟
// Setup CMPCTL
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW; // Load registers every ZERO
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// Setup CMP
EPwm1Regs.CMPA.half.CMPA =750;
// Set actions
// Set PWM1A ///
EPwm1Regs.AQCTLA.bit.CAU=AQ_SET; //计数器(增加时)=比较器A时,输出high
EPwm1Regs.AQCTLA.bit.ZRO=AQ_CLEAR; //计数器(递减时)=比较器B时,输出low
//set Deadband
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //启用死区发生器,EPwmxa和EPwmxb均使用
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //A:刚得到的波形反向 B刚得到的波形 所以保证了phaseAB_A就是对角桥臂的移相角 这样比较直观
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;//D BA_ALL 这种模式实际上只需要epwmxa作为输入,即可产生带死区的两路xa,xb输出了
EPwm1Regs.DBRED = EPWM_MIN_DB; //上升沿延时
EPwm1Regs.DBFED = EPWM_MIN_DB; //下降沿延时
}
void SetupEPwmAB_A3A4(void) //byJJ 上下桥臂50% 完全互补
{
//setup TimeBase(TB)
EPwm2Regs.TBPRD = 1500; //Tpwm=TBPRD*Ttbclk Set PWM period 10us 100kHz
EPwm2Regs.TBPHS.half.TBPHS = 1; // Phase is 0
EPwm2Regs.TBCTR = 0x0000; // Clear counter
// Setup TBCTL
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // updown count mode
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 不使用移相方式
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW; //变化TBPRD时,使用shadow寄存器(即当计数器为0时才更新)
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // 同步信号与epwm1一致
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; //两个均直通,即计数器时钟为系统时钟
// Setup CMPCTL
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW; // Load registers every ZERO
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm2Regs.CMPA.half.CMPA=750;
EPwm2Regs.AQCTLA.bit.CAU=AQ_CLEAR; //计数器(增加时)=比较器A时,输出low
EPwm2Regs.AQCTLA.bit.ZRO=AQ_SET; //计数器(递减时)=比较器B时,输出high
//set Deadband
// Active High Com plementary PWMs - Setup Deadband 使用了死区模块,这里设置为输入只用了EPwmxA,因此输出一定是互补的了
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //启用死区发生器,EPwmxa和EPwmxb均使用
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //A:刚得到的波形反向 B刚得到的波形 所以保证了phaseAB_A就是对角桥臂的移相角 这样比较直观
EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;//D BA_ALL 这种模式实际上只需要epwmxa作为输入,即可产生带死区的两路xa,xb输出了
EPwm2Regs.DBRED = EPWM_MIN_DB; //上升沿延时
EPwm2Regs.DBFED = EPWM_MIN_DB; //下降沿延时
}
//setup TimeBase(TB)
EPwm1Regs.TBPRD = 1500; //Tpwm=TBPRD*Ttbclk Set PWM period 10us 100kHz
EPwm1Regs.TBPHS.half.TBPHS = 1; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter
// Setup TBCTL
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // updown count mode
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 不使用移相方式
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; //变化TBPRD时,使用shadow寄存器(即当计数器为0时才更新)
EPwm1Regs.TBCTL.bit.SYNCOSEL = 1 // 计数到0时输出同步清零信号
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT150MHz
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; //两个均直通,即计数器时钟为系统时钟
// Setup CMPCTL
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW; // Load registers every ZERO
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// Setup CMP
EPwm1Regs.CMPA.half.CMPA =750;
// Set actions
// Set PWM1A ///
EPwm1Regs.AQCTLA.bit.CAU=AQ_SET; //计数器(增加时)=比较器A时,输出high
EPwm1Regs.AQCTLA.bit.ZRO=AQ_CLEAR; //计数器(递减时)=比较器B时,输出low
//set Deadband
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //启用死区发生器,EPwmxa和EPwmxb均使用
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //A:刚得到的波形反向 B刚得到的波形 所以保证了phaseAB_A就是对角桥臂的移相角 这样比较直观
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;//D BA_ALL 这种模式实际上只需要epwmxa作为输入,即可产生带死区的两路xa,xb输出了
EPwm1Regs.DBRED = EPWM_MIN_DB; //上升沿延时
EPwm1Regs.DBFED = EPWM_MIN_DB; //下降沿延时
}
void SetupEPwmAB_A3A4(void) //byJJ 上下桥臂50% 完全互补
{
//setup TimeBase(TB)
EPwm2Regs.TBPRD = 1500; //Tpwm=TBPRD*Ttbclk Set PWM period 10us 100kHz
EPwm2Regs.TBPHS.half.TBPHS = 1; // Phase is 0
EPwm2Regs.TBCTR = 0x0000; // Clear counter
// Setup TBCTL
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // updown count mode
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 不使用移相方式
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW; //变化TBPRD时,使用shadow寄存器(即当计数器为0时才更新)
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // 同步信号与epwm1一致
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; //两个均直通,即计数器时钟为系统时钟
// Setup CMPCTL
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW; // Load registers every ZERO
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm2Regs.CMPA.half.CMPA=750;
EPwm2Regs.AQCTLA.bit.CAU=AQ_CLEAR; //计数器(增加时)=比较器A时,输出low
EPwm2Regs.AQCTLA.bit.ZRO=AQ_SET; //计数器(递减时)=比较器B时,输出high
//set Deadband
// Active High Com plementary PWMs - Setup Deadband 使用了死区模块,这里设置为输入只用了EPwmxA,因此输出一定是互补的了
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //启用死区发生器,EPwmxa和EPwmxb均使用
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //A:刚得到的波形反向 B刚得到的波形 所以保证了phaseAB_A就是对角桥臂的移相角 这样比较直观
EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;//D BA_ALL 这种模式实际上只需要epwmxa作为输入,即可产生带死区的两路xa,xb输出了
EPwm2Regs.DBRED = EPWM_MIN_DB; //上升沿延时
EPwm2Regs.DBFED = EPWM_MIN_DB; //下降沿延时
PWM1和PWM2红色的地方注意。其他PWM和PWM2一样
ECap1Regs.CAP1 = 0x5DC; // Set Period value按照150M计算的
ECap1Regs.CTRPHS=0x1; //相位控制寄存器
ECap1Regs.ECCTL2.bit.CAP_APWM = 1; // Enable APWM mode
ECap1Regs.ECCTL2.bit.APWMPOL=0;//1:输出为低电平有效 0:高电平
ECap1Regs.ECCTL2.bit.SYNCI_EN=1;//同步信号选择
ECap1Regs.CAP2 = 0x2EE; // Set Compare value50%处
ECap1Regs.ECCLR.all = 0x0FF; // Clear pending interrupts
ECap1Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int
ECap3Regs.CAP1 = 0x5DC; // Set Period value按照150M计算的
ECap3Regs.CTRPHS=0x1; //相位控制寄存器
ECap3Regs.ECCTL2.bit.CAP_APWM = 1; // Enable APWM mode
ECap3Regs.ECCTL2.bit.APWMPOL=0;//1:输出为低电平有效 0:高电平
ECap3Regs.ECCTL2.bit.SYNCI_EN=1;//同步信号选择
ECap3Regs.CAP2 = 0x2EE; // Set Compare value50%处
ECap3Regs.ECCLR.all = 0x0FF; // Clear pending interrupts
ECap3Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;
ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1;
}
ECAP注意红色的地方设置时对的就没问题
不需要,你设置好影子模式就可以一直自己出了,可以参考controlsuite中的以下例程
C:\TI\controlSUITE\device_support\f2833x\v141\DSP2833x_examples_ccsv5\ecap_apwm