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.

[参考译文] CCS/TMS320F28377D:如何设置 GPIO 以发送跳闸信号以强制 PWM 处于低电平?

Guru**** 2608685 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/677014/ccs-tms320f28377d-how-to-set-a-gpio-to-send-a-trip-signal-to-force-pwm-low

器件型号:TMS320F28377D

工具/软件:Code Composer Studio

您好!

我想知道我是否可以使用 GPIO、例如 GPIO119向 ePWM 发送跳闸信号、并将其强制为低电平?  如果是、您能为我查看并更正以下代码吗? 我不会输出 PWM 信号、始终为低电平。

1.将 GPIO119分配给 Input1。

 EALLOW;
   InputXbarRegs.INPUT1SELECT = 119;
   GpioDataRegs.GPDDAT.bit.GPIO119 = 0;
 EDIS;

2.   在 ePWM2中初始化它
   EALLOW;
  EPwm2Regs.TZSEL.bit.OSHT1 = 1; //跳匣区域1 (TZ1)选择
   EPwm2Regs.TZEINT.BIT.OST=1;
   EPwm2Regs.TZCTL.bit.TZA = 2;   // EPWM2A 强制为低电平
   EPwm2Regs.TZCLR.bit.OST = 1;   //清除触发区标志
   EDIS;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    WAN、

    请允许我查看您在设计中使用的某些特定功能、并返回给您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请查看此示例、

    它应涵盖您所需的所有内容。 必须将 GPIO 编号更改为所需的编号。

    //######################################################################################################################
    //
    ////文件:ePWM_TRIP_Zone.c
    //
    //标题:使用跳闸区域子模块的 ePWM 模块。
    //
    //! addtogroup cpu01_example_list
    //! 

    ePWM 跳闸区域模块(ePWM_TRIP_ZONE)

    //! //! 此示例将 ePWM1和 ePWM2配置为以下 //! - ePWM1将 TZ1作为一次性触发源 //! - ePWM2将 TZ1作为逐周期触发源 //! //! 最初将 TZ1连接至高电平。 在测试期间、监控 ePWM1或 ePWM2 //! 示波器上的输出。 将 TZ1拉至低电平以查看效果。 //! //! b 外部连接\n //! - EPWM1A 位于 GPIO0 //! - EPWM2A 位于 GPIO2 上//! - TZ1位于 GPIO12 //! //! 此示例还使用输入 X-BAR。 GPIO12 (外部 //! 触发器)被路由到输入 X_bar、然后将其路由到 TZ1。 //! //! 定义 TZ-Event 时、EPWM1A 将经历一次性跳闸 //! EPWM2A 将经历逐周期跳闸。 //! // _________________ _________________________________ // | | | |// GPIO12 --- | I/P X-BAR |--- TZ1---- | ePWM TZ 模块|--- TZ 事件 // _________________ | _________________________________ |//// //////################################################################################################################## //$TI 发布:F2837xD 支持库 v3.01.00.00 $ //$发布 日期:星期一5月22日15:43:40 CDT 2017 $ //版权所有: //版权所有(C) 2013-2017 Texas Instruments Incorporated - http://www.ti.com/ // 只要 满足以下条件,就允许以源代码和二进制形式重新分发和使用//修改或不修改//: // //重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 //$ //######################################################################################################################## // //包含的文件 // #include "F28x_Project.h" // 定义 // #define EXTrig //使用外部触发器进行测试时保留未注释。 //使用 ePWM 触发器进行测试的注释。 // Globals // uint32 EPwm1TZIntCount; uint32 EPwm2TZIntCount; // 函数原型 // void InitEPwm1Example (void); void InitEPwm2Example (void); void InitTzGpio (void); __interrupt isr_wm1Example (void );void Initzwzepit_tzm2 interrupt (void);void Init_trupt_tzit_tzm2 inpio (void) void InitEPwmGpio_TZ (void); // 主 // void main (void) { // ///步骤1。 初始化系统控制: // PLL、看门狗、启用外设时钟 //此示例函数位于 F2837xD_sysctrl.c 文件中。 // InitSysCtrl(); // //步骤2。 初始化 GPIO: //此示例函数位于 F2837xD_GPIO.c 文件中, //说明了如何将 GPIO 设置为其默认状态。 // // InitGpio (); // //启用 PWM1和 PWM2 // EALLOW; CpuSysRegs.PCLKCR2.bit.EPWM1=1; CpuSysRegs.PCLKCR2.bit.EPWM2=1; EDIS; // //对于这种情况,只需初始化 ePWM1、ePWM2、ePWM3 //的 GPIO 引脚 InitEPwmGpio_TZ (); InitTzGpio(); //// 步骤3. 清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 // Dint; // //将 PIE 控制寄存器初始化为默认状态。 //默认状态是禁用所有 PIE 中断并 清除标志//。 //此函数位于 F2837xD_PIECTRL.c 文件中。 // InitPieCtrl(); // 禁用 CPU 中断并清除所有 CPU 中断标志: // IER = 0x0000; IFR = 0x0000; // //初始化 PIE 矢量表,其中包含指向 shell 中断 //服务例程(service routines,ISR)的指针。 //这将填充整个表,即使在 本示例中未使用中断//也是如此。 这对于调试很有用。 //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程 //此函数可在 F2837xD_PieVect.c 中找到 // InitPieVectTable(); // //此示例中使用的中断被重新映射到 这个文件中的// ISR 函数。 // EALLOW;//这是写入 EALLOW 受保护寄存器所必需的 PieVectTable.EPWM1_TZ_INT =&epwm1_tzint_ISR; PieVectTable.EPWM2_TZ_INT =&epwm2_tzint_ISR; EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需 的// //步骤4。 初始化设备外设: // EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0; EDIS; InitEPwm1Examples(); InitEPwm2Examples(); EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1; EDIS; //// 步骤5。 用户特定代码、启用中断: // EPwm1TZIntCount = 0; EPwm2TZIntCount = 0; // 启用连接到 EPWM1-3 INT 的 CPU INT2: // IER |= M_INT2; // //在 PIE 中启用 ePWM INTn:组3中断1-3 // PieCtrlRegs.PIEIER2.bit.INTx1 = 1; PieCtrlRegs.PIEIER2.bit.INTx2 = 1; // 启用全局中断和更高优先级的实时调试事件: // EINT;//启用全局中断 INTM ERTM;//启用全局实时中断 DBGM // //步骤6。 空闲循环。 只需坐下来循环(可选): // for (;;) { ASM (" NOP"); } } // // epwm1_tzint_ISR - EPWM1 TZ ISR // __interrupt void epwm1_tzint_ISR (void) { EPwm1TZIntCount++; // //要重新启用 OST 中断,请执行以下操作: // EALLOW; // EPwm1Regs.TZCLR.bit.OST = 1; // EPwm1Regs.TZCLR.bit.INT = 1; // EDIS; // // //确认此中断以接收来自组2的更多中断 // PieCtrlRegs.PIEACK.all = PIEACK_group2; } // epwm2_tzint_ISR - EPWM2 TZ ISR // _interrupt void epwm2_tzint_ISR (void) { GpioDataRegs.GPATOGGLE.bit.GPIO11=1; EPwm2TZIntCount++; // //清除标记-我们将继续执行 //此中断直到 TZ 引脚变为高电平 // EALLOW; EPwm2Regs.TZCLR.bit.CBC = 1; EPwm2Regs.TZCLR.bit.INT = 1; EDIS; // //确认此中断以接收来自组2的更多中断 // PieCtrlRegs.PIEACK.all = PIEACK_group2; } // InitEPwm1Example -初始化 EPWM1配置 // 空 InitEPwm1Examples() { // //启用 TZ1作为一次性跳闸源 // EALLOW; EPwm1Regs.TZSEL.bit.OSHT1 = 1; // //设置 TZA // EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HI; // //启用 TZ 中断 // EPwm1Regs.TZEINT.bit.OST = 1; EDIS; EPwm1Regs.TBPRD = 12000; //设置计时器周期 EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0 EPwm1Regs.TBCTR = 0x0000; //清除计数器 // //设置 TBCLK // EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载 EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4; //时钟与 SYSCLKOUT 的比率 EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4; EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每0加载一次寄存器 EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // //设置比较 // EPwm1Regs.CMPA.bit.CMPA = 6000; // //设置操作 // EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; //在 CAU 上设置 PWM1A EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; //清除 CAD 上的 PWM1A } // InitEPwm2Example -初始化 EPWM2配置 // 空 InitEPwm2Examples() { // //启用 TZ1作为一个逐周期触发源 // EALLOW; EPwm2Regs.TZSEL.bit.CBC1 = 1; // //设置 TZA // EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_HI; // //启用 TZ 中断 // EPwm2Regs.TZEINT.BIT.CBC = 1; EDIS; EPwm2Regs.TBPRD = 6000; //设置计时器周期 EPwm2Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0 EPwm2Regs.TBCTR = 0x0000; //清除计数器 // //设置 TBCLK // EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数 EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载 EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4; //时钟与 SYSCLKOUT 的比率 EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV4; //慢,只观察一下 //范围。 // //设置比较 // EPwm2Regs.CMPA.bit.CMPA = 3000; // //设置操作 // EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; //在 CAU 上设置 PWM2A EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR; //清除 CAD 上的 PWM2A } // InitTzGpio -初始化 TZ GPIO // void InitTzGpio (void) { // //对于外部触发器,GPIO12作为 TripZone 的触发器 // GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;//启用 GPIO12上的上拉电阻(TZ1) GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 3;//异步输入 GPIO12 (TZ1) EALLOW; InputXbarRegs.INPUT1SELECT = 12; EDIS; // //用于监视何时进入 TZ 中断 // EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO11 = 1;//禁用 GPIO0上的上拉电阻(EPWM1A) GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 0;//将 GPIO0配置为 EPWM1A GpioCtrlRegs.GPADIR.bit.GPIO11=1; EDIS; } // // InitEPwmGpio_TZ -初始化 EPWM1A 和 EPWM2A GPIO // 空 InitEPwmGpio_TZ (void) { EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;//禁用 GPIO0上的上拉电阻(EPWM1A) GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;//将 GPIO0配置为 EPWM1A GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;//禁用 GPIO2上的上拉电阻(EPWM2A) GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;//将 GPIO2配置为 EPWM2A EDIS; } //// 文件结束 //

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、Nima。

    它可以用于单次触发。 但是、当 GPIO 为低电平时、跳闸标志将自动清零。

    我希望一旦系统跳闸、跳闸就会停止、只能手动清除。 那么、是否有任何其他需要设置的寄存器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是 Tripzone 标志寄存器的快照。 无论何时触发跳闸、TZFLG 和 TZOSTFLG 都始终保持为零。 一旦跳闸、OST 位应写入1、对吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否向我展示您在中断例程中执行的操作?
    您是否还成功进入了中断例程?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    WAN、
    根据 TRM、
    "此外、当发生单次触发事件时、会设置单次触发事件标志(TZFLG [OST])并设置
    如果在 TZEINT 寄存器和 PIE 外设中启用了 ePWMx_TZINT 中断、则会生成 ePWMx_TZINT 中断。 A
    导致 OST 事件的事件的相应标志也在寄存器 TZOSTFLG 中设置。 。
    必须通过写入 TZCLR[OST]位手动清除单次触发条件。 如果需要、
    TZOSTFLG 寄存器位应通过手动写入中的相应位来清零
    TZOSTCLR 寄存器。"

    这些寄存器必须手动清零。 请查看您的代码、了解您可以使用 TZCLR 和 TZOSTCLR 清除标志的位置。