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/MSP430F2619:无法捕获高于20kHz 的频率

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/918068/ccs-msp430f2619-could-not-capture-higher-than-20khz

器件型号:MSP430F2619

工具/软件:Code Composer Studio

尊敬的团队

MSP-TS430PN80目标主板使用具有4M 外部晶体振荡器的 MSP430F2619芯片。 

定时器 TimerB 无法准确捕获超过20K 的频率。

请帮助

void SetupClock()
{
uint16_t tmpv;
BCSCTL1 &=~XT2OFF;
BCSCTL3 |= XT2S_2;
操作
{
IFG1 &=~OFIFG;
for (tmpv = 0xff;tmpv > 0;tmpv--);
}
while (((BCSCTL3 & XT2OF)=1);
BCSCTL2 |= SELM_2+SELS;
}

void Capture_Pos (void)//timer_B
{

TB0CTL |= TBSSEL_2 + ID_0 + MC_2 + TBCLR + TBIE;
TBCCTL0 = CM_1+CCIS_1+SCS+CAP+CCIE;
}

#pragma vector = TIMERB0_Vector
__INTERRUPT void Timer_B0 (void)
{
静态双精度 Pre_T_Frequency = 0;
IF (TBCCTL0和 CM0)
{
T_CaptureNum++;
if (T_CaptureNum =1)
{
T_CAP_COUNT_FIRST = TBCCR0;
}否则(T_CaptureNum >= 2)
{
T_CAP_COUNT_second = TBCCR0;
if (T_CAP_COUNT_second>T_CAP_COUNT_FIRST)
{
T_count_num = T_CAP_COUNT_second-T_CAP_COUNT_FIRST;
}否则{
T_COUNT_num= 0xFFF+T_CAP_COUNT_second-T_CAP_COUNT_FIRST;
}
T_Frequency =((float) 4000000)/T_count_num;
T_CaptureNum = 0;

IF (T_Frequency!= Pr_T_Frequency)
{
PRE_T_Frequency = T_Frequency;
}否则{
Close_T_capture ();
}

}

} 

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

    1) 1)晶体的速度是多少? 这决定了 SMCLK 的速度。

    2) 2)此 ISR 重磅重磅、并且可能在高信号频率下过度运行。 只需获取新的 CCR0、执行减法并将结果存储在全局变量中、然后返回。 让 main 执行算术的其余部分。 您可能会错过一些结果(阶跃响应)、但 ISR 不会错过任何捕捉。

    >新= TBCCR0;

    >结果=新建-上一个;

    >上一页=新;

    3) 3)如果您将 T_CAP_COUNT_FIRST/_second (和 T_COUNT_num)存储在 uint16_t (unsigned int)变量中、则可以将其减去、而无需担心换行。 无符号下溢将实现正确的操作。

    未经请求:

    >    while((BCSCTL3 & XT2OF) == 1);

    由于 XT2OF = 2、这个条件总是为 false。 我希望您的目标是:

    >    while((BCSCTL3 & XT2OF) == XT2OF);

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

    [引用用户="Bruce McKenney47378]1)晶体的速度是多少? 这决定了 SMCLK 的速度。[/quot]

    4MHz

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

    好的。 正如我在另一个线程中所说的、我认为80kHz 时钟频率为4MHz 是可行的、需要仔细编码。 您可能需要考虑使用 TBCLK 进行频率计数。 不要忘记留出一些 CPU 时间来实际执行结果。

    您应该确保晶体振荡器实际处于接合状态、因为故障复位环路可能会提前退出。 (我忘记了 F2在本例中的作用。)

    此外、我建议使用缩放整数算术、而不是浮点。 32位算术运算速度非常快、尤其是与浮点运算相比。

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

    您好 Susan、

    请告诉我们、如果您仍需要此方面的支持。 非常感谢。

    此致

    Peter