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
尊敬的先生/女士:
我想使用 ECAP 功能从 ePWM 捕获 PWM 信号。 我已从 EPWM1A 生成1kHz 信号、并从引脚24提供给 ECAP1。 但捕获寄存器始终为空。 ISR 未执行。 请 在这方面帮助我。 请查找随附的代码。
//###################################################################################################################### // ////文件:example_2833xECap_Capture_PWM.c // //标题:ECAP 捕获 PWM 示例 // ! \addtogroup F2833x_example_list //!ECAP 捕获 PWM (ECAP_CAPTURE_PWM)
//! //! 此示例将 ePWM3A 配置为: //! -向上计数 //! -周期从2开始,最高1000 //! -在 PRD 上切换输出 //! //! eCAP1被配置为捕捉上升 //!之间的时间 和 ePWM3A 输出的下降沿。 //! //! b 外部连接\n //! - eCAP1位于 GPIO24 //! - ePWM3A 在 GPIO4上 //! -将 GPIO4连接到 GPIO24。 //! //! b 监视\b 变量\n //! - ECap1IntCount -成功捕捉 //! - ECap1PassCount - Interrupt Counts // //###################################################################################################### //$TI 发布:F2833x 支持库 v2.00.00.00 $ //$发布 日期:截至2018年10月18日15:47:35 CDT 2018 $ //版权: //版权所有(C) 2009-2018 Texas Instruments Incorporated - http://www.ti.com/ // 只要 满足以下条件,就允许以源代码和二进制形式重新分发和使用//修改或不修改//: // //重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 //$ //######################################################################################################################## // //包含的文件 // #include "DSP28x_Project.h" //器件头文件和示例包括文件 UINT32 PWM_PERIOD; UINT32 PWM_Duty; // 定义以配置计时器的开始/结束周期 // void gpiosetup (void); void initepwm (void); void INTECAP (void); // 函数原型 // _interrupt eisr (void)// main/void) InitSysCtrl(); Dint; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); gpiosetup(); initepwm(); INTECAP(); EALLOW; //写入 EALLOW 受保护的寄存器需要此操作 PieVectTable.ECAP1_INT =&eCAP1_ISR; EDIS; //这是禁止写入 EALLOW 受保护寄存器所必需的 IER |= M_INT4; PieCtrlRegs.PIEIER4.bit.INTx1 = 1; EINT; //启用全局中断 INTM ERTM; //启用全局实时中断 DBGM for (;;) { _asm (" NOP"); } } // // InitEPwmTimer - // void gpioetup (void){ EALLOW; GpioCtrlRegs.GPADIR.bit.GPIO0=1; GpioCtrlRegs.GPAMUX1.bit.GPIO0=1; GpioCtrlRegs.GPAPUD.bit.GPIO0=0; GpioCtrlRegs.GPADIR.bit.GPIO24=0; GpioCtrlRegs.GPAMUX2.bit.GPIO24=1; GpioCtrlRegs.GPAPUD.bit.GPIO24=1; EDIS; } void initepwm (void){ EPwm1Regs.TBCTL.bit.CTRMODE = 2;//向上计数递减 EPwm1Regs.TBPRD = 37500; //设置计时器周期 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载 EPwm1Regs.TBPHS.Half.TBPHS = 0x0000; //相位为0 EPwm1Regs.TBCTR = 0x0000; //清除计数器 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 001;//时钟与 SYSCLKOUT 之比 EPwm1Regs.TBCTL.bit.CLKDIV = 000; EPwm1Regs.TBCTL.bit.SYNCOSEL=1; EPwm1Regs.CMPA.half.CMPA =18750;//设置比较值 EPwm1Regs.CMPB = 18750; //设置比较 B 值 EPwm1Regs.DBCTL.bit.out_mode=3; EPwm1Regs.DBCTL.bit.POLSEL=2; EPwm1Regs.DBCTL.bit.in_mode=0; EPwm1Regs.DBRED=200; EPwm1Regs.DBFED=200; EPwm1Regs.AQCTLA.bit.CAU=2;//将 PWM1A 设置为零 EPwm1Regs.AQCTLA.bit.CAD=1; EPwm1Regs.AQCTLB.bit.CBU=2; EPwm1Regs.AQCTLB.bit.CBD = 1; } void INTECAP (void){ ECap1Regs.ECEINT.ALL = 0x0000; //禁用所有捕捉中断 ECap1Regs.ECCLR.ALL = 0xFFFF; //清除所有 CAP 中断标志 ECap1Regs.ECCTL1.bit.CAPLDEN = 0; //禁用 CAP1-CAP4寄存器加载 ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; //确保计数器已停止 ECap1Regs.ECCTL2.bit.CONT_ONESHT=0; ECap1Regs.ECCTL2.bit.STOP_WOP=3; ECap1Regs.ECCTL2.bit.rearm=0; ECap1Regs.ECCTL2.bit.TSCTRSTOP=1; ECap1Regs.ECCTL2.bit.SYNCI_EN=0; ECap1Regs.ECCTL2.bit.CAP_APWM_0; ECap1Regs.ECCTL2.bit.SYNCO_SEL=1; ECap1Regs.ECCTL1.bit.FREE_SOFT=0; ECap1Regs.ECCTL1.bit.prescale=0; ECap1Regs.ECCTL1.bit.CAPLDEN=1; ECap1Regs.ECCTL1.bit.CAP1POL=1; ECap1Regs.ECCTL1.bit.CAP2POL=0; ECap1Regs.ECCTL1.bit.CAP3POL=1; ECap1Regs.ECCTL1.bit.CAP4POL=0; ECap1Regs.ECCTL1.bit.CTRST4=1; ECap1Regs.ECEINT.BIT.CEVT3=1; } __interrupt void eCAP1_ISR (void) { ECap1Regs.ECCLR.bit.INT=1; ECap1Regs.ECCLR.bit.CEVT3=1; PWM_Duty =(Int32) ECap1Regs.CAP2 -(Int32) ECap1Regs.CAP1; PWM_PERIOD =(Int32) ECap1Regs.CAP3 -(Int32) ECap1Regs.CAP1; // //确认此中断以接收来自组4的更多中断 // PieCtrlRegs.PIEACX.ALL = PIEACK_group4; }
我看不到您的代码有什么问题。 您能否使用示波器确认 PWM 信号是否输出到引脚、以及您的 GPIO 0和24之间的连接是否正常。
您如何检查是否进入 ISR? 使用断点?
惠特尼