1108|3

4

帖子

0

资源

一粒金砂(中级)

关于TMS320F28035/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
}

 

 

 

实验现象:

3_2900_7U_7B00_U_5B00_K86VRFRWD1Q_7B00_B_2800_UD.png


回复

7116

帖子

0

资源

五彩晶圆(中级)

低于500hz一下信号时发生了报错,这是什么原因

可以把详细的出错告警说一下

点评

没有报错,我想应该是计数器溢出了,但是我不知道该怎么处理。就是如何能够明了知道是否溢出呢?  详情 回复 发表于 2022-11-15 16:33

回复

4

帖子

0

资源

一粒金砂(中级)

Jacktang 发表于 2022-11-12 09:01 低于500hz一下信号时发生了报错,这是什么原因 可以把详细的出错告警说一下

没有报错,我想应该是计数器溢出了,但是我不知道该怎么处理。就是如何能够明了知道是否溢出呢?


回复

11

帖子

0

资源

禁止访问

提示: 作者被禁止或删除 内容自动屏蔽

回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
    推荐帖子
    分享如何用430f149检测一个脉冲的长度?程序怎么实现?

    现在检测一个2秒的脉冲 但是不知道程序如何去实现,求帮助 1.打开系统时钟,打开定时器,假设用TimerA 2.配置一个捕获模式, ...

    为什么毫米波对5G网络至关重要?5G网络又是如何利用毫米波呢?

    第一个5G规范在去年年底被批准了,5GNR将通过利用新的频谱来带来超高速移动互联网。我们预计将在2019年上半年看到首批5 g手机, ...

    普中的51单片机开发板 曾送给需要的——“#闲置市集#

    本帖最后由 btty038 于 2019-10-15 16:36 编辑 “#闲置市集# 吃灰图【1】 438137吃灰图【2】 438138 这个有 ...

    分享MSP430串口接收控制LED

    /********************************************** *程序描述:单片机的P3.4、P3.5作为串口接收字符,将接受到的字符再发送出 ...

    【雅特力开发板 AT32F421 测评】6、再研究下EC11编码器

    上次是中断调成功的,但这次我用读电平也成功了。上次我觉得中断最好,但这次我觉得还是电平比较好点。因为毕竟不用中断。 这 ...

    隔离式降压转换器PCB 布局技巧

    同步降压转换器已作为隔离式偏置电源在通信及工业市场得到认可。隔离式降压转换器或者通常所谓的 Fly-Buck™ 转换器,采用 ...

    关闭
    站长推荐上一条 1/5 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表