msp430 捕获的频率不准?求解~!

2019-03-24 12:23发布

我用TA的捕获比较器,捕获ALK,MCLK,SMCLK的频率大小,在测ACLK时,频率正确,MCLK,SMCLK时候就不准确。。有局限性吗?


#include<msp430x14x.h>
#define uint unsigned int
#define uchar unsigned char
  uint new_cap=0;
  uint old_cap=0;
  uint cap_diff=0;

  uint diff_array[16];
  uint capture_array[16];  //RAM中的数组用于存放数据
  uchar index=0;
  uchar count=0;
void main(void)
{
   volatile uint i;
  WDTCTL=WDTPW+WDTHOLD;
  BCSCTL1&=~XT2OFF;
  do
  {
    IFG1&=~OFIFG;
    for(i=0xff;i>0;i--);
  }
  while((IFG1&OFIFG));
  for(i=0;i<20000;i++);//延迟让晶振起振稳定
  BCSCTL2=SELS;//SMCLK 选择XT2
  P5DIR|=BIT4;
  P5SEL|=BIT4;
  //P5DIR|=BIT4+BIT5+BIT6;
  //P5SEL|=BIT4+BIT5+BIT6;
    //定义P5.4MCLK,P5.5SMCLK,P5.6ALCK
  P1DIR=BIT0;//P1.0输出,P1.1输入
  P1OUT&=~BIT0;//清除P1.0,复位
  P1SEL=BIT1;//P1.1 TA0特殊功能引脚
  CCTL0=CM_1+SCS+CCIS_0+CAP+CCIE;
//上升沿捕获+捕获模式的输入源为定时器A+同步捕获+捕获中断允许
TACTL=TASSEL_2+MC_2;//SMCLK为定时器A时钟源,连续计数模式
_BIS_SR(LPM0_bits+GIE);
}

#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0(void)
{
  volatile uint j;
  new_cap=TACCR0;
  cap_diff=new_cap-old_cap;
  diff_array[index]=cap_diff;
  capture_array[index++]=new_cap;
  if(index==16)
  {
    index=0;
    P1OUT^=BIT0;
    for(j=50000;j>0;j--);
  }
  old_cap=new_cap;
  count++;
  if(count==32)
  {
    count=0;
    _NOP();//这里设置断点
  }
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
Li_Lei
1楼-- · 2019-03-24 17:16
周期性的信号用计数方式比较好,cap_diff=new_cap-old_cap;这样的测量最小精度就是一个定时器时钟周期.
18780176718
2楼-- · 2019-03-24 20:49
 精彩回答 2  元偷偷看……
ifreeman
3楼-- · 2019-03-25 01:01
频率较低实时用捕获,高频直接将其作为计数器的时钟然后规定时间内读计数值
bobde163
4楼-- · 2019-03-25 05:18
做频率计能测出较低频率,那么在低频的时候,测量得到的值差得大吗?
wstt
5楼-- · 2019-03-25 10:37
 精彩回答 2  元偷偷看……
bobde163
6楼-- · 2019-03-25 13:09
这个确实是和CPU时钟相关的,时钟越快能测的频率就越高,主要是受到执行中断指令时间的影响

一周热门 更多>

相关问题

    相关文章