大连创客空间

 找回密码
 立即注册吧!

QQ登录

只需一步,快速开始

一键登录:

搜索
查看: 16667|回复: 111
收起左侧

【大赛原创经验贴】频率计,很多细节不明白的我都写了

  [复制链接]
发表于 2012-7-16 11:56:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多交流,硬件的世界向你敞开大门!

您需要 登录 才可以下载或查看,没有帐号?立即注册吧!

x
这两天在搞频率计的问题,开始的时候思路很清晰,但是实现起来比较麻烦。
想测量一个方波的频率,有两种方法,一个是测频率,就是定时1S然后计数方波的高电平个数。另一个是测周期法,就是测量方波的一个周期的时长,从而得到频率。
第一种方法很简单,下面讲讲我用的第二种方法。
思路是这样的,利用定时器的捕获功能,捕获方波的上升沿,将两次比较的值相减,就能得出两个上升沿之间定时器的计数值,然后处理一下计数值,就能得到正确的频率。

设置两个变量,一个是new_cap,一个是old_cap。捕获得到新的TAR数值赋给new_cap,再将上一次捕获的数值赋给old_cap,然后两值相减就能得到一个周期的计数值。(程序中将体现)

最开始写的时候,显示的频率不对,今天改动了一下。用定时器A1,然后比较TAIV的值再进行频率数值计算。再将显示函数放在主函数里面循环就对了。(昨天把显示函数放在中断里面了,不知道有啥关系不,知道的提示下,谢谢了)

程序贴出来供大家参考
//*****************************************************//
//*****P1.2为定时器A1的CCI1A输入端,信号从P1.2输入********//
//*****定时器时钟为SMCLK(DCO=1Mhz),不用分频*********//
//************ ————————————————*************//
//*****P1.0 ->|(比较器输入)                             |************//
//*****P1.1 ->|(LCDRS)                             P2.0|->D0*******//
//*****P1.2 ->|(定时器输入)<---                    ~ |  ~********//

//*****P1.3 ->|(LCDEN)            |                P2.7|->D7*****//
//*****P1.7 ->|(比较器输出)----                        |*********//
//***********|           msp30g2553                  |********//
//***********|     制作人:wusong                  |*******//
//*********************************************//
#include<msp430g2553.h>
#include<1602.h>

#define uchar unsigned char
#define uint unsigned int

uchar table[]={"frequency:"};
uchar table_num[]={"0123456789"};

uint new_cap,old_cap,cap_diff,fre;
void LCD_display()
{
  write_com(0x80);
  
  fre = 10000000/cap_diff;/////////////这个是将计数值转换为频率。1Mhz的频率,理应该是100000/cap_diff的,但是为了显示出小数,所以用的10000000
  int i;
  for(i=0;i<10;i++)
   write_data(table);
  write_data(table_num[fre/100%10]);
  write_data(table_num[fre/10%10]);
  write_data('.');
  write_data(table_num[fre%10]);
  write_data('H');
  write_data('z');
}

void main (void)
{
  WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
  old_cap=0;
  new_cap=0;
  cap_diff=0;
  
  if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)                                    
  {  
    while(1);                               // If calibration constants erased
                                            // do not load, trap CPU!!
  }
  
  BCSCTL1 = CALBC1_1MHZ;                // Set range
  DCOCTL= CALDCO_1MHZ;            
   // Set DCO step +modulation
  
///////端口功能设置//////  
  P2SEL&=0x00;//P2为I/O模式
  P2DIR|=0xff;//选择P2为输出端
  P1SEL=0x04;//P1.2为外部功能,就是定时器的输入
  P1DIR|=0x9a;//P1.0为比较器输入,P1.2为定时器输入,P1.1为rs(输出),P1.3为en(输出),P1.4为rw(输出),P1.7比较器输出
  
  ////////液晶初始化///////
  init();

  ///////比较器的设置//////
