问题如下:
使用PWM1和PWM5各产生19.2KHz(52us)的中断(计数过零触发, 其他寄存器配置如下),并在中断中执行相关的算法。
当我在这两个中断中各对一个GPIO翻转来测试中断周期是否正确时,发现这两个中断的周期为一个随机变化的值(大约在50us~53us之间跳动),测试它们输出的PWM波是稳定的,duty改变符合要求。
我的程式中运行uCOS操作系统,当我把操作系统屏蔽,只跑中断程序时(main函数执行while),PWM中断周期又是稳定的52us。
我修改程式,只跑一个任务,任务不做任何事情,情况没有得到改善。
通过JTAG仿真,查看有OS和无OS时程序执行情况,观察PWM各个寄存器没有差异。
我又测试了两个中断中算法最长路径执行的时间:PWM1为11us左右,PWM5为12us左右, OS任务调度时间为5us左右,总共11+12+5=28us<52us, 中断时间有较大余量。
以上是我遇到的问题描述和处理过程,目前还没有头绪,请问大家之前是否遇到类似情况?非常感谢!
PWM配置如下(PWM1和PWM5中断使能,其他组PWM配置一致,但不使能中断):
// EPwm1Regs.TBPRD = 2083; //Set timer period: 80MHz*20.83us@19.2K
// EPwm1Regs.TBPHS.half.TBPHS = 0x00; //相位偏移0us
// EPwm1Regs.TBCTR = 0x00; //PWM计数器清零
// EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //计数模式:上升+下降
// EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁止相位偏移加载控制
// EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP; //同步后向上计数
// EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; //周期值在过零时从缓冲区加载
// EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; //不输出同步信号
// EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //计数时钟=系统时钟
// EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; //计数时钟=系统时钟
// EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; //双缓冲模式
// EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; //双缓冲模式
// EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD; //周期值时加载比较值
// EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD; //周期值时加载比较值
// EPwm1Regs.CMPA.half.CMPA = 1; //duty setting
// EPwm1Regs.CMPB = 1; //比较值B清零
// EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; //向上计数比较匹配清零
// EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; //向下计数比较配置置位
// EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; //向上计数比较匹配清零
// EPwm1Regs.AQCTLB.bit.CBD = AQ_SET; //向下计数比较配置置位
// EPwm1Regs.AQCSFRC.all |= 0x0005; //禁止PWM输出
// EPwm1Regs.DBCTL.bit.OUT_MODE = DB_DISABLE; //PWM输出模式0:两路独立输出,disable deadtime
// EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //Enable event TBCTR = 0
// EPwm1Regs.ETSEL.bit.INTEN = 1; //Enable EPWM1 INT generation
// EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; //1 event