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.

[参考译文] MSP430FR2355频率计数器

Guru**** 2517600 points
Other Parts Discussed in Thread: MSP430FR2355

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1067764/msp430fr2355-frequency-counter

《线程》中讨论的其他部件:MSP430FR2355测试

大家好

我正在与 MSP430FR2355一起使用,我需要测量4Mhz 频率分配器的频率并捕获频率。

我测试了2个样本代码(MSP4302235X_tb0_capture.c 和  MSP4302235X_tb0_22.c),现在我有以下问题:  

1-我正在使用 MSP430Fr2355 Launchpad,但我无法访问引脚2.7作为输入,我现在该怎么办?  

2-我 应该将 TB0CLK 用于 计时 器,将 TB0TRG 用于 触发器? 请您解释 一下我该怎么做。

3-我是否需要将针脚连接在一起以用于计时器和 触发器? 因为 在该链路中连接了两个用于 计时器和 触发 器的引脚。

最佳

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

    嗨,哈迪,你想测量4MHz 时钟不同分频器的频率,对吗? 4MHz 时钟是外部时钟源,而不是来自 MSP430,对吗? 测量需要什么分辨率或精确度?

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

    你好,Dennis

    感谢你的回复。

    我有连接到 MSP430FR2355引脚的外部设备,我想测量其频率,我想测量频率,我应该计算周期数(我不确定)。
    我想测量 MSP430FR2355引脚上的分频器频率(3-4 MHz)。 我使用了 P2.2。

    此致

    哈迪

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

    好的,该设备上实际上有几个 timerB 模块,其中一些具有2 个捕获/比较输入,另一个具有5个捕获/比较输入,这些输入连接到可用的引脚。

     查看 数据表第6.10.9节,有一些表格显示了计时器及其输入捕获引脚。 MSP430FR2355 Launchpad 用户指南 示意图显示了下列定时器输入扇出至 BoosterPack 管座针脚的情况:TB0.1 (P1.6),TB0.2 (P1.7),TB1.1 (P2.0),TB1.2(P2.1),TB2.0(P5.0), TB2.1 (P5.1),TB3.1 (P6.0),TB3.2 (P6.2),TB3.3 (P6.2),TP3.4 (P6.3)和 TB3.5 (P6.4)。  请注意,P2.2不是计时器输入,因此请选择其他输入之一。

    现在,为了能够测量高达4MHz 的电压,您需要将计时器的运行频率至少为您测量的输入的两倍,因此为8MHz。  由于 timerB 的时钟频率最高可为24MHz,我建议您配置时钟系统,以便为计时器提供24MHz 输入时钟。

    您将需要在捕获模式下设置计时器。  TI 资源浏览器TIREX 中有一些示例说明如何为 MSP430FR2355执行此操作

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

    我犹豫不同意丹尼斯,但 你不会成功地使用捕获测量4MHz 信号,而是应该按照你的建议使用 TB1CLK。 选择 TBSSEL=0和 MC=2并定期获取 TB1R—可能是由单独的计时器测量的。

    我通常估计断开偶数点为20 kHz 左右—较慢的信号在捕获时效果更好,速度更快需要 TBnCLK 计数器。

    TB1TRG 是与 TBOUTH 相关的独立产品。 在大多数应用中,您希望避免触发 TB1TRG。

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

    你好,Dennis

    感谢你的回复。 我会检查你的建议,并与你联系。

    此致  

    哈迪

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

    尊敬的布鲁斯

    感谢你的回复。

    我在这种方法上有问题,我是否需要将计时器和触发器(TB1CLK 和 TB1TRG)的引脚连接在一起? 因为在该链路中连接了两个用于计时器和触发器的引脚。

    https://dev.ti.com/tirex/explore/node?node=AE1YXfIwoIIOovncrRHB2A__IOGqZri__LATEST

    此致

    哈迪

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

    将 TB1CLK 连接到您的信号。 切勿连接 TB1TRG。

    该示例创建了自己的输入信号,这很方便,但我认为您有一个信号(?)。 遗憾的是,它使用捕获而不是外部时钟。

    下面是使用外部时钟的示例。 它适用于不同的设备,但原理是相同的。

    https://e2e.ti.com/support/microcontrollers/msp-low-opower-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/714284/ccs-msp430fr5959-timer-in-capture-mode

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

    尊敬的布鲁斯
    感谢你的回复。

    我有一个外部信号,我想测量它的频率。
    我将其连接到 P2.2 (TB1CLK),我测试了几次,但我找不到周期数。

    TB1CCTL0 |= CM_1 | CCIS_1 | CCIE | CAP | SCS;
    TB1CTL |= TBSSEL_0 | MC_2 | TBCLR;

    TB1CCTL0和=~CCIFG;
    CountMeasureFreq = TB1CCR0;

    我不知道如何解决这个问题,请你帮我。  

    非常感谢。

    最佳

    哈迪

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

    该代码使用 CAPTURE 进行测量。 我建议您不要对所述应用程序进行捕获,但要执行此操作,您需要使用 TB1.0引脚,这种引脚显然不存在。

    您的外部信号将导致 TB1R 在信号中的每个周期(脉冲)增量(+1)。 要使用此值,请定期读取 TB1R (例如每毫秒),减去您上次读取的值,然后将差值除以要获取的周期(脉冲/时间)。

    执行“定期”部分的最简单方法是使用另一个计时器(可能是 TB0)并将其设置为每毫秒(例如)中断一次(CCIE)。 我确信,TI 的一个示例说明了如何执行此部分。

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

    尊敬的布鲁斯
    我希望你们做得好。

    请找到我所附的代码。

    在此代码中,我想从 P2.2 (TB1CLK)的频率分配器(外部)中找到测量频率。

    但可能值为0。

    #include <msp430.h>
    
    
    unsigned long VAL; // Previous value of the capture register
    unsigned long counter;
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;                       // Stop watchdog timer
    
        // Configure GPIO
    
        P2SEL1 |= BIT2;                                 // Set as ACLK pin, second function
        P2DIR |= BIT2;
    
        PM5CTL0 &= ~LOCKLPM5;
    
    
        TB1CTL = TBSSEL_0 | MC_2 | TBCLR | TBIE;
        TB1CCTL0 |= CM_1 | CCIS_1 | CCIE | CAP | SCS;
    
    
        __bis_SR_register(LPM0_bits | GIE);
        __no_operation();
    }
    
    // Timer0_B3 CCR0, TB Interrupt Handler
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector = TIMER1_B0_VECTOR
    __interrupt void TIMER1_B0_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(TIMER1_B0_VECTOR))) TIMER1_B0_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    
    
    {
        unsigned long freq;
        freq = counter;
        counter = 0;
        TB1CCTL0 &= ~CCIFG;
    
        unsigned long SAM;
        SAM = TB1CCR0;
    
    
        freq += SAM - VAL;
        VAL = SAM;
    }
    
    #pragma vector=TIMER0_B1_VECTOR
    __interrupt void TB0IV_ISR(void)
    {
        if(TBIV == 10)
        {
            counter += 0x10000;
        }
    }
    
    

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

    这个代码看起来非常像以前的代码——特别是,它仍然使用 Capture 进行计算,但由于 TB1.0引脚不存在,将不会发生捕获事件。 您需要决定是使用捕获(慢速信号)还是使用外部时钟(快速信号),因为这些过程非常不同。

    我建议您在调试器中运行此代码,并使用“寄存器”视图在输入信号运行时监视 TB1R。 但首先,您需要:

    >P2SEL1 || BIT2;//设置为 ACLK 引脚,第二个函数
    >P2DIR |= BIT2;

    将这两行替换为:

    >P2SEL0 |= BIT2;// P2.2作为 TB1CLK,按
    >P2DIR &=~BIT2;//数据表(SLASEC4C)表6-64

    此外,下面是在 FR2355上使用外部时钟(尽管不是完整的频率计数器实现)的 TI 示例:

    https://dev.ti.com/tirex/explore/node?node=ANcmdW6geYSVsxVVNMB9rA__IOGqZri__LATEST

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

    尊敬的布鲁斯
    感谢你的回复。

    请您向我提供明确的解决方案,因为 我 找不到解决 方案并解决了我的问题。

    请找到我所附的代码。

    一  

    #include <msp430.h>
    
    
     unsigned long CounterValue = 0;
     unsigned long StoredCount = 0;
     unsigned long Result = 0;
    
    
    
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;                       // Stop watchdog timer
    
        // Configure GPIO
    
        P2SEL0 |= BIT2;                                 // Set as ACLK pin, second function
        P2DIR &= ~BIT2;
    
        PM5CTL0 &= ~LOCKLPM5;
    
    
        TB1CTL = TBSSEL_0 | MC_2 | TBCLR | TBIE;
        TB0CCTL0 |= CM_1 | CCIS_1 | CCIE | CAP | SCS;
    
        while(1)
        {
    
        TB0CTL |= MC0;              // Start timer
        TB1CTL |= MC_2;              // Start timer
        while(CounterValue != 400); // Wait while CounterValue is not equal to 400
        TB0CTL &= ~MC0;             // Stop timer
        TB1CTL &= ~MC_2;             // Stop timer
        Result = StoredCount;       // Store frequency in Result
        CounterValue = 0;           // Zero CounterValue
        StoredCount = 0;            // Zero StoredCount
        TB0R = 0;                   // Zero Timer_B0 register
        TB1R = 0;                   // Zero Timer_B1 register
        }
    
    
        __bis_SR_register(LPM0_bits | GIE);
        __no_operation();
    }
    
    // Timer0_B3 CCR0, TB Interrupt Handler
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector = TIMER1_B0_VECTOR
    __interrupt void TIMER1_B0_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(TIMER1_B0_VECTOR))) TIMER1_B0_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    
    {
        CounterValue++;
    }
    
    #pragma vector=TIMER0_B1_VECTOR
    __interrupt void TB0IV_ISR(void)
    
    {
        StoredCount++;
    }

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

    我将示例 tb0_02和 tb0_22修补在一起,并增加了一小部分算术。  

    免责声明:我没有设备,所以这是未经测试的。 但我认为这大致是正确的。

    //
    //  Frequency-counter example, assuming fast (>1kHz) input signal.
    //  Started life as example msp430fr235x_tb0_02, with a patch from tb0_22.
    //  No support. No warranty. I may not even exist.
    //
    #include <msp430.h>
    
    unsigned curr, prev;                             // Must be 16-bit unsigned for arithmetic
    unsigned freq_in_kHz;                            // Instantaneous frequency result
    
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;                    // Stop WDT
        PM5CTL0 &= ~LOCKLPM5;                        // Engage GPIOs
    
        //  Adapted from example tb0_22:
        P2SEL0 |= BIT2;                              // P2.2 selected as TB1CLK
        TB1CTL = TBSSEL_0 | MC_2 | TBCLR;            // TB1CLK, continuous mode, clear TBR, no interrupt
    
        //  Adapted from example tb0_02:
        TB0CCTL0 |= CCIE;                            // TBCCR0 interrupt enabled
        TB0CCR0 = 1000-1;                            // 1ms at 1MHz SMCLK
        TB0CTL = TBSSEL__SMCLK | MC__UP;             // SMCLK, UP mode
    
        //  The ISR does all the work
        __bis_SR_register(LPM0_bits | GIE);          // Enter LPM0 w/ interrupt
        __no_operation();                            // For debug
    }
    
    // Timer0_B0 interrupt service routine
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector = TIMER0_B0_VECTOR
    __interrupt void Timer0_B0_ISR (void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(TIMER0_B0_VECTOR))) Timer0_B0_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
        //  Called every 1ms.
        //  Compute delta-ticks based on successive TB1R values.
        unsigned diff;              // Must be 16-bit unsigned
        curr = TB1R;                // Number of ticks from external clock
        diff = curr - prev;         // Difference from last time (1ms ago)
        prev = curr;                // For next time
        // Based on 1ms poll cycle, delta-count is frequency in kHz
        // You'll probably want some better arithmetic here.
        freq_in_kHz = diff;
    }

    [编辑:使用来自 TB2的自生成信号进行测试。 评论已相应更新。]

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

    尊敬的布鲁斯
    感谢你的回复。 我会检查你的建议,并与你联系。

    此致  

    哈迪

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

    尊敬的布鲁斯

    太棒了!!! 绝对明智的建议!  

    我根本不可能想出这个解决方案。 我希望你的回答也能帮助别人!!

    再次感谢。继续保持良好的工作!

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

    尊敬的布鲁斯

    我希望你们做得好!

     是否有机会提高频率测量的准确度?

    最佳

    哈迪

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

    通过延长 TB0轮询周期(例如),您可以获得更多分辨率 1毫秒至10毫秒。 然后(概念上)将结果乘以100而不是1000以获得 Hz,即再乘以一个十进制数的分辨率。 整个轮询周期的信号需要保持稳定,否则您将获得平均效果。

    使用4MHz 信号时,这将导致40000,这非常接近该方法的16位限制(65535)。 您需要多少位数字?

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

    尊敬的布鲁斯
    感谢你的回复。

    我希望至少有5位数。 请告诉我  TB0的价值是什么?

    在 TB0CCR0 = 1000-1中;我的频率 接近2800;但当我更改 TB0CCR0 = 10000-1时;我  的频率接近27000。

    此致

    哈迪

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

    “近”多近? 由于四舍五入错误,(2800*1000)距离(27000*100)不远。 可能的错误来源:

    1) 由于您正在轮询 TB1R,这对中断延迟非常敏感。 (您的计划还在做什么?) 我希望这会显示为抖动,因为它不会影响您的信号。 平均值是一种相当简单的抖动消除方法。

    2)您的信号运行速度快于您的指令速率(估计为 MCLK/5),这也可能导致高达5-10计数的抖动(取决于您的 MCLK)。

    3)您的信号稳定程度如何? 在您的投票期间,它是否会有所变化? 这是在动吗?

    每一个都可以通过平均来改进。 从8到10个连续读数开始。