欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

epwm_trip_zone项目调试记录

程序员文章站 2022-06-09 11:42:15
...

调试目的:

学习和体会EPWM-TZ模块的错误联防功能

例程功能:

简述:GPIO12[TZ1]->INPUT X-BAR->EPWM TZ->EPWM xA
通过外部GPIO引脚触发TZ1事件,从而控制EPWM对应管脚强制
拉高或拉低。

//!  \b External \b Connections \n
//!  - EPWM1A is on GPIO0
//!  - EPWM2A is on GPIO2
//!  - TZ1 is on GPIO12
//!
//! This example also makes use of the Input X-BAR. GPIO12 (the external
//! trigger) is routed to the input X_BAR, from which it is routed to TZ1.
//!
//! The TZ-Event is defined such that EPWM1A will undergo a One-Shot Trip
//! and EPWM2A will undergo a Cycle-By-Cycle Trip.
//!
              _____________             __________________
              |           |             |                |
  GPIO12 -----| I/P X-BAR |-----TZ1-----| ePWM TZ Module |-----TZ-Event
              |___________|             |________________|

这里以EPWM2为例:

void InitEPwm2Example()
{
    //
    // Enable TZ1 as one cycle-by-cycle trip sources
    //
    EALLOW;
    EPwm2Regs.TZSEL.bit.CBC1 = 1;

    //
    // Set TZA     Trip Zone Action  错误联防动作
    //
    EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;//当TZ事件触发时,强制将EPWMxA拉低

    //
    // Enable TZ interrupt
    //
    EPwm2Regs.TZEINT.bit.CBC = 1;
    EDIS;

    EPwm2Regs.TBPRD = 6000;                       // Set timer period
    EPwm2Regs.TBPHS.bit.TBPHS = 0x0000;           // Phase is 0
    EPwm2Regs.TBCTR = 0x0000;                     // Clear counter

    //
    // Setup TBCLK
    //
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//TB_COUNT_UPDOWN; // Count up
    EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4;       // Clock ratio to SYSCLKOUT
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV4;          // Slow just to observe on
                                                   // the scope.

    //
    // Setup compare
    //
    EPwm2Regs.CMPA.bit.CMPA = 6000+1;//3000;

    //
    // Set actions
    //
    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;             // Set PWM2A on CAU
    EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;
    //EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;           // Clear PWM2A on CAD
}

上述代码期望效果:

> EPWM2 A路占空比100%,相当于上拉了。当TZ1事件触发时,强制将A路
拉低。那么就会产生这样的效果:
	- TZ1事件触发时:EPWM2A 低电平
	- TZ1事件未触发时:EPWM2A 高电平 

调试结果:

TZ1事件触发时:
epwm_trip_zone项目调试记录
TZ1事件未触发时:
epwm_trip_zone项目调试记录

为什么是低电平触发TZ1呢?

因为TZ事件触发上面带了一个非号
epwm_trip_zone项目调试记录

那些路上偶遇的坑:
  1. GPIO如果配置为输入引脚时,如果悬空,此时的电平是不确定的,一般是0~3.3V之间的电压(通常就是中间值)。需要接GND或者接3.3V使其稳定。由于我第一次测试的时候没有将GPIO12接地,然后发现GPIO12一直0 1 0 1的进行电平跳动,导致epwm2_tzint_isr中断函数进个不停,之后将其接到3.3V,中断就不再进入了,说明TZ事件没有触发。
    【这里的3.3V视板子而定】
    对GPIO 浮空输入的理解
  1. 因为我用的板子是28379D的开发套件,这个套件是带有一个底板的。然后我把GPIO12接到底板上的3.3V管脚上,然后在CCS上查看GPIO12的电平状态,居然是0V;万用表测量之后,发现确实是0。后面也没找到什么原因,纠结了很久,无奈之下,我用另一个GPIO输出了一个3.3V电源,最后达到了预期效果。

调试总结:

TZ模块使用关键点:
  1. 触发源
  2. 触发动作
  3. 触发方式
1. 触发源:
epwm_trip_zone项目调试记录
假设触发源是TZ1,路线如下:
epwm_trip_zone项目调试记录
程序配置:
//
    // For External Trigger, GPIO12 as the trigger for TripZone   对于外部触发,GPIO12作为TZ的触发源
    //
    GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;//0;    // Enable pull-up on GPIO12 (TZ1)  使能GPIO12上拉

    GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 3;  // Asynch input GPIO12 (TZ1)

    EALLOW;
    InputXbarRegs.INPUT1SELECT = 12;
    EDIS;
2. 触发动作(详情查看该寄存器):
epwm_trip_zone项目调试记录
程序配置示例:
//
    // Set TZA     
    // 当触发TZ事件时,强制拉低EPWM2A
    EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;//
3. 触发方式:

TZ子模块可以工作在Cycle-by-Cycle、One-Shot两种模式下,这两种状态的区别是:
one-shot是永久起作用的,恢复它只有人工清除。
而Cycle-by-Cycle却是本周期有用,下一周期自动恢复
详情设置清查看该寄存器:
epwm_trip_zone项目调试记录

程序配置示例:

//
    // Enable TZ1 as one cycle-by-cycle trip sources
    //
    EALLOW;
    EPwm2Regs.TZSEL.bit.CBC1 = 1;
    EDIS;
相关标签: DSP