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.

TMS320F28335: TMS320F28035/TMS320F28335无法捕获低频信号相关问题

Part Number: TMS320F28335


  各位好,我在使用28335/28035捕获低于500hz一下信号时发生了报错,我不知道具体的原因时什么,因为在捕获500hz-500khz中都可以稳定的捕获到。我查阅了相关书籍和数据手册,考虑到是否为计数器没有及时复位清零的原因,但是在配置完相关寄存器后并无任何改变,后删去了相关配置代码,本实验是基于28335的例程进行修改过后得到的,希望各位朋友可以多多赐教。以下为出错现象及代码

代码:


#include "DSP28x_Project.h"
#include "cap.h"
#define FLASH_RUN 1
#define SRAM_RUN 2
#define RUN_TYPE FLASH_RUN
#if RUN_TYPE==FLASH_RUN
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
#endif
Uint32 t1=0,t2=0,t3=0,t4=0,T1=0,T2=0,t5,t6,t7,t8,T3,T4;
float f;
Uint16 i;
interrupt void ISRCap1(void);
interrupt void ISRCap2(void);
void delay_1ms(Uint16 t);

void main(void)
{
/*第一步:初始化系统控制:*/
InitSysCtrl();

/*第二步:初始化GPIO口*/
InitGpio();

/* 第三步:清除所有中断 和初始化 PIE 向量表:*/
DINT;// 关闭全局中断
InitPieCtrl();// 初始化 PIE 控制寄存器到默认状态,默认状态是全部 PIE 中断被禁用和标志位被清除
IER = 0x0000;// 禁用 CPU 中断和清除所有 CPU 中断标志位:
IFR = 0x0000;
InitPieVectTable();// 初始化 PIE 中断向量表

// 中断重映射,注册中断程序入口(用户按需求添加)
EALLOW;
PieVectTable. ECAP1_INT = &ISRCap1; // 将CAP1中断添加都中断向量表里
PieVectTable. ECAP2_INT = &ISRCap2; // 将CAP2中断添加都中断向量表里
EDIS;
//

/*程序烧录入28335(可选的)*/
#if RUN_TYPE==FLASH_RUN
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);
InitFlash();
#endif
/* 第四步: 初始化片上外设*/
// InitPeripherals(); //初始化所有外设(本例程不需要)
InitCapl();
IER |= M_INT4; //使能第一组中断
PieCtrlRegs.PIEIER4.bit.INTx1 = 1; //使能第四组中断里的第一个中断--CAP1中断
PieCtrlRegs.PIEIER4.bit.INTx2 = 1; //使能第四组中断里的第二个中断--CAP2中断

/* 第五步:添加用户功能具体代码*/
EINT;
ERTM;
i = 0; // i = 0
for(;;)
{

}
}


void delay_1ms(Uint16 t)
{
while(t--)
{
DELAY_US(1000);
}
}

interrupt void ISRCap1(void)
{

PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;//0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
ECap1Regs.ECCLR.all=0xFFFF;//写0XFFFF对CAP1中断清除寄存器进行清除操作
t1= ECap1Regs.CAP1; //赋值
t2= ECap1Regs.CAP2; //赋值
t3= ECap1Regs.CAP3; //赋值
t4= ECap1Regs.CAP4; //赋值
T1=t2-t1;T2=t4-t3;
f = 1/(float)(T1)*150000000;

}
interrupt void ISRCap2(void)
{

PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;//0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
ECap2Regs.ECCLR.all=0xFFFF;//写0XFFFF对CAP2中断清除寄存器进行清除操作
t5= ECap2Regs.CAP1; //赋值
t6= ECap2Regs.CAP2; //赋值
t7= ECap2Regs.CAP3; //赋值
t8= ECap2Regs.CAP4; //赋值
T3=t6-t5;T4=t8-t7;


}

ap.c:

