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.

[参考译文] MSP-EXP430FR6989:方波脉冲计数器

Guru**** 2587365 points
Other Parts Discussed in Thread: MSP-EXP430FR6989, MSP430FR6989

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/616924/msp-exp430fr6989-square-wave-pulse-counter

部件号:MSP-EXP430FR6989
主题中讨论的其他部件: MSP430FR6989

我正在尝试使用MSP-EXP430FR6989板对500 kHz方波信号的脉冲进行计数。 我试图将方波作为一个外部时钟源发送到1.4 ,1.0 它在下降的边缘捕获,并每100个脉冲增加变量“StoredCount”。 由于某种原因,由于StoredCount始终读数为0,因此不会计算脉冲数。  下面是我目前拥有的代码:

#include <MSP4S.h>


volatile unsigned int StoredCount =0;


内部主(无效)

WDTCTL = WDTPW | WDTHOLD;

P1DIR &=~BIT0;
P1SEL0 |= BIT4;

TA1CCR0 = 100;
TA1CCTL0 |= CCIE + CCIS_0 + CM_2 + CAP;
TA1CTL |= tassel_0;

_ BIS_SR (GIE);

同时(1)

TA1CTL |= MC1;
while (StoredCount !=100万);
TA1CTL &=~MC1;
StoredCount = 0;
TA1R = 0;
}

返回0;
}

#pragma vector = Timer1_A0_vector
__interrupt void Timer1_A0_ISR (void)

StoredCount++;
}

目前,我正在使用CCS云中的调试器监控StoredCount变量,StoredCount始终为0,无论我运行多久。  所有这一切都是一个更大的项目的一部分来建立一个频率,但是我只是在计算来自外部信号的脉冲时遇到了问题。  

