打印
[技术求助]

DSP28335的eCAP模块捕获脉冲问题

[复制链接]
1350|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
闵大|  楼主 | 2019-7-31 19:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 闵大 于 2019-7-31 19:39 编辑

    DSP28335的eCAP模块捕获脉冲问题            

       各位大佬,小弟想请教一个问题。DSP28335的eCAP模块捕获脉冲上升沿计数结果和脉冲本身幅值有关吗?      
       今天学习eCAP模块并烧写例程代码到开发板上,用函数信号发生器发出一路频率为10KHz,Vpp=1V占空比0.5的方波。通过watchwindow观测T1值,发现T1在2200上下波动。然后把方波幅值改为Vpp=3.0V时发现T1值接近15000。截图和源代码如下。
       T1=150MHz/10KHz。
                                           TMS320F28335工作频率=150MHz
                                           所测信号频率=10KHz
图一:Vpp=1V   图二:Vpp=3V   

图1(上图)

图2(上图)

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include"DSP2833x_Examples.h"   //DSP2833x Examples Include File


Uint16   *ExRamStart = (Uint16 *)0x100000;
Uint32t1=0,t2=0,t3=0,t4=0,T1=0,T2=0,t5,t6,t7,t8,T3,T4;
interrupt void ISRCap1(void);
interrupt void ISRCap2(void);

Uint16 i;


void main(void)
{
  InitSysCtrl();
  InitXintf16Gpio();     //zq
  DINT;
  InitPieCtrl();

// Disable CPU interrupts and clear all CPUinterrupt flags:
  IER = 0x0000;
  IFR = 0x0000;
  InitPieVectTable();

  EALLOW;  // This is needed towrite to EALLOW protected registers
  PieVectTable. ECAP1_INT = &ISRCap1;
  PieVectTable. ECAP2_INT = &ISRCap2;
  EDIS;    // This is needed todisable write to EALLOW protected registers

   InitCapl();

   IER |= M_INT4;

// Enable TINT0 in the PIE: Group 4interrupt1
   PieCtrlRegs.PIEIER4.bit.INTx1 = 1;
   PieCtrlRegs.PIEIER4.bit.INTx2 = 1;
// Enable global Interrupts and higherpriority real-time debug events:
   EINT;   // Enable Global interruptINTM
   ERTM;   // Enable Global realtimeinterrupt DBGM
       i= 0;
   for(; ;)
    {

    }

}


interrupt void ISRCap1(void)
{


   //Acknowledge this interrupt to receive more interrupts from group 1
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
   ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
       t1=ECap1Regs.CAP1;
       t2=ECap1Regs.CAP2;
       t3=ECap1Regs.CAP3;
      t4= ECap1Regs.CAP4;  
   T1=t2-t1;T2=t4-t3;


}
interrupt void ISRCap2(void)
{


   //Acknowledge this interrupt to receive more interrupts from group 1
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
   ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
       t5=ECap2Regs.CAP1;
       t6=ECap2Regs.CAP2;
       t7=ECap2Regs.CAP3;
      t8= ECap2Regs.CAP4;  
   T3=t6-t5;T4=t8-t7;


}

//===========================================================================
// No more.
//===========================================================================


//Cap.Init.c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"

void InitCapl(void)
{
   ChoseCap();
   InitECap1Gpio();
    InitECap2Gpio();
   SetCap1Mode();
   SetCap2Mode();
}

void ChoseCap(void)
{
   SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK=1;
   SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK=1;
}

void InitECap1Gpio()
{
   EALLOW;
   GpioCtrlRegs.GPAPUD.bit.GPIO24=0;
   GpioCtrlRegs.GPAQSEL2.bit.GPIO24=1;
   GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;
   EDIS;
}

void InitECap2Gpio()
{
   EALLOW;
   GpioCtrlRegs.GPAPUD.bit.GPIO25=0;
   GpioCtrlRegs.GPAQSEL2.bit.GPIO25=1;
   GpioCtrlRegs.GPAMUX2.bit.GPIO25=1;
   EDIS;
}

