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/TMS320F28379D:使用 ECAP 测量占空比

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/967373/ccs-tms320f28379d-using-ecap-to-measure-the-duty-cycle

器件型号:TMS320F28379D

工具/软件:Code Composer Studio

我使用带有 LaunchPad 28379d 的 eCAP1模块来测量脉冲波的占空比。

我的设置:CAP1检测上升沿并且 TSCTR 不计数为零

CAP2检测下降沿、CAP2检测下降沿、TSCTR 清零并进入中断读取值

如下图所示。黄色是 GPIO24的输入信号(10kHz)。 紫色是中断信号。 绿色是使用 DAC 功能进行观察的 TSCTR。

我的问题是 、TSCTR 为什么需要大约3.8us 才能设置为零????

=========================== ========================================================================================================  

#include "F28x_Project.h"

//
//定义
//
//配置计时器的开始/结束周期
#define PWM3_TIMER_MIN 10.
#define PWM3_TIMER_MAX 8000
//跟踪计时器值的移动方式
#define ePWM_TIMER_UP 1.
#define ePWM_TIMER_DOWN 0

//
//全局
//
UINT32 ECap1IntCount;
uint32 ECap1通过计数;
uint32 EPwm3TimerDirection;
uint32 Ecap1ct1;
uint32 Ecap1ct2;
uint32 TSCTR;

//======================================== DCA=========================
#define reference_VREFHI 1.
#define reference_VREF 1
#define DACA 1.
#define DACB 2.
#define DACC 3.
#define reference reference_VREFHI
#define DAC_NUM DACA
volatile struct dac_regs* dac_ptr[4]={0x0、DacaRegs、DacbRegs、DaccRegs};
//======================================== DCA=========================


_interrupt void eCAP1_ISR (void);
void InitECapture (void);
空 InitEPwmTimer (空);
失效失效(失效);
void ConfigureGPIO (void);

//
//主函
//
void main (void)


InitSysCtrl();


InitEPwm3Gpio();
InitECap1Gpio(24);
GPIO_SetupPinOptions (24、GPIO_INPUT、GPIO_SYNC);
配置 DAC (DAC_NUM);
ConfigureDAC (DACB);
ConfigureGPIO();

Dint;

InitPieCtrl();


IER = 0x0000;
IFR = 0x0000;


InitPieVectTable();


EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.ECAP1_INT =&eCAP1_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

InitEPwmTimer();//对于本示例,只初始化 ePWM 计时器
InitECapture();


ECap1IntCount = 0;
ECap1PassCount = 0;


IER |= M_INT4;


PieCtrlRegs.PIEIER4.bit.INTx1 = 1;


EINT;//启用全局_中断 INTM
ERTM;//启用全局实时__interrupt DBGM


for (;;)


TSCTR=ECap1Regs.TSCTR;
DAC_PTR[DAC_NUM]->DACVALS.ALL =(TSCTR/20030.0)*4096;
DAC_PTR[DACB]->DACVALS.ALL =(TSCTR/20030.0)*4096;




空 InitEPwmTimer()

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

EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//向上计数
EPwm3Regs.TBPRD = PWM3_TIMER_MIN;
EPwm3Regs.TBPHS.ALL = 0x00000000;
EPwm3Regs.AQCTLA.bit.PRD = AQ_TOGGLE;//打开 PRD


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

EPwm3TimerDirection = ePWM_TIMER_UP;

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


空 InitECapture()

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

ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1;//单次触发
ECap1Regs.ECCTL2.bit.STOP_Wrap = 1;//在2个事件时停止
ECap1Regs.ECCTL1.bit.CAP1POL = 0;// RisingEdge
ECap1Regs.ECCTL1.bit.CAP2POL = 1;//下降边沿

