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.

[参考译文] MSP430FR5969:MSP430FR5969上的频率捕获

Guru**** 2535750 points
Other Parts Discussed in Thread: MSP430FR5969

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/902486/msp430fr5969-frequency-capture-on-msp430fr5969

器件型号:MSP430FR5969

各位专家、您好!

我想使用 MSP430FR5969上的外部计时器捕获频率。 我该怎么做? 欢迎提出任何建议。

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

    Manish、您好!

    如果我理解正确、您希望测量外部频率。 对吧?

    您要测量的频率是多少?

    您能不能检查一些 e2e 线程、它们可能会对您有所帮助。

    例如:

    链接1

    链接2.

    请先让我知道这是否有帮助。

    此致

    Kostas

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

    Manish、您好!

    此处是另一个可能有所帮助的链接。您需要根据您的器件进行调整。

    https://forum.43oh.com/topic/3317-msp430f550x-based-frequency-meter

    此致

    Kostas

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

    您好 Kostas、

    您的理解是正确的、我需要捕获外部频率我已将时钟源设置为 SMCLK 至8MHz 以下是我的完整代码、如果我混淆了任何内容、请更正

    #include

    #define NUMBER_TIMER_CAPTURES      40.

    volatile unsigned int timerAcaptureValues[number_timer_capturs];
    unsigned int timerAcapturePointer = 0;

    int main (空)

     WDTCTL = WDTPW | WDTHOLD;                //停止看门狗计时器
     P1OUT &=~0x01;
     P1DIR |= 0x01;  
     P1DIR |= BIT2;                    // P1.2
     P1SEL0 |= BIT2;
     
     P2DIR |= BIT0;
     P2SEL0 |= BIT0;                          //输出 ACLK
     P2SEL1 |= BIT0;
     
     P3DIR |= BIT4;
     P3SEL0 |= BIT4;                          //输出 SMCLK
     P3SEL1 |= BIT4;
     
       PJSEL0 |= BIT4 | BIT5 | BIT6 | BIT4;     //用于 XT1和 XT2

     PM5CTL0 &=~LOCKLPM5;
     //时钟系统设置
    CSCTL0_H = CSKEY >> 8;                   //解锁 CS 寄存器
     CSCTL1 = DCOFSEL_6;                      //将 DCO 设置为8MHz
     CSCTL2 = SELA_LFXTCLK | SELS__HFXTCLK | SELM_DCOCLK;
     /CSCTL2 = SELA_VLOCLK | SELS_DCOCLK | SELM_DCOCLK;
     CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;    //将所有分频器设置为1
     CSCTL4 |= LFXTDRIVE_3 | HFXTDRIVE_3;
     CSCTL4 &=~(LFXTOFF | HFXTOFF);
     操作
     {
       CSCTL5 &=~(LFXTOFFG | HFXTOFFG);      //清除 XT1和 XT2故障标志
       SFRIFG1 &=~OFIFG;
     } while (SFRIFG1&OFIFG);                  //测试振荡器故障标志
     CSCTL0_H = 0;
     
     __DELAY_CYCLES (1000);                    //时钟初始化延迟
     
     TA0CCTL2 = CM_1 | CCIS_1 | SCS | CAP | CCIE;
     TA0CTL = tassel_SMCLK | MC__Continuous;
     _bis_SR_register (LPM0_bits | GIE);
     __no_operation();


    // Timer0_A3 CC1-4,TA 中断处理程序
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector = TIMER0_A1_vector
    _interrupt void Timer0_A1_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((中断(TIMER0_A1_vector)) Timer0_A1_ISR (void)
    其他
    错误编译器不受支持!
    #endif

     switch (__evo_in_range (TA0IV、TA0IV_TAIFG)){
       案例 TA0IV_TA0CCR1:
         中断;
       案例 TA0IV_TA0CCR2:
         timerAcaptureValues[timerAcapturePointer++]= TA0CCR2;

         if (timerAcapturePointer >= 40){
           while (1){
             P1OUT ^= 0x01;                   //切换 P1.0 (LED)
             _DELAY_CYCLES (100000);
           }
         }
         中断;
       案例 TA0IV_TA0IFG:
         中断;
       默认值:
         中断;
     }


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

    Manish、您好!

    简短的问题。

    您是否在设置中测试过代码? 它目前是否起作用?

    此致

    Kostas

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

    您好 Kostas、

    我已在我的设置中测试了代码、但无法捕获当前频率。

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

    大家好、Kostas 和所有专家、

    我需要问一个简单的问题、我已将 SMCLK 上的器件配置为8MHz、我需要捕获从示波器测得的外部频率、大约为390Khz、我的代码是否能够测量该频率? 下面是我的代码、请给出任何建议、因为我无法继续。 我将感谢这一行动。 这是我的代码。

    #include <MSP430FR5969.h>

    #define NUMBER_TIMER_CAPTURES      40.

    volatile unsigned int timerAcaptureValues[number_timer_capturs];
    unsigned int timerAcapturePointer = 0;

    int main (空)

     WDTCTL = WDTPW | WDTHOLD;                //停止看门狗计时器
     P1OUT &=~0x01;
     P1DIR |= 0x01;  
     P1DIR |= BIT2;                    // P1.2
     P1SEL0 |= BIT2;
     
     P2DIR |= BIT0;
     P2SEL0 |= BIT0;                          //输出 ACLK
     P2SEL1 |= BIT0;
     
     P3DIR |= BIT4;
     P3SEL0 |= BIT4;                          //输出 SMCLK
     P3SEL1 |= BIT4;
     
       PJSEL0 |= BIT4 | BIT5 | BIT6 | BIT4;     //用于 XT1和 XT2

     PM5CTL0 &=~LOCKLPM5;
     //时钟系统设置
    CSCTL0_H = CSKEY >> 8;                   //解锁 CS 寄存器
     CSCTL1 = DCOFSEL_6;                      //将 DCO 设置为8MHz
     CSCTL2 = SELA_LFXTCLK | SELS__HFXTCLK | SELM_DCOCLK;
     /CSCTL2 = SELA_VLOCLK | SELS_DCOCLK | SELM_DCOCLK;
     CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;    //将所有分频器设置为1
     CSCTL4 |= LFXTDRIVE_3 | HFXTDRIVE_3;
     CSCTL4 &=~(LFXTOFF | HFXTOFF);
     操作
     {
       CSCTL5 &=~(LFXTOFFG | HFXTOFFG);      //清除 XT1和 XT2故障标志
       SFRIFG1 &=~OFIFG;
     } while (SFRIFG1&OFIFG);                  //测试振荡器故障标志
     CSCTL0_H = 0;
     
     __DELAY_CYCLES (1000);                    //时钟初始化延迟
     
     TA0CCTL2 = CM_1 | CCIS_1 | SCS | CAP | CCIE;
     TA0CTL = tassel_SMCLK | MC__Continuous;
     _bis_SR_register (LPM0_bits | GIE);
     __no_operation();


    // Timer0_A3 CC1-4,TA 中断处理程序
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector = TIMER0_A1_vector
    _interrupt void Timer0_A1_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((中断(TIMER0_A1_vector)) Timer0_A1_ISR (void)
    其他
    错误编译器不受支持!
    #endif

     switch (__evo_in_range (TA0IV、TA0IV_TAIFG)){
       案例 TA0IV_TA0CCR1:
         中断;
       案例 TA0IV_TA0CCR2:
         timerAcaptureValues[timerAcapturePointer++]= TA0CCR2;

         if (timerAcapturePointer >= 40){
           while (1){
             P1OUT ^= 0x01;                   //切换 P1.0 (LED)
             _DELAY_CYCLES (100000);
           }
         }
         中断;
       案例 TA0IV_TA0IFG:
         中断;
       默认值:
         中断;
     }

    如果我错了、请纠正我的理解。

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

    Manish、您好!

    首先、代码将不起作用。

    您的外部信号输入引脚是什么?

    也是

       CSCTL0_H = 0;                            //锁定 CS 模块

    信号丢失。

    我将对此进行详细检查、但您能否查看上面给出的 Link1。

    这应该是一个良好的起点。

    此致

    Kostas

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

    您好 Kostas、

    我的外部频率输入引脚为 port1.2。

    您能说出我的代码为什么不起作用吗? 我的代码中的任何内容

    CSCTL0_H = 0;                            //锁定 CS 模块

    没有缺失我已使用过它、请再次进行交叉验证? 您能告诉我为什么这不起作用、是否有其他解决方案? 如果是,请尽快通知我,我将对此表示感谢。

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

    尝试在8MHz 频率下直接捕获390kHz 信号是不可行的、因为这只能为您提供20个 CPU 时钟来处理每次捕获。

    推荐的快速信号方法是通过将信号连接到计时器的时钟输入来进行频率计数。

    也许您已经知道这一点、因为此计划中已经存在用于执行此操作的大多数基础架构。 但您尚未为 TACLK 设置 TA0、因此您需要:

    >P1DIR |= BIT2;                    // P1.2
    >P1SEL0 |= BIT2;

    应为:

    根据                       SLAS704G 表6-49、> P1DIR &=~BIT2;// P1.2作为 TA0CLK
    > P1SEL1 |=  BIT2;

    >TA0CTL = tassel_SMCLK | MC__Continuous;

    应为:

    > TA0CTL = tassel_TACLK | MC__Continuous;//来自 P1.2的时钟(TA0CLK)

    对于考古学家:这里发生的是 TA0从外部信号计时、捕捉(CCIS=1)在 ACLK 上触发、每隔~32usec。 捕获计数可用于在相当短的固定周期内测量输入频率。 该程序具有大约(8MHz 时为32us)=256个 CPU 时钟来处理每个捕捉。

    ----------

    您是否正在使用 Launchpad? 在交付时、高频晶振(Y1)未被组装。 您的程序是否可能一直等待(永远) HFXT 启动?

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

    Manish、您好!

    我同意 Bruce 在上面所说的话。

    但是、这是我发送给您的 Link1中实现的、已经两次了。 您应该已经了解过这一点。 此处介绍了该实现。

    以下是我在 P1.3引脚上使用250kHz 外部信号进行测试的示例代码。

    您也可以使用 P1.2输入、如 Bruce 所述。

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

    // MSP430FR5969
    // P1.3上的外部频率捕捉

    #include

    #define NUMBER_TIMER_CAPTURES      20.

    volatile unsigned int timerAcaptureValues[number_timer_capturs];
    unsigned int timerAcapturePointer = 0;
    unsigned int result = 0;


    int main (空)

       WDTCTL = WDTPW | WDTHOLD;  //停止看门狗计时器

       //配置 GPIO
       P1DIR &=~BIT3;                          //使用计时器 A1和 CCR 2寄存器
       P1SEL1 &=~BIT3;                         //将 P1.3设置为输入方向
       P1SEL0 |= BIT3;                          //(TA1.CCI2A)
                                                 //使用计时器 A1和 CCR 2寄存器
       //可选的到引脚的 SMCLK 输出
       P3DIR |= BIT4;                           // P3.4设置为方向输出(DS 表6-57)
       P3SEL1 |= BIT4;                          //为 SMCLK 选择输出


       //禁用 GPIO 上电默认高阻抗模式以激活
       //先前配置的端口设置
       PM5CTL0 &=~LOCKLPM5;

       //时钟系统设置:设置 DCO 频率。 为 ACLK、SMCLK、MCLK 设置分频器和源
       CSCTL0_H = CSKEY >> 8;                   //解锁 CS 寄存器
       CSCTL1 = DCOFSEL_6;                      //将 DCO 频率设置为选项6:->8MHz
       CSCTL2 = SELA_VLOCLK | SELS__DCOCLK | SELM_DCOCLK; //设置 SMCLK 的源= MCLK = DCO、ACLK = VLOCLK
       CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;    //将所有分频器设置为1
       CSCTL0_H = 0;                            //锁定 CS 模块(使用字节模式到高字节)

       _DELAY_CYCLLES (1000);                    //允许时钟系统稳定

       // Timer0_A3设置
       TA1CTL = tassel_SMCLK | MC__Continous;   //使用 SMCLK 作为时钟源、
                                                   //在连续模式中启动计时器

       TA1CCTL2 = CM_1 | CCIS_0 | SCS | CAP | CCIE;//(计时器 A1、CC 块2)
                                                   // CM_1:捕获模式上升沿、
                                                   // CCIS_0:使用 CC 输入 CCI2A=P1.3、请参阅 DS
                                                   // SCS:同步捕捉、
                                                   // cap:模式1->Capture,0->Compare,启用捕获模式,
                                                   // CCIE:启用捕捉中断


       _bis_SR_register (LPM0_bits | GIE);        //启用 LPM 和通用中断
       __no_operation();


    // Timer1_A3 CC1-4,TA 中断处理程序
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector = Timer1_A1_vector
    _interrupt void Timer1_A1_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((中断(Timer1_A1_vector)) Timer1_A1_ISR (void)
    其他
    错误编译器不受支持!
    #endif

     开关(__evo_in_range (TA1IV、TA1IV_TAIFG))
     {
       案例 TA1IV_TA1CCR1:
         中断;
       案例 TA1IV_TA1CCR2:
         timerAcaptureValues[timerAcapturePointer++]= TA1CCR2;   //将值存储在数组中
         if (timerAcapturePointer == 20)
         {
             timerAcapturePointer = 0;
    //       计算两个连续值的示例
             结果=((timerAcaptureValues[11])-(timerAcaptureValues[10]));
             __no_operation();          //在此处设置断点

         }

         中断;
       案例 TA1IV_TA1IFG:
         中断;
       默认值:
         中断;
     }


    我希望这有助于解决您的问题。

    此致

    Kostas

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

    应有的尊重:不同。 Link1示例(上面)使用 tassel=SMCLK 和 CCIS=CCI2A (信号引脚)、这是我提到的"直接"方法、我认为在390kHz 时不可行(在250kHz 时、我有点惊讶它成功)。

    我的建议是反转、tassel=TACLK、CCIS=CCI2B (ACLK)。 这会使用输入信号为计时器计时、并以固定(ACLK)间隔(更悠闲的节奏)收集计数。 算术略有不同、但并不复杂。

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

    Bruce、感谢您的澄清和 良好的投入。 我认为值得尝试一下。

    此致 Kostas

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

    您好 Kostas、

    您提供的代码不会进入 ISR 本身。

    感谢 Bruce 和 Kostas 的帮助

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

    Manish、您好!

    您是否已将输入信号连接到正确的引脚?

    P1.3

    此致

    Kostas

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

    Kostas、您好!

    但它没有进入 ISR。 因此、我放弃了这种方法并采用了一种新方法。 在该代码中、我现在使用 DCO、我想使用外部时钟8MHz 作为 SMCLK。 可以帮帮我吗? 我还需要使用计时器的分频器、任何人都能帮助我这么做。 我没有得到这方面的任何例子。 如果您有任何此类示例、请分享。

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

     Manish、

    很遗憾听到这个消息。 我在我的一侧重新测试了它的工作原理。

    最好找出不起作用的原因、但如果您不感兴趣或没有时间这样做、让我们关闭该线程。

    对于新请求、我建议打开一个新的线程、只是 将请求分开。

    谢谢

    此致

    Kostas

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

    您好 Kostas、

    我将重新检查该代码为什么不起作用。

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

    Kostas、您好!

    感谢您提供代码。