100
时 间 记 忆
100
最 新 评 论
100
专 题 分 类
100
最 新 日 志
100
最 新 留 言
100
搜 索
用 户 登 录
100
友 情 连 接
博 客 信 息
100


 
DSP28335入门(七)eCAP
[ 2022/1/21 23:31:00 | By: 欧高技术 ]
 
/*F28335的脉冲捕获模块–eCAP,通过捕获脉冲的上升沿与下降沿,来计算脉冲的宽度、占空比、频率。
F28335一共有6组eCAP模块,每个eCAP不止具有输入捕获功能,还具有PWM输出。
在150Mhz下,32位时基的时间分辨率为6.67ns
4组32位的时间标志寄存器,4组捕获时间序列,均可以产生中断。
软件配置一次捕获可以获取4个捕获时间。

在不用做CAP功能时,可配置成一个单通道输出的PWM,称作APWM。
CAP1、CAP2寄存器作为主要的周期和比较寄存器,CAP3、CAP4寄存器作为周期和比较寄存器的影子寄存器。
//-----------------------------------------------------------------------------------------------

先看看eCAP的寄存器:

TSCTR:时间标志寄存器,捕捉事件的时间标志
CTRPHS:计数相位控制寄存器,
CAP1:捕获寄存器1,在CAP模式中,加载捕获事件中的时间标志(TSCTR的值);在APWM下起到APRD作用,周期寄存器;
CAP2:捕获寄存器2,在CAP模式中,加载捕获事件中的时间标志(TSCTR的值);在APWM模式下起到ACMP的作用,比较寄存器;
CAP3:捕获寄存器3,在CAP模式中,加载捕获事件中的时间标志(TSCTR的值);在APWM下起到APRD的影子寄存器作用;
CAP4:捕获寄存器4,在CAP模式中,加载捕获事件中的时间标志(TSCTR的值);在APWM下起到ACMP的影子寄存器作用;
ECCTL1:eCAP控制寄存器1,主要控制输入信号分频系数(1-62分频)、CAPx的重置计数器,捕获极性(上升/下降)选择x=1,2,3,4
ECCTL2:eCAP控制寄存器2,主要控制在APWM下的输出极性、CAP与APWM模式选择、计数器的设置以及选择连续/单次模式。
ECEINT:eCAP中断使能寄存器。
ECFLG:eCAP的中断标志寄存器。
ECCLR:中断清除寄存器
ECFRC:强制中断寄存器

按照下列设置,当检测到脉冲第一个上升沿时,将TSCTR的值传递给CAP1,第一个下降沿,将TSCTR的值传递给CAP2,
第二个上升沿时,将TSCTR的值传递给CAP3,第二个下降沿时,将TSCTR的值传递给CAP4,并触发中断。
在中断结束后,清除TSCTR的数据,继续1->2->3->4->1的循环。

由于TSCTR计数是在系统主频下,进行计数;
可以得知,两个CAPx之间的差值*(1/SYSCLK)= 两次捕获的间隔时间;

*/


下面eCap脉冲捕获模块来计算周期波形(正玄,交替方波,三角波)频率

main()
{
PieVectTable.ECAP1_INT = &Ecap_isr; // Ecap总线中断向量表初始化;

EALLOW; SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 0; EDIS;

EALLOW; SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1; EDIS;

IER |= M_INT4; //ECAP中断表4

PieCtrlRegs.PIEIER4.bit.INTx1 = 1; // Enable ECAP1_INT

Capture_init(); //捕获初始化
}

//##################################################################################//
// 函数名:interrupt void Ecap_isr(void)
//
// 关键变量说明:
//
// 函数功能说明:
// 1. 脉冲捕获模块,用于采集电网频率
//##################################################################################//
// $ Release Date: 2015 Update 2020.11 $
//##################################################################################//
/*
__interrupt void Ecap_isr(void)
{
unsigned int cap_temp;
unsigned long int cap_temp1=0;

EALLOW;
GpioDataRegs.GPATOGGLE.bit.GPIO83 = 1;
EDIS;

cap_temp1=ECap1Regs.CAP1;

// EALLOW;
// GpioDataRegs.GPATOGGLE.bit.GPIO21 = 1;
// EDIS;

    cap_temp=cap_temp1>>9;
if((cap_temp>0x14ec) && (cap_temp<0x196e))
{
g_calculate_reg.CaptureSum=g_calculate_reg.CaptureSum-g_calculate_reg.CaptureReg[g_calculate_reg.CaptureCounter];
g_calculate_reg.CaptureSum=g_calculate_reg.CaptureSum+cap_temp;
g_calculate_reg.CaptureReg[g_calculate_reg.CaptureCounter]=cap_temp;
g_calculate_reg.CaptureCounter++;
g_calculate_reg.CaptureCounter=g_calculate_reg.CaptureCounter&0x0f;

    cap_temp=g_calculate_reg.CaptureSum>>4;

g_sample_reg.ff=(float)cap_temp;
g_sample_reg.ff=2929687.5/g_sample_reg.ff;  //150mHZ/512*10=2929687.5,送给显示时要求保留一位小数

cap_temp = cap_temp>>1; //PWM时钟系数2的1次

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;

EPwm2Regs.ETSEL.bit.SOCAEN = 1;         // Enable SOC on A group,75MHz时钟
EPwm2Regs.ETSEL.bit.SOCASEL = 1;        // Select SOC from from
EPwm2Regs.ETPS.bit.SOCAPRD = 1;         // Generate pulse on 1st event

EPwm2Regs.TBPRD = cap_temp;
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;

g_sample_reg.sample_counter = 0;
}
else
{
    ;
}

ECap1Regs.ECCLR.bit.CEVT1 = 1; //
    ECap1Regs.ECCLR.bit.INT = 1; //
    ECap1Regs.ECCTL2.bit.REARM = 1;   //
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; //
}
*/