ECap1Regs.ECCTL1.bit.CTRRST1 = 0;//Abs
ECap1Regs.ECCTL1.bit.CTRRST2 = 1;//差动操作

ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;//直通
ECap1Regs.ECCTL1.bit.CAPLDEN = 1;//启用捕捉单元

ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;//起始计数器
ECap1Regs.ECCTL2.bit.rearm = 1;// ARM 单次触发
ECap1Regs.ECCTL1.bit.CAPLDEN = 1;//启用 CAP1-CAP4寄存器加载
ECap1Regs.ECEINT.BIT.CEVT2 = 1;// 2事件=__interrupt


_interrupt void eCAP1_ISR (void)

GpioDataRegs.GPBSET.BIO32 = 1;
ECap1PassCount++;

Ecap1ct1=ECap1Regs.CAP1;
Ecap1ct2=ECap1Regs.CAP2;


ECap1Regs.ECCLR.bit.CEVT2 = 1;
ECap1Regs.ECCLR.bit.INT = 1;
ECap1Regs.ECCTL2.bit.rearm = 1;

GpioDataRegs.GPBCLEAR.bit.GPIO32=1;
PieCtrlRegs.PIEACX.ALL = PIEACK_group4;

空配置 DAC (uint16 DAC_num)

EALLOW;
DAC_PTR[DAC_num]->DACCTL.bit.DACREFSEL =参考;
DAC_PTR[DAC_num]->DACOUTEN 位.DACOUTEN = 1;
DAC_PTR[DAC_num]->DACCTL.bit.LOADMODE=0;
DAC_PTR[DAC_num]->DACVALS.ALL = 0;
DELAY_US (10);//缓冲 DAC 加电延迟
EDIS;

空配置 GPIO (空)

EALLOW;


GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;//启用 GPIO34上的上拉
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;// GPIO34 = GPIO34
GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1;// GPIO34 =输出
GpioDataRegs.GPBCLEAR.bit.GPIO32=1;// GPIO34=1

GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;//启用 GPIO34上的上拉
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0;// GPIO34 = GPIO34
GpioCtrlRegs.GPADIR.bit.GPIO18 = 1;// GPIO34 =输出
GpioDataRegs.GPACLEAR.bit.GPIO18=1;// GPIO34=1

EDIS;

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

    您好!

    我研究了上述波形、并提出以下几个问题、以找出问题的根本原因:

    • 您是否能够正确读取导通时间刻度? 下降沿和上升沿读数之间的差值为50us?
    • 由于您在后台循环中使用 DAC 来生成与 TSCTR 相对应的输出波形、因此可能观察到的延迟对应于 ISR 完成到 DAC 完成转换的时间。 您是否检查了 ISR 内部花费的时间?

    如果我的回复回答了您的问题、请点击位于我帖子底部的"我的问题已解决"按钮。

    此致

    Himanshu

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

    您好、 Himanshu

    感谢您的回复~~

    当进入 ISR 时,紫色波将设置为高电平,当完成 ISR 处理时,  紫色波将设置为低电平,  
    因此、我认为这不是由 ISR 时间引起的。

    如何检查 DAC 的完整转换时间?

    谢谢~~

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

    • 您是否能够正确读取导通时间刻度? 下降沿和上升沿读数之间的差值为50us?

      是的!! 我看到上升沿时的结果、我的捕获值为10000。   下降沿时、我的捕获值为20000。 我 认为是正确的。

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

    您好!

    正如您回答"是的!! 我看到上升沿时的结果、我的捕获值为10000。   下降沿时、我的捕获值为20000。 我 认为是正确的"

    那么、如果您能够正确测量占空比/宽度、具体的问题是什么? 关于上面提到的 TSCTR->0延迟、正如我说过的、这可能主要是由于中断完成和 DAC 转换延迟。 您可以使用性能评测 GPIO 或 CCS 调试器时钟来评测 ISR 和 DAC 转换例程。 您应该能够在网络上找到大量资源、指导您使用 CCS 进行性能评测。

    如果我的回复回答了您的问题、请点击位于我帖子底部的"我的问题已解决"按钮。

    此致

    Himanshu

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

    好的~~谢谢你的呼啦