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.

[参考译文] CCS/TMS320F28027:使用 ECAP 功能测量两次瞬态之间的时间

Guru**** 2535440 points
Other Parts Discussed in Thread: CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/605438/ccs-tms320f28027-using-ecap-feature-for-time-measurement-between-two-transistions

器件型号:TMS320F28027
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

您好!

我想以125kHz 的频率对差分曼彻斯特代码进行解码。 因此、每次发生转换低电平/高电平或高电平/低电平以及与最后一次转换的时间差时、我都需要中断。

出于测试目的、我稍微修改 了 Example_2802xECap_Capture_PWM.c、但它只是提供了独立于输入信号的随机数。 (使用我的实际信号和函数发生器进行测试)

我希望您能给我一个提示、我必须在代码中更改什么内容。

//######################################################################################################################
//
////文件:example_2802xECap_Capture_PWM.c
//
//标题:捕获 EPwm3。
//
//假设:
//
//此程序需要 F2802x 头文件。
//
//进行以下外部连接:
// GPIO4上的 EPWM3应连接到 GPIO5上的 ECAP1。
//
//根据提供的信息,此项目配置为“引导至 SARAM”
//操作。 2802x 引导模式表如下所示。
//有关配置 eZdsp 引导模式的信息、
//请参阅 eZdsp 附带的文档、
//
//$Boot_Table
//当仿真器连接到您的器
件时,TRSTn 引脚= 1,//将器件设置为 EMU_boot 引导模式。 在此模式下
、//外设引导模式如下:
//
// 引导模式:EMU_KEY EMU_BMODE
// (0xD00)(0xD01)
// --------------------------------------
// 等待!=0x55AA x
// I/O0x55AA0x0000
// SCI0x55AA0x0001
// 等待0x55AA0x0002
// GET_Mode0x55AA0x0003
// SPI0x55AA0x0004
// I2C0x55AA0x0005
// OTP0x55AA0x0006
// 等待0x55AA0x0007
// 等待0x55AA0x0008
// Saram0x55AA0x000A<-"引导至 SARAM"
// 闪存0x55AA0x000B
//等待0x55AA 其他
//
////根据
上面的引导模式表,通过调试器//将 EMU_KEY 写入0xD00,将 EMU_BMODE 写入0xD01。 构建/加载项目、
//重置器件和运行示例
//
//$END_Boot_Table
//

////////
////////说明:
//
////此示例将 EPWM3A 配置为:
//-递增计数
//-周期从2开始并上升到1000
//- PRD 上的切换输出

//// eCAP1配置为捕获
PWM3A 输出的上升沿//和下降沿之间的时间。
//
//##########################################################################################################################
//$TI 发行版:F2802x 支持库 v230 $//
$发行 日期:5月8日星期五07:43:05 CDT 2015 $//
版权所有:版权所有(C) 2008-2015 Texas Instruments Incorporated -//
            http://www.ti.com/ 保留所有权利$
//############################################################################################################

#include "DSP28x_Project.h" //设备头文件和示例包括文件

//配置计时
器#define PWM3_timer_min 的开始/结束周期 10
#define PWM3_TIMER_MAX 8000

//原型语句,用于此文件中的函数。
_interrupt void eCAP1_ISR (void);
void InitECapture (void);
void InitEPwmTimer (void);
void FAIL (void);

//本示例中使用的全局变量
uint32_t ECap1IntCount;
uint32_t ECap1TimeCount;
uint32_t EPwm3TimerPassion;

uint32 uint1

uint32_t DutyOnTime2;
uint32_t DutyOffTime2;
uint32_t PERIOD1;
uint32_t Period2;


//跟踪计时器值以何种方式移动
#define ePWM_TIMER_UP 1
#define ePWM_TIMER_DOWN 0



void main (void)
{
//警告: 始终确保在运行 RAM 中的任何函数之前调用 memcpy
// InitSysCtrl 包括对基于 RAM 的函数的调用,并且在不调用
// memcpy 的情况下,处理器将"进入 weeds"
#ifdef _flash
funcpy (&RamfuncsRunStart、&RamsLoadStart、(size_t)&RamfuncsLoadStart、(sLoadStart)&RamfuncsLoadStart、(sLoadStart)&RamfuncsLoadSize)&Ramfuncedift/Step


1) 初始化系统控制:
// PLL、看门狗、启用外设时钟
//此示例函数位于 F2802x_sysctrl.c 文件中。
InitSysCtrl();

//步骤2。 初始化 GPIO:
//此示例函数位于 F2802x_GPIO.c 文件中,
//说明了如何将 GPIO 设置为其默认状态。
// InitGpio();//针对此示例跳过
InitEPwm3Gpio();
InitECap1Gpio();

//步骤3。 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
DINT;

//将 PIE 控制寄存器初始化为默认状态。
//默认状态是禁用所有 PIE 中断并
清除标志//。
//此函数位于 F2802x_PIECTRL.c 文件中。
InitPieCtrl();

//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;

//使用指向 shell 中断
//服务例程(service routinese, ISR)的指针初始化 PIE 矢量表。
//这将填充整个表,即使在
本示例中未使用中断//也是如此。 这对于调试很有用。
//可以在 F2802x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2802x_PieVect.c 中找到
InitPieVectTable();

