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/LAUNCHXL-F28069M:频率计。 指南和优化

Guru**** 2605725 points
Other Parts Discussed in Thread: LAUNCHXL-F28069M

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/680442/ccs-launchxl-f28069m-frequency-meter-guidelines-and-optimizing

器件型号:LAUNCHXL-F28069M

工具/软件:Code Composer Studio

大家好。

我为频率计编写了一个代码、但它有一些问题。 因此、我决定发布这个新线程。

这里是我执行的代码。

#include "F2806x_Device.h"
#include "F2806x_examples.h"
#include "DSP28x_Project.h"
#include 
#include 
#include 
#include 


extern UINT16 RamfuncsLoadStart;
extern UINT16 RamfuncsLoadEnd;
extern UINT16 RamfuncsRunStart;

__interrupt void eCAP1_ISR (void);
uint32 T1、T2、T3、T4、t;
uint32 conteo;


float f;
void main (void)
{
InitSysCtrl();
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadEnd);


InitFlash();
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO5=0;// Launchpad 上的 PIN35
GpioCtrlRegs.GPAQSEL1.bit.GPIO5=0;
GpioCtrlRegs.GPAMUX1.bit.GPIO5=3;
EDIS;
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.ECAP1_INT =&eCAP1_ISR;
EDIS;
t1=0;
T2=0;
T3=0;
T4 = 0;
T=0;
conteo = 0;
IER |= M_INT4;
PieCtrlRegs.PIEIER4.bit.INTx1 = 1;
EINT;
ERTM;
EALLOW;
ECap1Regs.ECEINT.ALL = 0x0000;
ECap1Regs.ECCLR.ALL = 0x0000;
ECap1Regs.ECCTL1.bit.CAP1POL= 0x1;
ECap1Regs.ECCTL1.bit.CAP2POL= 0x1;
ECap1Regs.ECCTL1.bit.CAP3POL= 0x1;
ECap1Regs.ECCTL1.bit.CAP4POL= 0x1;
ECap1Regs.ECCTL1.bit.CTRST1 = 0x1;
ECap1Regs.ECCTL1.bit.CTRST2 = 0x1;
ECap1Regs.ECCTL1.bit.CTRST3 = 0x1;
ECap1Regs.ECCTL1.bit.CTRRST4 = 0x1;
ECap1Regs.ECCTL1.bit.CAPLDEN = 0x1;
ECap1Regs.ECCTL1.bit.prescale = 0x1;
ECap1Regs.ECCTL2.bit.CAP_APWM = 0x0;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0x0;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0x2;
ECap1Regs.ECCTL2.bit.SYNCI_EN = 0x0;
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0x1;
ECap1Regs.ECEINT.BIT.CEVT4 = 1;
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
EDIS;
for (;;)
{
EALLOW;
GpioDataRegs.GPBSET.BIO34 = 1;
DELAY_US (100000);
GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
DELAY_US (100000);
f=180734328.8/t;

EDIS;
}


}
_interrupt void
eCAP1_ISR (void)
{

conteo++;
t1=ECap1Regs.CAP1;
t2=ECap1Regs.CAP2;
T3=ECap1Regs.CAP3;
T4=ECap1Regs.CAP4;
T=(t1+t2+t3+t4)/4;
ECap1Regs.ECCLR.bit.CEVT4 = 1;
ECap1Regs.ECCLR.bit.INT = 1;
ECap1Regs.ECCTL2.bit.rearm = 1;
PieCtrlRegs.PIEACX.ALL = PIEACK_group4;
} 

如您所见、我在下降沿使用了 eCAP 模块和 CAP1-CAP4负载、然后我添加了4个捕捉、得到了平均值。

编号 180734328.8来自频率为1Hz 的计时器戳。  

它的误差为10MHz。

此代码的问题是、当我在   LAUNCHXL-F28069M 的35引脚中输入频率低于10Hz 的信号时、数据更新速度很慢、数据冻结、我认为是在 CAP1- CAP4生成时、 然后、数据会自行更新、然后所有的东西都很好。

我认为还有其他方法可以做到、如果是、请提供一些指南、或者、如果可以优化、请提供一些指南。

此致

Mike

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

    Mike、

    配置 eCAP 的方式、ISR 将仅在每4个下降沿运行一次。 如果您的信号为10Hz、则只能以2.5Hz (10Hz/4)的速率获得更新。

    如果您希望对最后四个值求平均值、并且每次触发 eCAP 时也会收到更新、那么您是否建议您使用"滚动平均值"。

    为此、将 eCAP 配置为在每个事件后触发 ISR。 您应该保留长度为4的数组(或希望平均的任意数量的值)和始终指向数组中最早值的索引。 当您收到新值时、请将其写入数组、替换最早的值、 并重新计算平均频率。

    此致、
    Cody  

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

    您好 Cody

    我在 ISR 例程中使用了它、它对我有用、但我看到数据更新有一些延迟。 最后一部分、您说过您在讨论指针、但我对此不太满意。 我认为这可以解决这个问题。 此外、我更改了配置、以便在每个事件后执行 ISR。 您是否认为有更多的方法来实现该频率计?

    for (i=0;i<3;i++)
    {
    
    t[i]=ECap1Regs.CAP1;
    t=t[i];
    } 

    此致

    Mike

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

    Mike、

    您正朝着正确的方向移动、但我认为代码只需用相同的值填充数组"t"中的所有元素。 然后将 T 分配给最后一个元素中的值。

    要使用继动平均获得最快响应、您需要在每次触发 ISR 时将 eCAP 中的最新值添加到数组的一个元素中。 然后递增索引"i"一次、重新计算平均值、最后从 ISR 返回。 我建议使用模数函数或类似"i"的内容、以确保其不会超过数组"t"中元素的数量

    此致、
    Cody