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事件触发时:
TZ1事件未触发时:
为什么是低电平触发TZ1呢?
因为TZ事件触发上面带了一个非号
那些路上偶遇的坑:
- GPIO如果配置为输入引脚时,如果悬空,此时的电平是不确定的,一般是0~3.3V之间的电压(通常就是中间值)。需要接GND或者接3.3V使其稳定。由于我第一次测试的时候没有将GPIO12接地,然后发现GPIO12一直0 1 0 1的进行电平跳动,导致epwm2_tzint_isr中断函数进个不停,之后将其接到3.3V,中断就不再进入了,说明TZ事件没有触发。
【这里的3.3V视板子而定】
对GPIO 浮空输入的理解
- 因为我用的板子是28379D的开发套件,这个套件是带有一个底板的。然后我把GPIO12接到底板上的3.3V管脚上,然后在CCS上查看GPIO12的电平状态,居然是0V;万用表测量之后,发现确实是0。后面也没找到什么原因,纠结了很久,无奈之下,我用另一个GPIO输出了一个3.3V电源,最后达到了预期效果。
调试总结:
TZ模块使用关键点:
- 触发源
- 触发动作
- 触发方式
1. 触发源:
假设触发源是TZ1,路线如下:
程序配置:
//
// 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. 触发动作(详情查看该寄存器):
程序配置示例:
//
// Set TZA
// 当触发TZ事件时,强制拉低EPWM2A
EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;//
3. 触发方式:
TZ子模块可以工作在Cycle-by-Cycle、One-Shot两种模式下,这两种状态的区别是:
one-shot是永久起作用的,恢复它只有人工清除。
而Cycle-by-Cycle却是本周期有用,下一周期自动恢复
详情设置清查看该寄存器:
程序配置示例:
//
// Enable TZ1 as one cycle-by-cycle trip sources
//
EALLOW;
EPwm2Regs.TZSEL.bit.CBC1 = 1;
EDIS;