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.

[参考译文] MSP430F2272:定时器 B 捕捉提供的测量值比实际测量值短

Guru**** 2502205 points
Other Parts Discussed in Thread: MSP430F2272

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/783220/msp430f2272-timer-b-capture-giving-shorter-measures-than-the-real-ones

器件型号:MSP430F2272

大家好。

我正在使用:

CCS V8
MSP430F2272
DSO-x 2024A Agilent 振荡器

尝试使用 Timer B 捕获模式来测量脉冲之间的时间间隔

我的方波源为50KHz、我的 Timer_b 时钟为1MHz (MCLK = 8MHz、SMCLK = 8MHz、ACLK = 1MHz)(代码如下)

P2DIR |= 0x08;
P2SEL |= 0x08;
TACTL =(tassel_1 | MC_1 | ID_1);
TACCR0 = 0x09;
TACCR1 = 0x05;
TACCTL1 = OUTMOD_6; 

来源是最好的... 50.001 KHz

P4DIR &=~0x04;
P4SEL |= 0x04;
TBCTL =(CNTL_0 | TBSSEL_1 | MC_2 | TBIE);
TBCCTL2 =(CM_1 | CAP | CCIS_0 | CCIE | SCS); 

若要推测事件之间经过的秒数、请使用以下公式:

(超过* 65565 + Event_1 - Event_0)* 0.000001  

其中:
over -定时器 B 溢出的次数(TBR 计数0的次数)
65565 - TBR 的大小、由 CNTL_0位定义
EVENT_1 -第二个事件发生时 TBR 的值
EVENT_0 -第一个事件发生时 TBR 的值

下面显示了我的 ISR:

_interrupt void Timer_B1 (void)
{
switch (__even_in_range (tBIV、14))
{
情况0:中断; //无中断
案例2:中断; // CCR1未使用
案例4:
TB_Pulse0 = TB_Pulse1;
TB_Pulse1 = TBCCR2;
TBCCTL2 &=~CCIFG;
if (TB_Pulse0){
TBCTL = 0;
SendXBee |= true;
}
中断;
案例6:中断; //未使用 CCR3
案例8:中断; // CCR4未使用
案例10:中断; //未使用 CCR5
案例12:中断; // CCR6未使用
案例14:
TBCCTL0 &=~COV;
if (TB_Pulse1)
OverFlo++; //溢出
中断;
默认值:break;
}
} 

您可以从上面的代码中了解到、我只会在捕获到第一个事件后对计时器溢出进行计数。 当我捕获到第二个事件时、计时器 b 关闭、我将通过 UART 发送数据。

我在 main 内部发送数据的例程只需检查'endXBee'、通过 XBee 无线电发送所有数据、然后重置'OVER (过)'、'Event_1'和'Event_0'变量。  

即使该代码看起来还不错(至少对我来说是这样) 不管用! 在另一个无线电上读取的值使我可以测量实际信号周期的1/10。

有什么建议???  (耶!! 停止 使用嵌入式电子产品.... 开个玩笑而已)

谢谢大家。

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

    如果您的测量值比预期的短、则可能意味着您的时钟速度与预期的速度不同或被分成了某个位置。

    我建议将您的时钟输出到 MSP430的 GPIO 上、并使用您的示波器测量它们、以确认它们符合您的预期。

    谢谢、
    JD
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > 65565 - TBR 的大小、由 CNTL_0位定义
    此处的操作值为65536 (0x10000)。

    只有当 OverFlo > 0时、这一点才重要、这种情况极少(类似于测量值的0.03%)。 如果您的所有测量值都太小、您可能应该检查您的算术。 您应该预计采集之间的差异约为20。

    主动:您(最终)的目标输入频率是多少? 如果大于16Hz,则根本不需要 OverFlo。 只需减去两个时间戳、无符号算术就会执行正确的操作、结果以微秒为单位。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    JD、

    我考虑过这个。 然后、我将信号源从示波器波形发生器更改为计时器 A PWM、后者具有与计时器 B 相同的时钟源  

    但是、我的代码可能还不错、我在其他方面犯了错误。

    感谢你的帮助。

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

    这些测试用于确定我的系统(代码+微控制器)可以测量的最大频率、而不会产生损耗、因为我必须开发 FDR (频域反射法)电路、并且、由于频率越高、我得到的电导率损耗就越小(感应信号的实际部分)。 但是、如果频率为100MHz、则执行第一个测试;如果是断点、则检查测量值。 当它出错时、我决定使用序列检查值、而不是使代码执行混乱。

    我完全同意您的观点、即频率应低至过压不同于0。 但是、如果公式正确、那么低频和高频的公式将是正确的。

    总之、感谢您的深入见解。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据您的描述,您对高频(当然大于16Hz)感兴趣。 在这种情况下、我建议不要尝试计数溢出、因为(1)这是不必要的[见上文]、(2)这是危险的。 如果 CCTL:CCIFG 和 CTL:TAIFG 密切相关(您感兴趣的情况)、IV 将首先呈现 CCIFG、因此您不会看到 TAIFG、结果将(远)错误。 解决这场比赛很困难。

    在50kHz 时、您可能接近使用捕获测量频率的最大速度。 高于该最大值(无论它恰好位于何处)、您应该考虑通过将信号馈送到 TBCLK 来进行频率计数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    找到解决方法!!

    在我的 ISR 内部、我只需禁用中断请求、而不是禁用整个 计时器。

    因此、代码变为:

    _interrupt void Timer_B1 (void)
    {
    switch (__even_in_range (tBIV、14))
    {
    情况0:中断; //无中断
    案例2:中断; // CCR1未使用
    案例4:
    TB_Pulse0 = TB_Pulse1;
    TB_Pulse1 = TBCCR2;
    TBCCTL2 &=~CCIFG;
    if (TB_Pulse0){
    TBCCTL2 &=~CCIE; //TBCTL = 0; 
    SendXBee |= true;
    }
    中断;
    案例6:中断; //未使用 CCR3
    案例8:中断; // CCR4未使用
    案例10:中断; //未使用 CCR5
    案例12:中断; // CCR6未使用
    案例14:
    TBCCTL0 &=~COV;
    if (TB_Pulse1)
    OverFlo++; //溢出
    中断;
    默认值:break;
    }
    } 

    谢谢 、Bruce 和 JD。

    PS.:我编写了"权变措施" 、因为我不知道为什么在禁用/重新启用整个计时器时它不起作用。 如果有人能给我一个提示、我会很感激。