//  CACTL1 = CARSEL + CAREF0 + CAON; // 0.25 Vcc = -comp///////这里写了一个比较器,想让比较器输出方波然后让定时器测出频率,但是效果不好,有兴趣的可以
//  CACTL2 = P2CA0+CAF;                 // P1.1 = +comp///////////////调试下,我是没调通的
//  P1OUT|=0x00;
  //定时器的设置//
  CCTL1=CM_1+SCS+CAP+CCIE;//上升沿+CCI0A(P1.1输入)+同步捕获+捕获中断允许
  TACTL=TASSEL_2+MC_2+TACLR;//SMCLK时钟+连续计数模式
  
  //开总中断
  _BIS_SR(GIE);
  
  for(;;)
  {
//  if ((CAOUT&CACTL2)) //////////////这里如果加入比较器的函数,比较器的输出就有问题了,要测试频率计的话,把这里注释掉
//    P1OUT |= 0x80;//////////////////不知道是什么原因,知道的提示下,谢谢了
// CAOUT =1, 置位 P1.0
//    else P1OUT &=~0x80;   
// 否则复位
    LCD_display();

  }
}


#pragma vector=TIMER0_A1_VECTOR
__interrupt void timer_capture(void)
{
  if(TAIV == 2)
  {  
    new_cap=TAR;//这里用TAR或者CCR1都行。因为下面是两个值相减,所以周期是不会变的,不该要的部分都减掉了
      
    if(new_cap>old_cap)
        cap_diff=new_cap-old_cap-30;
      else
        cap_diff=65536-old_cap+new_cap-30;//这里要注意,因为有可能old_cap>new_cap。就是计时溢出的问题,特别注意这个
      old_cap=new_cap;
  }
}



1602.h是我写的一个头文件,我把程序放上来吧,程序上有问题的,希望各位帮忙改进下,共同学习,共同进步,呵呵~~~~
频率计.rar (25.1 KB, 下载次数: 551)
回复

使用道具 举报

 楼主| 发表于 2012-7-16 12:47:27 | 显示全部楼层
有不懂的地方跟帖,我会尽力解答
回复 支持 反对

使用道具 举报

发表于 2012-7-17 10:25:16 | 显示全部楼层
支持一下,最近也在搞频率计。
回复 支持 反对

使用道具 举报

发表于 2012-7-17 12:39:01 | 显示全部楼层
以前搞过,不过是用的51搞的
回复 支持 反对

使用道具 举报

发表于 2012-7-17 21:02:12 | 显示全部楼层
看看
回复 支持 反对

使用道具 举报

发表于 2012-7-18 08:30:31 | 显示全部楼层
本帖最后由 honghu 于 2015-4-5 09:17 编辑 <br /><br />只知道中断中不能有太多语句 一般都放在主程序里执行,在中断中查询。。。

回复 支持 反对

使用道具 举报

发表于 2012-7-18 09:15:11 | 显示全部楼层
好东西,要顶起来!
回复 支持 反对

使用道具 举报

发表于 2012-7-18 09:41:52 | 显示全部楼层
楼主啊  我把程序复制到TAR里面出现了这样一个错误(Fatal Error[Pe1696]: cannot open source file "1602.h" )  怎么样修改?急。。。

点评

1602.h是楼主自己写的驱动。。。你没有,肯定会错误的。。  详情 回复 发表于 2012-7-18 09:54
回复 支持 反对

使用道具 举报

发表于 2012-7-18 09:46:27 | 显示全部楼层
吴同学,我那个也搞出来了,辛苦啦
回复 支持 反对

使用道具 举报

发表于 2012-7-18 09:54:19 | 显示全部楼层

1602.h是楼主自己写的驱动。。。你没有,肯定会错误的。。

点评

那我要怎么样改啊  详情 回复 发表于 2012-7-18 10:54
那我要怎么样改啊  详情 回复 发表于 2012-7-18 10:53
回复 支持 反对

使用道具 举报

发表于 2012-7-18 10:00:50 | 显示全部楼层
请问下楼主。你这个频率计能显示的范围是?
回复 支持 反对