#include "bsp_cap.h"
#if DSP28_28335
// ECCTL1 ( ECAP Control Reg 1)
//==========================
// CAPxPOL bits
#define EC_RISING 0x0
#define EC_FALLING 0x1
// CTRRSTx bits
#define EC_ABS_MODE 0x0
#define EC_DELTA_MODE 0x1
// PRESCALE bits
#define EC_BYPASS 0x0
#define EC_DIV1 0x0
#define EC_DIV2 0x1
#define EC_DIV4 0x2
#define EC_DIV6 0x3
#define EC_DIV8 0x4
#define EC_DIV10 0x5
// ECCTL2 ( ECAP Control Reg 2)
//==========================
// CONT/ONESHOT bit
#define EC_CONTINUOUS 0x0
#define EC_ONESHOT 0x1
// STOPVALUE bit
#define EC_EVENT1 0x0
#define EC_EVENT2 0x1
#define EC_EVENT3 0x2
#define EC_EVENT4 0x3
// RE-ARM bit
#define EC_ARM 0x1
// TSCTRSTOP bit
#define EC_FREEZE 0x0
#define EC_RUN 0x1
// SYNCO_SEL bit
#define EC_SYNCIN 0x0
#define EC_CTR_PRD 0x1
#define EC_SYNCO_DIS 0x2
// CAP/APWM mode bit
#define EC_CAP_MODE 0x0
#define EC_APWM_MODE 0x1
// APWMPOL bit
#define EC_ACTV_HI 0x0
#define EC_ACTV_LO 0x1
// Generic
#define EC_DISABLE 0x0
#define EC_ENABLE 0x1
#define EC_FORCE 0x1
#endif // end DSP28_28335
void InitCapl(void)
{
ChoseCap(); // 给CAP分配时钟
InitECap1Gpio(); // 初始化CA1的GPIO
InitECap2Gpio(); // 初始化CA2的GPIO
SetCap1Mode();
SetCap2Mode();
}
void ChoseCap(void)
{
SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK=1;//enable clock to Cap1
SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK=1;
//SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK=1;
//SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK=1;
//SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK=1;
//SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK=1;
}
void SetCap1Mode(void)
{
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP2POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST3 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECEINT.all=0x0000;//stop all interrupt
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
ECap1Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}


void SetCap2Mode(void)
{
ECap2Regs.ECCTL1.bit.CAP1POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP3POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CTRRST3 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap2Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap2Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap2Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap2Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap2Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap2Regs.ECEINT.all=0x0000;//stop all interrupt
ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
ECap2Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
ECap2Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

实验现象:

  • 你好,感谢您对TI产品的关注,我将咨询更了解这款芯片的TI资深工程师,一旦 有回复会立即回复给您。

  • 你好,可以具体解释一下问题在哪吗?

  • 你好,通过查看 ISR 代码,您似乎没有使用 eCAP2。即使对于 eCAP1,也仅使用两个 CEVT1和 CEVT2。

    您的预期值是多少吗?它是否仅在低频时不起作用?它停止工作的频率是多少?

  • 您好,很抱歉这么晚回您的消息,也感谢您对我问题给予回复,具体问题就是我捕获0-500hz之间的频率无法保证数据稳定准确,越接近0hz越无法捕获到相应的数值。我只开了一个捕获窗口,用了两个时间戳寄存器,预期的值是可以捕获到50hz的频率,我有考虑是否为计数器溢出而导致的,但是我查阅数据手册只发现有停止和开始的寄存器TSCTRSTOP和TSCTR无法在捕获第二个事件进入中断将其复位为0,我在考虑通过if语句判断计数器是否溢出,无溢出则输出正常捕获值,溢出则通过相关算法来计算,目前还没有实行,不知道结果。

  • 你好,我只是想确保我是否正确理解了问题。 如果信号太慢、0Hz 至500Hz、eCAP 将不工作。 在500 Hz 以上、捕获工作正常。 我的理解是否正确? 

  • 您好,ecap应该是在0-500hz能够正常工作的,但是应该我无法解决其计数器溢出的问题。

  • 你好,当信号为0-500Hz 或 CAP1/4计数器值无效时、您是否没有获得 eCAP ISR?

    我刚刚使用350Hz ePWM 信号在我的设置上进行了测试。 它能够捕获事件。