如有任何帮助,我们将不胜感激。

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

    您好,Eli,

    我看到您从TA1CLK获取计时器:

    [报价用户="Eli Mueller"]TA1CTL |= tassel_0;

    这意味着您将为计时器提供外部数字时钟,并需要如下所示设置WFP 5.2 :

    我认为这不是你的意图,因此计时器从未实际计数。 您是否可以尝试从SMCLK获取计时器?

    我还注意到StoredCount是MSP430上的一个无符号int,它是16位。 16位无符号intergar的最大数字是6.5536万,我看到你们将它与100万进行比较。 该语句将始终返回false,因为在StroedCount达到100万之前将发生溢出。 我建议使用stdint.h并使用UINT32_t将其设置为32位整数

    此致,  

    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您更正StoredCount变量的大小。 但我仍然很难获得脉冲计数。 我想我不明白为计时器提供外部时钟的确切含义。 目前,我有一个函数发生器,它输出了大约0-5V的500 kHz方波,我想用启动板计算出1万个方波脉冲。 我想我可以把方波当作一个外部时钟源来做这件事(这就是为什么我有TA1CTL |= TASSEEL0),方法是将信号发送到WFP 1.4 中的Timer A1/Timer 1.0 ,然后让timerA捕获上升沿的每个脉冲。 把方波当作这样的外部时钟源是不是正确的? 如果是,计算方脉冲的最佳方法是什么。 我不一定要在一定的持续时间内进行计数,直到StoredCount变量达到某个值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Eli,

    您应用到WFP 1.4 的方波不是计时器的时钟源。 它是触发计时器捕获事件的信号。 计时器仍需要来自某个设备,以便它可以正确计数和运行。

    您正在通过1.4 在TA1CCTL0中设置CCIS_0位来选择WFP作为触发信号。 我建议通过设置TA1CTL |= tassel_2,将SMCLK设置为您的计时器来源;

    您还可以在 此处的示例msp430fr69xx_ta0_capture中找到使用TimerA确定方波频率的示例

    此致,

    Caleb Overbay

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

    我希望您对CCS,C语言和MSP430有一定的了解,否则我担心以下内容可能没有多大意义........

    进一步了解Caleb的好建议,假设您的最终目标是测量标称500kHz频率,以下是一些其他信息可供考虑:

    0-使用MSP计时器A绝对可以测量输入频率。由于TA0&1 CLK输入引脚在没有焊丝的情况下难以接近,因此在6989 LP上可能有点棘手。

    1-您的输入信号幅值(您提到0到5 V平方)必须低于MSP Vcc级别! 因此,0-3V更好。 否则会发生坏事情。

    2-代替WFP 5.2 / Function TA1CLK;考虑使用以下任一方法: WFP 1.1 / TA1CLK (LP上的按钮1)-或- WFP 1.2 TA0CLK (按钮2)。
    所有这些都可以在6989 LP用户指南(SLAU627A–2015年5月–2015年7月修订)的示意图第29页中找到。 图16. 表1/6. 左上角。 选择WFP 1.1 或1.2 ,然后分别将电线焊接到按钮1或2上。 (注- WFP 5.2 转至LCD段)

    3-然后使用PSEL刀头设置WFP 1.1 或1.2。 现在,您有一个ext clk可以增加TAR 0或1。

    这就是硬件。 对于软件,您必须决定要测量的内容以及如何测量。

    4 A -简单且非常好:清除TAR,等待门间隔时间,然后读取TAR。
    例如:如果您等待0.1 第二次,则TAR将是5万 Counts。
    提示:您的'wait'可以由另一个计时器生成。

    4 b - 精确的硬件测量:通过您的外部500kHz增量TAR,在内部使用ACLK边缘捕获TAR_value_1。 下一个ACLK边缘给出TAR_value_2。 您的频率=这两者的差异。

    提示:6989数据表,表6-10或6-11。 列'Device Input Signal"(设备输入信号)。 两个条目:TANCLK;ACLK (内部)。
    N表示TA0或TA1

    参考:
    -书籍-在线检查- MSP430微处理器基础John H. Davies -拥有MSP TA定时器示例非常好。
    -8.4 3频率测量:SMCLK与ACLK的比较(从312页开始)它使用SMLK,但ACLK可以在689中使用,如上面的4b中。


    4 c -周期测量。 这超出了范围,但您需要测量作为'捕获输入'连接的500kHz外部信号的两个连续上升边缘之间的SMCLK至TAR。
    这可能是Caleb所指的。
    通过在第一个500kHz边缘捕获(让更多边缘通过),然后在最后一个边缘捕获TAR来扩展这个想法。 累积的SMCLK为500kHz周期。 频率= 1 /周期。



    5 -还有其他可能性,你可能知道.....




    如果所有这些都令人困惑,请继续保持。 TA计时器(和表弟TB计时器)非常有用。

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

    感谢Otto和Caleb。 我想我现在理解了如何设置输入信号和计时器时钟。 我现在已经修复了我的密码,尝试按照卡列布的建议,从SMCLK采购并设置了1.4 1.0 ,以捕获输入方脉冲。 由于某种原因,变量StoredCount中仍没有得到任何计数。 我的代码如下:

    #include <MSP4S.h>

    volatile unsigned int StoredCount =0;


    内部主(无效)

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

    //设置引脚1.4 /1.0
    P1DIR &=~BIT0;
    P1SEL0 |= BIT4;

    PM5CTL0 &=~LOCKLPM2;

    TA1CCTL0 |= CCIE + CCIS_0 + CM_1 + CAP;//中断启用
    //从CCI0A捕获
    //捕获上升沿
    //捕获模式

    TA1CTL |= tassel_2;//来自SMCLK的源计时器A1

    _ BIS_SR (GIE);

    同时(1)

    TA1CTL |= MC1;//启动计时器
    while (StoredCount !=1000);
    TA1CTL &=~MC1;//停止计时器
    StoredCount = 0;//零StoredCount
    TA1R = 0;// Zero Timer_A1寄存器
    }

    返回0;
    }

    #pragma vector = Timer1_A0_vector
    __interrupt void Timer1_A0_ISR (void)

    StoredCount++;
    }

    我觉得我的问题在于如何使用PxSEL设置1.4。 如果我理解下面添加的文档,我想我想在WFP 1.4 上设置第三个外设功能。

    e2e.ti.com/.../Screen-Shot-2017_2D00_08_2D00_17-at-11.13.09-AM.pdf

    或者可能是我的启动计时器和停止计时器命令的问题,不知道在哪里,但我感觉我已经接近了。 现在,我有一个~50 Hz 0-3V的方波进入WFP 1.4 ,只是看看我是否可以得到WFP 1.4 的任何数据,但最后我想像我之前提到的那样,把脉冲数计算在500 kHz左右。

    谢谢

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

    我们想提供帮助,但现在我不确定您要测量的是什么;)
    也许Caleb明白了吗?

    不管怎样,前面提到的书籍参考对定时器A很重要。
    >>>>> 参考:
    -书籍-在线检查- MSP430微处理器基础John H. Davies -拥有MSP TA定时器示例非常好。
    -8.4 3频率测量:SMCLK与ACLK的比较(从312页开始)它使用SMLK,但ACLK可以在689中使用,如上面的4b中。 <<<


    除此之外,代码中还有一个I/O问题;第二个提示是:

    1----数据表 表6-18. 端口P1 (WFP 1.4 至WFP 1.7)引脚功能

    //设置引脚1.4 /1.0
    P1DIR &=~BIT0; 五,会议议程 您需要的是{\f2 1.4 },而不是这一个
    P1SEL0 |= BIT4; .........您需要同时设置两个psel 01 ......这将选择TA1.CCI0A

    现在,WFP 1.4 应该作为CC的输入。


    2----中断发生次数和矢量值:

    在CCS调试中,中断服务例程中的断点将确认INTS是否确实发生以及矢量值是什么。
    —然后根据所需值确认。参见FR68系列喷杆,表16-8。 TAxIV寄存器描述


    这就是我的看法!

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

    您好,Eli,

    看来您设置的是不正确的WFP 1.4。 您应该将P1DIR.x设置为0,P1SEL1.x设置为1,P1.SEL0.x设置为1:

    此致,  

    Caleb Overbay

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

    是的,问题在于我是如何设置WFP 1.4 的。 我的代码现在正在工作,我可以计算方脉冲数,非常感谢。 我只是在校准DCO频率设置时遇到问题。 当DCO设置为默认1MHz时,我只能计数高达~50kHz的脉冲。 所以我尝试将DCO频率设置为16MHz,但我不认为它被设置为16MHz。 与设置DCO相关的前几行如下:

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


    CSCTL0_H = CSOKEY >> 8;//解锁CS寄存器
    CSCTL1 || DCORSEL;//设置DCORSEL = 1
    CSCTL1 |= DCOFsel_4;//设置CDOFSEL =4
    CSCTL2 |=TELS__DCOCLK;//选择SMCLK = DCO
    CSCTL3 |= divs_0;//除以1
    CSCTL0_H = 0x00;//锁定CS模块(对高位字节使用字节模式)

    __DELAY周期(1000);//允许时钟系统稳定下来


    //设置引脚1.4 /1.0
    P1DIR &=~BIT4;
    P1SEL1 || BIT4;
    P1SEL0 |= BIT4;

    这些设置应根据文档正确:

    这些设置允许我对高达~150 kHz的方脉冲进行计数,但我希望能够对高达500kHz的方脉冲进行计数。 为了检查这些设置是否正确地将DCO频率设置为16MHz,我刚刚使用了TI样例代码 msp430fr69xx_ta0_capture.c,并从 我的代码复制和粘贴了相同的时钟系统控制(CSCTL)设置来设置DCO。 在此示例代码中,通过计算SMCLK上的DCO来捕获VLO时钟周期(~9.4kHz)。 当设置为默认值时,程序会对每个VLO捕获(9.4kHz * 111 ~1MHz)进行大约111 DCO计数,因此准确无误。 但是当我尝试使用代码中的CSCTL线将DCO设置为16MHz时,我发现程序会计算每个VLO捕获大约330个计数,因此DCO未设置为16MHz (9.4 * 330 ~ 3 MHz)。 有什么想法可以说明我可能做错了什么? 非常感谢您的帮助。  

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

    您好,Eli,  

    很高兴这里的事情对您来说是"有效的"。 您似乎已将DCO设置为以16MHz的速度运行SMCLK。 要再次检查其频率,您能否使用以下代码输出SMCLK并使用示波器观察其频率?

    P7DIR || BIT4;
    P7SEL0 || BIT4; //输出SMCLK
    P7SEL1 |= BIT4; 

    此致,  

    Caleb Overbay

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

    我添加了您建议的代码,然后测量了液晶屏附近的WFP 7.4 的频率。 下面是示波器输出图片,我的代码具有与我上一篇文章相同的设置:

    我对这些启动板很陌生,所以我真的不知道这些振荡是否应该发生,但它们看起来相当大。

    但是当我在我的代码中注释“CSCTL1 |= DCORSEL;”行时,无论 DCOFSEL设置为0或4,频率都将变为1MHz,这似乎是错误的(再次出现大振荡)。 下面显示了带有DCORSEL线注释和DCOFSEL设置为0的示波器图片。

    感谢Caleb的帮助

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

    您好,Eli,

    我没有注意到WFP 7.4 连接到MSP-EXPFR6989的液晶屏上,这可能会影响输出信号。 您是否可以尝试使用以下代码将MCLK输出到PIN 4.0 :

    P4DIR || BIT0;
    P4SEL0 || BIT0; //输出MCLK
    P4SEL1 |= BIT0; 

    在您的时钟设置中,MCLK的频率应与SMCLK相同。 这样,您就可以准确测量SMCLK频率,而不会受到LCD的干扰。  

    此致,  
    Caleb Overbay

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

    我使用了您发布的代码,并从WFP 4.0 中测量MCLK,结果也是一样。 当DCORSEL =0时,频率为1MHz;当DCORSEL =1时,频率为3MHz,无论DCOFSEL是0还是4。

    Eli

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

    问题是您在CSCTL1和CSCTL3寄存器上使用"|="。 如果您在用户指南中查看这些寄存器,您将看到它们在启动时设置为默认值。 要将这些值正确地更改为您尝试设置的值,您需要在更改之前清除您尝试设置的位,或者切换到使用“=”设置寄存器。

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

    好的,所以在 CSCTL1和CSCTL3寄存器上用"="替换"|="可以使DCO在DCOFSEL =4的情况下运行到5.3 MHz。 然后我设置DCOFSEL =6,它的最高频率为8 MHz。 所以我想知道为什么DCO不是以16 MHz运行。  从我刚才所说,似乎DCORSEL没有设置为1,我认为这是为了使DCO达到16 MHz。 但是,我进一步研究了msp430fr6989的DCO的校准,发现如果MCLK高于8MHz,则需要等待状态。 以下是链接

    我尝试按照该链接中的建议包括1个等待状态。 我刚刚使用 FRCTL0寄存器上的NWAITS在代码中添加了一行,如下代码所示:

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

    FRCTL0 = NWAITS_1;// 1等待状态

    CSCTL0_H = CSOKEY >> 8; //解锁CS寄存器
    CSCTL1 = DCORSEL; //设置DCORSEL = 1
    CSCTL1 = DCOFsel_4; //设置DCOFSEL = 4
    CSCTL2 |=TELS__DCOCLK; //选择SMCLK = DCO
    CSCTL3 = DIFS_1; //除以1
    CSCTL0_H = 0x00; //锁定CS模块(对高位字节使用字节模式)

    当我使用FRCTL0行运行代码时,我在示波器上看不到任何内容。 如何使DCO以16 MHz运行? 我几乎在那里。

    谢谢!

    Eli

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

    您好,Eli,

    您正在通过在CSCTL1寄存器上执行背对背的“=”操作来覆盖DCORSEL设置。 我建议在相同的说明中使用"CSCTL1 = DCORSEL | DCOFSEL_4:"设置它们

    另外,当MCLK设置为>8MHz时,您需要等待状态。 您可以在TI资源管理器中的计时示例中找到此示例。 这不是最初导致您出现问题的原因,但它可能 会在途中引起问题。您需要对等待状态进行的最显著的更改是包括FRDTL0寄存器的密码:“ FRCTL0 = FRCTLPW | NWITS_1;”

    此致,

    Caleb Overbay

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

    我的代码工作正常,现在可以计数高达700kHz的脉冲。 非常感谢