// TI File $Revision: /main/2 $
// Checkin $Date: March 15, 2007   16:54:36 $
//###########################################################################
//
// FILE:   DSP2833x_ECap.c
//
// TITLE:  DSP2833x eCAP Initialization & Support Functions.
//
//###########################################################################
// $TI Release: DSP2833x Header Files V1.01 $
// $Release Date: September 26, 2007 $
//###########################################################################

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

//---------------------------------------------------------------------------
// InitECap:
//---------------------------------------------------------------------------
// This function initializes the eCAP(s) to a known state.
//
void Capture_init(void)
{
    // Initialize eCAP1/2/3
ECap1Regs.ECEINT.all = 0x0000;              // Disable all capture interrupts
    ECap1Regs.ECCLR.all = 0xFFFF;              // Clear all CAP interrupt flags
    ECap1Regs.ECCTL1.bit.CAPLDEN = 0;          // Disable CAP1-CAP4 register loads
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;        // Make sure the counter is stopped
   

ECap1Regs.ECCTL2.bit.CAP_APWM = 0;
    // Configure peripheral registers
    ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0;      // 连续控制方式
    ECap1Regs.ECCTL2.bit.STOP_WRAP = 1;        // Stop at 1 events
    ECap1Regs.ECCTL1.bit.CAP1POL = 0;          // 1FALLING edge  0上升沿
/*    ECap1Regs.ECCTL1.bit.CAP2POL = 1;          // FALLING edge
    ECap1Regs.ECCTL1.bit.CAP3POL = 1;          // FALLING edge
    ECap1Regs.ECCTL1.bit.CAP4POL = 1;          // FALLING edge*/
    ECap1Regs.ECCTL1.bit.CTRRST1 = 1;          // Difference operation         
/*    ECap1Regs.ECCTL1.bit.CTRRST2 = 1;          // Difference operation         
    ECap1Regs.ECCTL1.bit.CTRRST3 = 1;          // Difference operation         
    ECap1Regs.ECCTL1.bit.CTRRST4 = 1;          // Difference operation */        
    ECap1Regs.ECCTL2.bit.SYNCI_EN = 0;          // DISable sync in
    ECap1Regs.ECCTL2.bit.SYNCO_SEL = 2;        // Disable sync out
ECap1Regs.ECCTL1.bit.PRESCALE = 0;

    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;        // Start Counter
    ECap1Regs.ECCTL2.bit.REARM = 1;            // arm one-shot
    ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable CAP1-CAP4 register loads
    ECap1Regs.ECEINT.bit.CEVT1 = 1;            // 捕获事件1中断使能
    //tbd...

/* ECap2Regs.ECEINT.all = 0x0000;              // Disable all capture interrupts
    ECap2Regs.ECCLR.all = 0xFFFF;              // Clear all CAP interrupt flags
    ECap2Regs.ECCTL1.bit.CAPLDEN = 0;          // Disable CAP1-CAP4 register loads
    ECap2Regs.ECCTL2.bit.TSCTRSTOP = 0;        // Make sure the counter is stopped
   

ECap2Regs.ECCTL2.bit.CAP_APWM = 0;
    // Configure peripheral registers
    ECap2Regs.ECCTL2.bit.CONT_ONESHT = 0;      // 
    ECap2Regs.ECCTL2.bit.STOP_WRAP = 3;        // Stop at 4 events
    ECap2Regs.ECCTL1.bit.CAP1POL = 1;          // Falling edge
    ECap2Regs.ECCTL1.bit.CAP2POL = 0;          // Rising edge
    ECap2Regs.ECCTL1.bit.CAP3POL = 1;          // Falling edge
    ECap2Regs.ECCTL1.bit.CAP4POL = 0;          // Rising edge
    ECap2Regs.ECCTL1.bit.CTRRST1 = 1;          // Difference operation         
    ECap2Regs.ECCTL1.bit.CTRRST2 = 1;          // Difference operation         
    ECap2Regs.ECCTL1.bit.CTRRST3 = 1;          // Difference operation         
    ECap2Regs.ECCTL1.bit.CTRRST4 = 1;          // Difference operation         
    ECap2Regs.ECCTL2.bit.SYNCI_EN = 1;          // Enable sync in
    ECap2Regs.ECCTL2.bit.SYNCO_SEL = 0;        // Pass through
    ECap2Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable capture units

    ECap2Regs.ECCTL2.bit.TSCTRSTOP = 1;        // Start Counter
    ECap2Regs.ECCTL2.bit.REARM = 1;            // arm one-shot
    ECap2Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable CAP1-CAP4 register loads
    ECap2Regs.ECEINT.bit.CEVT1 = 1;            // 4 events = interrupt*/

/*    GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;      // Enable pull-up on GPIO25 (CAP2)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 0;    // Synch to SYSCLKOUT GPIO25 (CAP2)
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;    // Configure GPIO25 as CAP2*/

    EDIS;
}


//===========================================================================
// End of file.
//===========================================================================


 
  • 标签:数字信号处理器 
  • 群组:DSP开发知识 
  • 发表评论:
    100
    Powered by ASTAR.