void SetCap1Mode(void)
{
   ECap1Regs.ECCTL1.bit.CAP1POL=0;//捕获沿选择。上升沿捕获
   ECap1Regs.ECCTL1.bit.CAP2POL=0;
   ECap1Regs.ECCTL1.bit.CAP3POL=0;
   ECap1Regs.ECCTL1.bit.CAP4POL=0;

   ECap1Regs.ECCTL1.bit.CTRRST1=0;//CAP1事件中重置计数器。0-在CAP1事件中不重置计数器
    ECap1Regs.ECCTL1.bit.CTRRST2=0;
   ECap1Regs.ECCTL1.bit.CTRRST3=0;
   ECap1Regs.ECCTL1.bit.CTRRST4=0;

   ECap1Regs.ECCTL1.bit.CAPLDEN=1;
   ECap1Regs.ECCTL1.bit.PRESCALE=0;//输入信号分频选择
   ECap1Regs.ECCTL2.bit.CAP_APWM=0;//模式选择。0-捕捉模式,1-APWM模式
   ECap1Regs.ECCTL2.bit.CONT_ONESHT=0;//1-单次模式,0-连续模式。
                                       //疑惑:为什么配置为连续模式而不是单次模式
   ECap1Regs.ECCTL2.bit.SYNCO_SEL=2;//同步输出选择。0-选择同步输入事件作为同步输出事件
                                     //10或11:屏蔽同步信号输出
                                      //疑惑:为什么屏蔽同步信号输出???
   ECap1Regs.ECCTL2.bit.SYNCI_EN=0; //计数器(TSCTR)同步输入选择模式
   ECap1Regs.ECEINT.all=0x0000;    //失能中断
   ECap1Regs.ECCLR.all=0xFFFF;     //清除中断标志位
   ECap1Regs.ECCTL2.bit.TSCTRSTOP=1;//启用计数器计数
   ECap1Regs.ECEINT.bit.CEVT4=1;   //???????????为什么只使能一路捕获事件4中断
}

void SetCap2Mode(void)
{
   ECap2Regs.ECCTL1.bit.CAP1POL=1;//下降沿捕获
   ECap2Regs.ECCTL1.bit.CAP2POL=1;
   ECap2Regs.ECCTL1.bit.CAP3POL=1;
   ECap2Regs.ECCTL1.bit.CAP4POL=1;

   ECap2Regs.ECCTL1.bit.CTRRST1=0;//0-在CAP1事件中不重置计数器
   ECap2Regs.ECCTL1.bit.CTRRST2=0;
   ECap2Regs.ECCTL1.bit.CTRRST3=0;
   ECap2Regs.ECCTL1.bit.CTRRST4=0;

   ECap2Regs.ECCTL1.bit.CAPLDEN=1;//使能在捕获事件中加载CAP1-4寄存器时间
   ECap2Regs.ECCTL1.bit.PRESCALE=0;//输入信号不分频
   ECap2Regs.ECCTL2.bit.CAP_APWM=0;//0-选择CAP模式
   ECap2Regs.ECCTL2.bit.CONT_ONESHT=0;//0-连续模式
   ECap2Regs.ECCTL2.bit.SYNCO_SEL=2;//屏蔽同步信号输出
   ECap2Regs.ECCTL2.bit.SYNCI_EN=0;//屏蔽同步输入操作
   ECap2Regs.ECEINT.all=0x0000;//失能所有CAP中断
   ECap2Regs.ECCLR.all=0xFFFF;//清除所有CAP中断标志
   ECap2Regs.ECCTL2.bit.TSCTRSTOP=1;//1-计数器计数
   ECap2Regs.ECEINT.bit.CEVT4=1;//1-捕获事件4中断使能
}







使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

23

帖子

0

粉丝