工具/软件:Code Composer Studio
我使用带有 LaunchPad 28379d 的 eCAP1模块来测量脉冲波的占空比。
我的设置:CAP1检测上升沿并且 TSCTR 不计数为零
CAP2检测下降沿、CAP2检测下降沿、TSCTR 清零并进入中断读取值
如下图所示。黄色是 GPIO24的输入信号(10kHz)。 紫色是中断信号。 绿色是使用 DAC 功能进行观察的 TSCTR。
我的问题是 、TSCTR 为什么需要大约3.8us 才能设置为零????
=========================== ========================================================================================================
#include "F28x_Project.h"
//
//定义
//
//配置计时器的开始/结束周期
#define PWM3_TIMER_MIN 10.
#define PWM3_TIMER_MAX 8000
//跟踪计时器值的移动方式
#define ePWM_TIMER_UP 1.
#define ePWM_TIMER_DOWN 0
//
//全局
//
UINT32 ECap1IntCount;
uint32 ECap1通过计数;
uint32 EPwm3TimerDirection;
uint32 Ecap1ct1;
uint32 Ecap1ct2;
uint32 TSCTR;
//======================================== DCA=========================
#define reference_VREFHI 1.
#define reference_VREF 1
#define DACA 1.
#define DACB 2.
#define DACC 3.
#define reference reference_VREFHI
#define DAC_NUM DACA
volatile struct dac_regs* dac_ptr[4]={0x0、DacaRegs、DacbRegs、DaccRegs};
//======================================== DCA=========================
_interrupt void eCAP1_ISR (void);
void InitECapture (void);
空 InitEPwmTimer (空);
失效失效(失效);
void ConfigureGPIO (void);
//
//主函
//
void main (void)
{
InitSysCtrl();
InitEPwm3Gpio();
InitECap1Gpio(24);
GPIO_SetupPinOptions (24、GPIO_INPUT、GPIO_SYNC);
配置 DAC (DAC_NUM);
ConfigureDAC (DACB);
ConfigureGPIO();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.ECAP1_INT =&eCAP1_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
InitEPwmTimer();//对于本示例,只初始化 ePWM 计时器
InitECapture();
ECap1IntCount = 0;
ECap1PassCount = 0;
IER |= M_INT4;
PieCtrlRegs.PIEIER4.bit.INTx1 = 1;
EINT;//启用全局_中断 INTM
ERTM;//启用全局实时__interrupt DBGM
for (;;)
{
TSCTR=ECap1Regs.TSCTR;
DAC_PTR[DAC_NUM]->DACVALS.ALL =(TSCTR/20030.0)*4096;
DAC_PTR[DACB]->DACVALS.ALL =(TSCTR/20030.0)*4096;
}
}
空 InitEPwmTimer()
{
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//向上计数
EPwm3Regs.TBPRD = PWM3_TIMER_MIN;
EPwm3Regs.TBPHS.ALL = 0x00000000;
EPwm3Regs.AQCTLA.bit.PRD = AQ_TOGGLE;//打开 PRD
EPwm3Regs.TBCTL.bit.HSPCLKDIV=1;
EPwm3Regs.TBCTL.bit.CLKDIV = 0;
EPwm3TimerDirection = ePWM_TIMER_UP;
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;
}
空 InitECapture()
{
ECap1Regs.ECEINT.ALL = 0x0000;//禁用所有捕捉__interrupts
ECap1Regs.ECCLR.ALL = 0xFFFF;//清除所有 CAP _INTERRUPT 标志
ECap1Regs.ECCTL1.bit.CAPLDEN = 0;//禁用 CAP1-CAP4寄存器加载
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;//确保计数器被停止
ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1;//单次触发
ECap1Regs.ECCTL2.bit.STOP_Wrap = 1;//在2个事件时停止
ECap1Regs.ECCTL1.bit.CAP1POL = 0;// RisingEdge
ECap1Regs.ECCTL1.bit.CAP2POL = 1;//下降边沿
ECap1Regs.ECCTL1.bit.CTRRST1 = 0;//Abs
ECap1Regs.ECCTL1.bit.CTRRST2 = 1;//差动操作
ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;//直通
ECap1Regs.ECCTL1.bit.CAPLDEN = 1;//启用捕捉单元
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;//起始计数器
ECap1Regs.ECCTL2.bit.rearm = 1;// ARM 单次触发
ECap1Regs.ECCTL1.bit.CAPLDEN = 1;//启用 CAP1-CAP4寄存器加载
ECap1Regs.ECEINT.BIT.CEVT2 = 1;// 2事件=__interrupt
}
_interrupt void eCAP1_ISR (void)
{
GpioDataRegs.GPBSET.BIO32 = 1;
ECap1PassCount++;
Ecap1ct1=ECap1Regs.CAP1;
Ecap1ct2=ECap1Regs.CAP2;
ECap1Regs.ECCLR.bit.CEVT2 = 1;
ECap1Regs.ECCLR.bit.INT = 1;
ECap1Regs.ECCTL2.bit.rearm = 1;
GpioDataRegs.GPBCLEAR.bit.GPIO32=1;
PieCtrlRegs.PIEACX.ALL = PIEACK_group4;
}
空配置 DAC (uint16 DAC_num)
{
EALLOW;
DAC_PTR[DAC_num]->DACCTL.bit.DACREFSEL =参考;
DAC_PTR[DAC_num]->DACOUTEN 位.DACOUTEN = 1;
DAC_PTR[DAC_num]->DACCTL.bit.LOADMODE=0;
DAC_PTR[DAC_num]->DACVALS.ALL = 0;
DELAY_US (10);//缓冲 DAC 加电延迟
EDIS;
}
空配置 GPIO (空)
{
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;//启用 GPIO34上的上拉
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;// GPIO34 = GPIO34
GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1;// GPIO34 =输出
GpioDataRegs.GPBCLEAR.bit.GPIO32=1;// GPIO34=1
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;//启用 GPIO34上的上拉
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0;// GPIO34 = GPIO34
GpioCtrlRegs.GPADIR.bit.GPIO18 = 1;// GPIO34 =输出
GpioDataRegs.GPACLEAR.bit.GPIO18=1;// GPIO34=1
EDIS;
}

