因为EPWM的个数不够 用了eCAP产生PWM 但是在运行的时候发现存在丢失的问题 如图所示
而且很奇怪的是 因为我还用EPWM产生PWM
如果我对EPWM不进行移相操作(就是固定不变输出) 那么eCAP产生的PWM就没有问题
如果我对EPWM进行移相操作(闭环 实时控制移相角调节的) 那么eCAP产生的PWM就出现丢失问题
但是自始至终 我对APWM都没有进行任何移相等操作 我就想它固定输出就行了

APWM部分的程序如下:
int main(void) {
/******第一步:初始化系统控制:PLL,看门狗,使能外设时钟******/
InitSysCtrl();
/******第二步:初始化GPIO,见文件DSP2833x_Gpio.c******/
InitGpio();//将全部GPIO设置为输入、上拉、系统时钟同步
InitEPwmGpio();//启用全部PWM引脚
InitTzGpio();//使能epwm错误输入引脚 低电平有效
ConfigGpio(); //GPIO初始化BY纪婧
/******第三步:清除所有中断并初始化PIE向量表******/
//关闭CPU中断
DINT;
//初始化PIE控制寄存器为默认状态,默认状态为所有PIE中断关闭及所有中断标志清零
InitPieCtrl();
//关闭CPU中断并清除CPU中断标志位
IER = 0x0000;
IFR = 0x0000;
//初始化PIE向量表,中断服务程序(ISR)指针指向Shell默认处理程序,ISR默认程序
InitPieVectTable();
//重映射ISR
EALLOW; // 允许修改被EALLOW保护的寄存器
PieVectTable.EPWM1_INT = &ISREPwm_Zero; //EPwm1的计数器下溢中断\
//epwm错误中断寄存器置位后跳到封锁的程序中
PieVectTable.EPWM1_TZINT = &epwm_tzint_isr;
PieVectTable.EPWM2_TZINT = &epwm_tzint_isr;
PieVectTable.EPWM3_TZINT = &epwm_tzint_isr;
PieVectTable.EPWM4_TZINT = &epwm_tzint_isr;
PieVectTable.EPWM5_TZINT = &epwm_tzint_isr;
PieVectTable.EPWM6_TZINT = &epwm_tzint_isr;
EDIS; // 关闭EALLOW保护寄存器修改许可
/******第四步:初始化器件外设等******/
/****第五步:用户定义代码,配置外设功能等,使能中断*****/
EnableInterruptsABC(); //EPWM1 int3.1中断 // timer0 Interrupt:Int1.7 //SCIRXINTA Interrupt:Int9.1
InitAdc(); //初始化ADC
ConfigAdc();
//SCI CAN通信初始化
USARTA_Init(); // Initalize SCIA
InitECan();
SetupECAN(); //0号邮箱为发送邮箱 1 2 位接收邮箱
/****************用户定义代码段****************/
/***********第六步:使能CpuTimer中断等*********/
Setup_PID();
for(;;)
{
ECap1Regs.CAP3 = EPWM_PERIOD; // Set Period value按照150M计算的
ECap1Regs.CAP4 = 0; // Set Compare value50%处
ECap3Regs.CAP3 = EPWM_PERIOD; // Set Period value按照150M计算的
ECap3Regs.CAP4 = EPWM_PERIOD_half-EPWM_A_DB; // Set Compare value50%处
ECap4Regs.CAP1 = EPWM_PERIOD; // Set Period value按照150M计算的
ECap4Regs.CAP3 = EPWM_PERIOD;
ECap4Regs.CAP4 = EPWM_PERIOD_half+EPWM_A_DB; // Set Compare value50%处
ECap5Regs.CAP1 = EPWM_PERIOD; // Set Period value按照150M计算的
ECap5Regs.CAP3 = EPWM_PERIOD;
ECap5Regs.CAP4 = EPWM_PERIOD_half+EPWM_A_DB; // Set Compare value50%处
ECap6Regs.CAP3 = EPWM_PERIOD; // Set Period value按照150M计算的
ECap6Regs.CAP4 = EPWM_PERIOD_half-EPWM_A_DB; // Set Compare value50%处
}
void SetupAPwmA1A2A3A4(void)
{
ECap1Regs.CAP1 = EPWM_PERIOD; // Set Period value按照150M计算的
ECap1Regs.CTRPHS=0; //相位控制寄存器
ECap1Regs.ECCTL2.bit.CAP_APWM = 1; // Enable APWM mode
ECap1Regs.ECCTL2.bit.APWMPOL=0;//1:输出为低电平有效 0:高电平
ECap1Regs.ECCTL2.bit.SYNCI_EN=1;//同步信号选择
ECap1Regs.CAP2 = 0; // 让CAP1输出恒低电平
ECap1Regs.ECCLR.all = 0x0FF; // Clear pending interrupts
ECap1Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int
//A1
ECap3Regs.CAP1 = EPWM_PERIOD; // Set Period value按照150M计算的
ECap3Regs.CTRPHS=0; //相位控制寄存器
ECap3Regs.ECCTL2.bit.CAP_APWM = 1; // Enable APWM mode
ECap3Regs.ECCTL2.bit.APWMPOL=0;//1:输出为低电平有效 0:高电平
ECap3Regs.ECCTL2.bit.SYNCI_EN=1;//同步信号选择
ECap3Regs.CAP2 = EPWM_PERIOD_half-EPWM_A_DB; // Set Compare value50%处
ECap3Regs.ECCLR.all = 0x0FF; // Clear pending interrupts
ECap3Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int
//A2
ECap4Regs.CAP1 = EPWM_PERIOD; // Set Period value按照150M计算的
ECap4Regs.CTRPHS=EPWM_A_DB; //相位控制寄存器
ECap4Regs.ECCTL2.bit.CAP_APWM = 1; // Enable APWM mode
ECap4Regs.ECCTL2.bit.APWMPOL=1;//1:输出为低电平有效 0:高电平
ECap4Regs.ECCTL2.bit.SYNCI_EN=1;//同步信号选择
ECap4Regs.CAP2 = EPWM_PERIOD_half+EPWM_A_DB; // Set Compare value50%处
ECap4Regs.ECCLR.all = 0x0FF; // Clear pending interrupts
ECap4Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int
//A3
ECap5Regs.CAP1 = EPWM_PERIOD; // Set Period value按照150M计算的
ECap5Regs.CTRPHS=EPWM_A_DB; //相位控制寄存器
ECap5Regs.ECCTL2.bit.CAP_APWM = 1; // Enable APWM mode
ECap5Regs.ECCTL2.bit.APWMPOL=1;//1:输出为低电平有效 0:高电平
ECap5Regs.ECCTL2.bit.SYNCI_EN=1;//同步信号选择
ECap5Regs.CAP2 = EPWM_PERIOD_half+EPWM_A_DB; // Set Compare value50%处
ECap5Regs.ECCLR.all = 0x0FF; // Clear pending interrupts
ECap5Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int
//A4
ECap6Regs.CAP1 = EPWM_PERIOD; // Set Period value按照150M计算的
ECap6Regs.CTRPHS=0; //相位控制寄存器
ECap6Regs.ECCTL2.bit.CAP_APWM = 1; // Enable APWM mode
ECap6Regs.ECCTL2.bit.APWMPOL=0;//1:输出为低电平有效 0:高电平
ECap6Regs.ECCTL2.bit.SYNCI_EN=1;//同步信号选择
ECap6Regs.CAP2 = EPWM_PERIOD_half-EPWM_A_DB; // Set Compare value50%处
ECap6Regs.ECCLR.all = 0x0FF; // Clear pending interrupts
ECap6Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;
ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1;
ECap4Regs.ECCTL2.bit.TSCTRSTOP = 1;
ECap5Regs.ECCTL2.bit.TSCTRSTOP = 1;
ECap6Regs.ECCTL2.bit.TSCTRSTOP = 1;
}
mangui zhang:
肯定是移相造成的代码问题 没看出来具体哪个设置不合理
TI中文支持网