使用道具 举报

发表于 2012-7-18 10:46:27 | 显示全部楼层
楼主。可以告诉下,你的IO线是如何连接的吗??

点评

I/O连线,在程序的最上端都写明了,可以看看。  详情 回复 发表于 2012-7-18 17:32
回复 支持 反对

使用道具 举报

发表于 2012-7-18 10:53:14 | 显示全部楼层
just_soso 发表于 2012-7-18 09:54
1602.h是楼主自己写的驱动。。。你没有,肯定会错误的。。

那我要怎么样改啊
回复 支持 反对

使用道具 举报

发表于 2012-7-18 10:54:54 | 显示全部楼层
just_soso 发表于 2012-7-18 09:54
1602.h是楼主自己写的驱动。。。你没有,肯定会错误的。。

那我要怎么样改啊

点评

自己找一个1602的液晶驱动修改下。或者改用其它的方式显示  详情 回复 发表于 2012-7-18 11:05
回复 支持 反对

使用道具 举报

发表于 2012-7-18 11:05:13 | 显示全部楼层
阿毛2012 发表于 2012-7-18 10:54
那我要怎么样改啊

自己找一个1602的液晶驱动修改下。或者改用其它的方式显示
回复 支持 反对

使用道具 举报

发表于 2012-7-18 11:27:36 | 显示全部楼层
楼主。你的频率计我用来检测示波器的标准1K输出方波信号。。结果是1020左右。。有百分之二的误差??
回复 支持 反对

使用道具 举报

发表于 2012-7-18 17:15:43 | 显示全部楼层
那个 比较器输入 比较器输出 定时器输入 接什么?

点评

其实,当初我是把比较器的程序也写进去了,是想从比较器的输入端输入正弦波,然后通过比较器输出方波,再送入定时器来测量它的频率。但是把两个程序放在一起以后,发现,比较器的输出就有很大的问题,把比较器的程序  详情 回复 发表于 2012-7-18 17:35
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-18 17:31:52 | 显示全部楼层
昨天没上,出去吃饭了,不好意思,看到好多同学有问题。我说下,我这个是用的测周期法,只适用于低频信号。对于比较高频的信号,得用测频率法,就是计时1秒的时间,然后计数输入脉冲的个数。所以,如果输入的信号是1k,这个肯定是有误差的。当初我用这个方法做频率计,是为了我们要做一个东西,检测那个低频信号。感觉用430测频率,还是很方便的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-18 17:32:50 | 显示全部楼层
just_soso 发表于 2012-7-18 10:46
楼主。可以告诉下,你的IO线是如何连接的吗??

I/O连线,在程序的最上端都写明了,可以看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-18 17:35:33 | 显示全部楼层
用户不存在 发表于 2012-7-18 17:15
那个 比较器输入 比较器输出 定时器输入 接什么?

其实,当初我是把比较器的程序也写进去了,是想从比较器的输入端输入正弦波,然后通过比较器输出方波,再送入定时器来测量它的频率。但是把两个程序放在一起以后,发现,比较器的输出就有很大的问题,把比较器的程序删掉的话,就没问题了。现在我也没搞清楚是哪里的问题。后来,就把比较器的程序注释掉了,从P1.2输入方波测量其频率。
回复 支持 反对

使用道具 举报

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

本版积分规则

单片机开发者1群:235808606;会员QQ 6群:254085994; 1群:12835691(满); 2群:121061287(满); 3群:237320668(满);4群:249652919(满);5群:253578883(满);大赛1群:187926790(满),2群:231577758(满),3群:249652919(满)。 TI杯4群:58129202(满)。
载入中

QQ|手机版|小黑屋|Archiver|大连创客空间 ( 辽ICP备15004617号-2  

GMT+8, 2017-3-1 00:52 , Processed in 0.270775 second(s), 35 queries .

地址:辽宁省大连市高新园区火炬路7号17层 QQ:2401085253

Copyright © 2010-2015 创客空间(大连)科技有限公司 All Rights Reserved.

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