OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8442|回复: 7

关于msp430 测量频率的问题

[复制链接]

2

主题

8

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-8-8
在线时间
0 小时
发表于 2013-8-27 19:12:17 | 显示全部楼层 |阅读模式
以前用51做频率计是一般都是用计数法,就是一秒内计上升沿或者下降沿的个数,个人觉得这样不但误差小而且简单,为什么到了430,一查频率计都是用的测频法,就是测一个脉冲的时间X2得到周期,再取倒得到频率,这是为什么啊,是有什么其他的原因吗?
求解。
另外我如果用计数法,用timerA做一个1秒的计时,然后用P1口的外部中断来记录下降沿的次数,如果我测频率的范围是10K到300K,那可定就要用到外部高速时钟了,那么请问我是TIMERA用ACLK, MCLK用外部时钟这样可以吗,P1口的外部中断可以承受那么高的频率吗,是不是主系统时钟选了8M的外部时钟,那么执行指令的时间就是1/8M啊,
口才不好,还请见谅
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2013-8-27 19:20:59 | 显示全部楼层
只能说各有各的方法吧,呵呵。猫论。
其他的问题MSP430不熟,帮顶了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-8-8
在线时间
0 小时
 楼主| 发表于 2013-8-27 20:25:16 | 显示全部楼层
站长来顶,荣幸荣幸啊
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-8-28 00:51:25 | 显示全部楼层
对于第一个问题,为什么测脉冲,可以这样理解,相对于只测半个周期,如果你测一个周期的时间,更容易导致定时器溢出,则测量的范围相对较窄。个人理解,呵呵。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-8-8
在线时间
0 小时
 楼主| 发表于 2013-8-28 01:45:41 | 显示全部楼层
回复【4楼】xiaoyan:
---------------------------------
版主V5,多多关照哈,
因为我测频率范围在10K~300K所以觉得用测脉冲的方法的话会不会误差太大,我用计数法做出来精度还可以,就是最高频率只能测到32K左右不知道为什么,郁闷啊    下面是程序

#include<msp430.h>

#define uchar unsigned char
#define uint unsigned int 
#include"Cry12864.h"
unsigned long int count,data;
uchar TimerA;
uchar fy[7];
void TimerA_Init(void)
{
  TACTL = TASSEL_1 + ID0 + TACLR ; //ACLK=32768Hz ,清除tar ,2分频
  CCTL0 = CCIE; //
  CCR0 = 819;   // (1/32768)*819 =20 ms ??
  TACTL |= MC0; //增计数   
}
void InitSys() 

   unsigned int i; 
 //--- 使用XT2振荡器 --- 
   BCSCTL1&=~XT2OFF; //==打开XT2振荡器== 
   do 
   { 
   IFG1 &= ~OFIFG; //==清除振荡器失效标志== 
   for (i = 0xFF; i > 0; i--); //==延时,等待XT2起振== 
  } 
  while ((IFG1 & OFIFG) != 0); //==判断XT2是否起振== 
  BCSCTL2 =SELM_2+SELS; //==选择MCLK、SMCLK为XT2,8M==  
}
void Disply(uint data)
{
  
    fy[6]=data/1000000;
    fy[5]=data/100000%10;//(frequency-1000000*fy[6])/100000;
    fy[4]=data/10000%10;//(frequency-1000000*fy[6]-100000*fy[5])/10000;
    fy[3]=data/1000%10;//(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4])/1000;
    fy[2]=data/100%10;//(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4]-1000*fy[3])/100;
    fy[1]=data/10%10;//(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4]-1000*fy[3]-100*fy[2])/10;
    fy[0]=data%10;
   
      Write_Cmd(0x98);//==写地址==
      Write_Data(0x30+fy[6]);
      Write_Data(0x30+fy[5]);
      Write_Data(0x30+fy[4]);
      Write_Data(0x30+fy[3]);
      Write_Data(0x30+fy[2]);
      Write_Data(0x30+fy[1]);
      Write_Data(0x30+fy[0]);
}
void main( void )

   WDTCTL = WDTPW+WDTHOLD; 
   1IE |= BIT1;//使能
   1IES |= BIT1;//下降沿触发
   1IFG = 0X00;//清空中断标志(必须软件清除)
   InitSys();//                                           这两个函数我是想让TA时钟用aclk MCLK用外部8M的外部时钟,我试了一下好像是开不开外部时钟都没                                      有什么影响,因外我把InitSys()屏蔽掉以后对测量结果没什么影响,是因为外部中断的频率有限制吗?而且就只能最高到32K是跟ACLK有什么联系吗?
   TimerA_Init();
   Ini_Lcd();
  
   _EINT();//开启全局中断 
   //uchar key = 0;
   Lcd12864PutData(0,0,'d');

  while(1)
   {
    // Display(fr);
     
    fy[6]=data/1000000;
    fy[5]=data/100000%10;//(frequency-1000000*fy[6])/100000;
    fy[4]=data/10000%10;//(frequency-1000000*fy[6]-100000*fy[5])/10000;
    fy[3]=data/1000%10;//(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4])/1000;
    fy[2]=data/100%10;//(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4]-1000*fy[3])/100;
    fy[1]=data/10%10;//(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4]-1000*fy[3]-100*fy[2])/10;
    fy[0]=data%10;
   
      Write_Cmd(0x98);//==写地址==
      Write_Data(0x30+fy[6]);
      Write_Data(0x30+fy[5]);
      Write_Data(0x30+fy[4]);
      Write_Data(0x30+fy[3]);
      Write_Data(0x30+fy[2]);
      Write_Data(0x30+fy[1]);
      Write_Data(0x30+fy[0]);

     
   }
  
   
}
#pragma vector = TIMERA0_VECTOR
__interrupt void TimerA0_ISR()

  TimerA--;
  if(TimerA==0)
  {
    TimerA=20;
    1IE &= ~BIT1;//关闭使能
   // 2IFG = 0XFF;
    data=count;
    count = 0;
   // Display(data);                                           还有这个函数我把它写在这就会报错  不知道为啥子??????
    1IE |= BIT1;//使能
   // 1IFG = 0X00;
  }

}
#pragma vector = ORT1_VECTOR
__interrupt void 1_interrupt(void)

  count++;
  1IFG = 0X00;//清空中断标志(必须软件清除)
}

水平有限 程序写的烂  见笑了
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-8-28 12:36:38 | 显示全部楼层
如果不配置MCLK,默认的MCLK是多少?
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-8-8
在线时间
0 小时
 楼主| 发表于 2013-8-28 20:54:38 | 显示全部楼层
回复【6楼】xiaoyan:
---------------------------------
内部800K的DCO
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-8-28 23:16:16 | 显示全部楼层
回复【7楼】磁通量:
---------------------------------
MCLK配置8M的外部时钟没成功吧
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 13:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表