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.

msp430计数器从外部输入,能够允许最大频率是多少?

Other Parts Discussed in Thread: MSP430F149, MSP430F5419A

我是用来测量频率的,所以在计数器上连接一个高精度的温补晶振来作为标准,计算其他慢速信号的周期。

所以这个晶振的频率应该越高越好,那么计数器允许的最大输入频率是多少呢?是不是与单片机允许的最大时钟有关系呢(msp430F149为8M,G2553为16M,F5529为25M)?是不是不应该大于单片机允许的最大时钟呢?

另外做过实验:我在F5529上,MCLK用的是DCODIV(8M左右),SMCLK为25M(外接的晶振TX2),计数器timer1采用的是内部SMCLK(25M),被检测的6K外部信号连接到timer2上,测量过程没有任何问题,没有出现错误。这是不是说明计数器采用的信号与当时的MCLK没有必然关系?那么我计数器可不可以采用一个外部的信号大于25M?

  • 呵呵,那相当于超频那,不是很好,工作不稳定,另外,可以想象,单片机的最高工作频率25M那最小时间就是这个时钟的倒数,你再高的频率,单片机都处理不过来了,怎么行呢?所以说,测量的频率上限是和主频由直接关系的。

  • Jiang fei,

    你可以直接查看对应device的datasheet,其中有关timer的部分会直接给出。例如MSP430F5419A,为25MHz,如下图所示。

  • timer用来计频的最高频率由timer的位数决定,msp430的timer是16位的,计频计满为最大频率。

    一般计频都是设定一个时间间隔ms级来获取timer的counter值;所以计频的精度受时间间隔影响,也就是主频,使用外部晶振和内部晶振,高主频或者低主频,对计频精度都有影响。

  • 用timer计时时首先要选定timer的时钟,和分频设置、计数方式等。msp430的timer是16位的,计数1次的时间为  1 / 时钟频率。

    timer的时钟源最好选取外部的时钟源,DCO不太准确。计数器采用的信号与当时的MCLK是没有必然关系,但是设计的时候需要考虑中断等因素对系统运行速度的要求。如果MCLK太慢的话可能影响对timer计数的采集与计算,因为一般运算部分放在主程序中运行。

    外部晶振选择需要参考手册,不建议高于最大允许频率运行。

    另外对于慢速脉冲信号的周期计算,采用Timer的捕获方式更合理些,实现上更简单些。可参考430相关定时器捕获的例程

  • 感谢大家的回复

    这个确实应该查询数据手册,下面是F5529:

    timer的最大输入频率与该单片机的最大系统时钟相等。不过好像与单片机当时的F_system没有关系(图中,对比下面的USCI的描述可见)。至于系统时钟与采集精度的关系,感谢大家的提醒。中断的相应时间确实与当时系统的时钟有很大的关系。当然,65535次的timer_count才产生一次中断,只要不采用非常低的系统时钟,一般是可以处理过来的。

    wszqq朋友说的正确,确实应该采用捕获,避免中断相应延时现象的发生。

    现在看来是这样:timer使用较高(遵循手册上的限制)、较准确的外部时钟信号,系统时钟不是特别低的时候,不用太在意当时的系统时钟的快慢。尽量使用捕获方式,而不是其他途径来实现频率测定。

  • 用主频输入去捕获主频的频率,我不认为可以做到准确,C语言更难做到准确,这事CPU的工作特性决定了的,理论随可以输入同样高的频率,但不见得能捕获到。还要看处理速度。就像51单片,输入12M的频率,但是处理能力只有1M,测频率,主频还是要好好考虑的。

  • Shi JianHua,您好,谢谢您,不过我倒是这样理解的:

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

    msp430的timer捕获不是基于硬件的吗?也就是说,使用捕获功能的时候,当捕获引脚的电平边沿到来的时候,硬件会立即锁存timer的数值到捕获寄存器中,然后置位中断标志。锁存过程与当时的系统主频、当时程序运行到哪里没有任何关系,等到系统主程序响应到这个中断后,只需要读取捕获寄存器中的那个数值就行了。

    也就是说应当适当提高timer输入源的频率与精确程度,而与系统主频没有太大关系的吧(只需要在第二个捕获到来之前,处理完第一个捕获中断即可)?

    我可以使用timer输入时钟(在TACLK引脚上提供cmos电平的方波)25M,去捕获一个10K左右的被测信号(CCIA1捕获引脚)。而使用1M的主频去运行程序。这样应该是没有问题的吧。

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

    我这样理解对吗?您看一下。

  • 差不多就是这个意思。如果要捕获的信号频率快的话,频繁进入捕获中断,主频低的话影响系统运行。timer时钟太高的话,要充分考虑计数器溢出情况

  • wszqq,您好,是的,您说的对,timer时钟太高确实会造成timer溢出。

    过去我还曾遇到中断冲突的问题。不过过去不是采用捕获的方式。现在采用捕获的方式,仍然会出现这样的情况:

    为了提高采样的精度,经常是捕获N个沿信号,比如100个,计算被测信号100个周期的总时间。这样timer计数器肯定会发生多次溢出的情况,采用“continue”模式,timer溢出中断记录timer溢出中断的次数M。这样100个被测信号周期内的timer为:(65536-第一次捕获值) + (M - 1) *65536 + 最后一次捕获值。

    会出现这样的情况:如果捕获完成后,置位捕获中断,但是在响应这个捕获中断之前,timer中断也到来了,理论上两个中断同时置位的话,先响应优先级高的中断,这也是值得考虑的问题。

    wszqq 说:

    差不多就是这个意思。如果要捕获的信号频率快的话,频繁进入捕获中断,主频低的话影响系统运行。timer时钟太高的话,要充分考虑计数器溢出情况

  • 定时器溢出不要紧,开溢出中断进行计数就可以的。

    另外你提到的2个中断同时出现的情况概率非常低的。要想在处理某一中断的同时,再按照优先级响应后来中断,在430中就得用中断嵌套,但是430的中断嵌套个人感觉不是非常好用,呵呵。中断嵌套具体涉及的情况,由于有段时间不用了,记得不是非常清楚。