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.

[参考译文] TMS320F28335:TMS320F28035/TMS320F28335无法捕捉与低频信号相关的问题

Guru**** 2563960 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1170259/tms320f28335-tms320f28035-tms320f28335-cannot-capture-issues-related-to-low-frequency-signals

器件型号:TMS320F28335

大家好、

客户提出的问题需要您的帮助:

大家好、我报告了使用283352/28035捕获500Hz 以下信号时发生的错误、我不知道具体原因是什么、因为它是500Hz-500kHz 捕获中的稳定捕获。 我查看了手册和数据手册、以查看计数器是否未及时重置为零、但在配置寄存器后未进行任何更改、然后我删除了配置代码、该代码是根据28335例程进行修改的。 我希望我的朋友能多教些东西。 以下是错误症状和代码:

void delay_1ms (uint16 t)

while (t-)

DELAY_US (1000);

中断空 ISRCap1 (空)

PieCtrlRegs.PIEACX.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;


中断空 ISRCap2 (空)

PieCtrlRegs.PIEACX.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;t1=T8-t7;


ap.c:

#include "bsp_cap.h"
#if DSP28_28335
// ECCTL1 (ECAP 控制寄存器1)
//================================================
// CAPxPOL 位
#define EC_RISING 0x0
#define EC_FALLING 0x1
// CTRRSTx 位
#define EC_ABS_MODE 0x0
#define EC_DELT_MODE 0x1
//预分频位
#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 控制寄存器2)
//================================================
// CONT/OneShot 位
#define EC_Continous 0x0
#define EC_OneShot 0x1
// STOPVAUE 位
#define EC_EVENT1 0x0
#define EC_EVENT2 0x1
#define EC_EVENT3 0x2
#define EC_EVENT4 0x3
//重新启用位
#define EC_ARM 0x1
// TSCTRSTOP 位
#define EC_FREEZE 0x0
#define EC_RUN 0x1
// SYNCO_SEL 位
#define EC_SYNCIN 0x0
#define EC_CTR_PRD 0x1
#define EC_SYNCO_DIS 0x2
// CAP/APWM 模式位
#define EC_CAP_MODE 0x0
#define EC_APWM_MODE 0x1
// APWMPOL 位
#define EC_ACTV_HI 0x0
#define EC_ACTV_LO 0x1
//通用
#define EC_DISABLE 0x0
#define EC_ENABLE 0x1
#define EC_FORCE 0x1
#endif //结束 DSP28_28335
空 InitCapl (空)

ChoseCap();//给CAP分配时钟
InitECap1Gpio();//初始化CA1的GPIO
InitECap2Gpio();//初始化CA2的GPIO
SetCap1Mode();
SetCap2Mode();

空压盖(空)

SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK=1;//启用到 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 SetCap1模式(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.CTRST1 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRST2 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRST3 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRST4 = 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_CONTINUCT;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECEINT.All=0x0000;//停止所有中断
ECap1Regs.ECCLR.All=0xFFFF;//Clare all 标志
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;//启动
ECap1Regs.ECEINT.BIT.CEVT4=1;//启用 cevt4中断


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.CTRST1 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CTRST2 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CTRST3 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CTRST4 = 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_CONTINUCT;
ECap2Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap2Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap2Regs.ECEINT.All=0x0000;//停止所有中断
ECap2Regs.ECCLR.All=0xFFFF;//Clare all 标志
ECap2Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;//启动
ECap2Regs.ECEINT.BIT.CEVT4=1;//启用 cevt4中断

结果:

您能否查看此案例?谢谢。

此致、

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

    Ben、

    您能解释一下问题是什么吗?

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

    您好、Santosh、

    在我看来、值'f'代表捕获信号的频率、该频率应低于500Hz。  

    我将与客户交谈以确认问题。

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

    您好 Ben、

    通过查看 ISR 代码、客户似乎没有使用 eCAP2。 即使对于 eCAP1、它也仅使用两个 CEVT1和 CEVT2。

    您还能检查预期值是多少吗? 它是否仅在低频时工作?  它停止工作的频率是多少?

    谢谢、此致、

    桑托什

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

    您好、Santosh、

    很抱歉稍后再回复您的消息、感谢您对我的问题的回答、 我无法捕获0-500Hz 之间的频率以确保数据稳定准确、越接近0Hz、我捕获相应的数字就越少。 我刚刚打开了一个捕获窗口、使用了两个时间戳寄存器、预期值是我可以在50Hz 下捕获频率、我正在考虑它是否是由计数器溢出引起的。 但我刚刚查看了数据表、发现有停止和启动寄存器 TSCTRSTOP 和 TSCTR、当捕获到第二个事件时、它们无法将其复位为0、进入中断。 我正在考虑是否有语句来确定计数器溢出、没有溢出输出正常的捕捉值、溢出是由算法计算的、该算法尚未实现、我不知道结果。  

    此致、

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

    Ben、

    我只是想确保我是否正确理解了问题。 如果信号太慢、0Hz 至500Hz、eCAP 将不工作。 在500 Hz 以上、捕获工作正常。 我的理解是否正确?

    此致、

    桑托什

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

    您好、Santosh、

    ECAP 应该 在0 - 500Hz 时正常工作、但我不应该能够解决其计数器溢出问题。  

    此致、

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

    Ben、

     当信号为0-500Hz 或 CAP1/4计数器值无效时、您是否没有获得 eCAP ISR?

    我刚刚使用350Hz ePWM 信号在我的设置上进行了测试。 它能够捕获事件。

    此致、Santosh