//此示例中使用的中断被重新映射到
这个文件中的// ISR 函数。
EALLOW;//这是写入 EALLOW 受保护寄存
器 PieVectTable.ECAP1_INT =&eCAP1_ISR;
EDIS;//这是禁用写入 EALLOW 受保护寄存

器所必需的//步骤4。 初始化所有器件外设:
InitEPwmTimer();//对于此示例,仅初始化 ePWM 计时
器 InitECapture ();

//步骤5。 用户特定代码、启用中断:

//初始化计数器:
ECap1IntCount = 0;
ECap1PassCount = 0;

//启用连接到 ECAP1-4的 CPU INT4 INT:
IER |= M_INT4;

//在 PIE 中启用 eCAP INTn:组3中断
PieCtrlRegs.PIEIER4.bit 1-6 = 1;

//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM



//步骤6。 空闲循环。 只需等待并永久循环(可选):
for (;;)
{

}


void InitEPwmTimer ()
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;

EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//
EPwQTRS.Tb.EP3PRD
= 0x0000_EPmCR0.Tb.T3rg.Tb.EP_RDMC.Tb.DP=T3rg.PM_DPW3rg.T3rg.PM_RDM.PM_DP=0xT3rg.PM_DPW300.PM_DPW300.PM_RPM_RDM.
//打开 PRD //

TBCLK = SYSCLKOUT
EPwm3Regs.TBCTL.bit.HSPCLKDIV = 1;
EPwm3Regs.TBCTL.bit.CLKDIV = 0;

EPwm3TimerDirection = ePWM_TIMER_UP;

EALLOW;
SysLCLKCR0.TBIN = 0;EPwm3TCLKCR0.TBIT.TCLKCLKCR0=eDirection
EDIS;
}

void InitECapture ()
{
ECap1Regs.ECEINT.ALL = 0x0000; //禁用所有捕捉中断
ECap1Regs.ECCLR.ALL = 0xFFFF; //清除所有 CAP 中断标志
ECap1Regs.ECCTL1.bit.CAPLDEN = 0; //禁用 CAP1-CAP4寄存器加载
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; //确保计数器被停止

//配置外设寄存
器 ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0; //连续模式
ECap1Regs.ECCTL2.bit.STOP_Wrap = 3; //在4个事件时停止
ECap1Regs.ECCTL1.bit.CAP1POL=0; //上升沿
ECap1Regs.ECCTL1.bit.CAP2POL=1; //下降边沿
ECap1Regs.ECCTL1.bit.CAP3POL=0; //上升沿
ECap1Regs.ECCTL1.bit.CAP4POL=1; //下降边沿
ECap1Regs.ECCTL1.bit.CTRST1 = 1; //差动操作
ECap1Regs.ECCTL1.bit.CTRST2 = 1; //差动操作
ECap1Regs.ECCTL1.bit.CTRST3 = 1; //差动操作
ECap1Regs.ECCTL1.bit.CTRST4 = 1; //差动操作
ECap1Regs.ECCTL2.bit.SYNCI_EN = 0; //在
ECap1Regs.ECCTL2.bit.SYNCO_SEL 中禁用 SYNC = 3; //禁用
ECap1Regs.ECCTL1.bit.prescale = 0; //预分频= 1 /禁用

ECap1Regs.ECCTL1.bit.CAPLDEN = 1; //启用捕捉单元
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; //起始计数
器 ECap1Regs.ECEINT.BIT.CEVT4 = 1; // 4个事件=中断




}

__interrupt void eCAP1_ISR (void)
{
CAPyOnTime1 = ECap1Regs.CAP2;//在 T2
DutyOffTime1 = ECap1Regs.CAP3;//在 T3
DutyOnTime2 = ECap1Regs.CAP2
时捕获的获取时间戳;//在 T4 DutyOnTime2 = ECap1Regs.CAP2; //在 T1
PERIOD1 = DutyOnTime1 + DutyOffTime1;
Period2 = DutyOnTime2 + DutyOffTime2;






__asm (" nop");



ECap1Regs.ECCLR.bit.INT = 1;


//确认此中断以接收来自组4
的更多中断 PieCtrlRegs.PIEACK.all = PIEACK_group4;



}




//==========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//不再需要。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David、

    我看不到您的代码有任何明显的错误。 我建议再次从 controlSUITE 示例开始、并进行小幅增量更改、在每次更改之间测试代码。 您应该注意到在进行增量更改时所做的错误。

    请务必公布您发现的内容、这可能会对未来的人有所帮助!

    如果您发现哪个语句导致了您的问题、我可以帮助您从那里进行调试。

    此致、
    Cody

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Cody、

    错误不在代码中。 这就是我读取这些值的方式。 如果我在中断结束时使用了断点或串行打印、我只获得了随机值。 现在对我有效的是设置断点、将其删除、当我单击"恢复"时、我会获得正确的值。

    同样有效的是每次接收到完整数据包时的断点或串行打印。 (我只是将4个时间差逐一传递到解码例程)

    此致、
    David

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 David 的更新!

    如果您有更多问题、请随时开始另一个主题。

    此致、
    Cody