打印

关于430测试频率,相位差,占空比的程序。

[复制链接]
3480|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
menzhulaok|  楼主 | 2013-8-22 22:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/***********************************
   捕获方波信号,算出频率,占空比
**********************************/
#include  <msp430x14x.h>
#include  "1602.c"

#define uint unsigned int
#define uchar unsigned char

uint start=0,start1=0;
uint end=0;
uint tem=0;
uint temp=0,overflow=0;

void Init_CLK(void)
{
volatile unsigned int index;
BCSCTL1&=~0X00; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (index = 0xFF; index > 0; index--);// 延时,等待XT2起振
} while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振
BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2 SMCLK 8分频
}

void chuli(uint a,uint b,uint c)
{

  unsigned long int  ff=0,zg=0,xw=0;
  uint j,i,k;
  uint ptr[5],ptr2[4],ptr3[4];
  ff=8000000*1.0/a;
  zg=(b*1000.0)/a;
  xw=(c*360.0)/a;
以下省略显示程序。。。。。。。。。。。。。。。。
}
/************************主函数****************************/
void main(void)
{
  uint e,f,g;
  WDTCTL = WDTPW+WDTHOLD;                   //关闭看门狗

/*下面六行程序关闭所有的IO口*/
  P1DIR = 0XFF;P1OUT = 0XFF;
  P2DIR = 0XFF;P2OUT = 0XFF;
  P3DIR = 0XFF;P3OUT = 0XFF;
  P4DIR = 0XFF;P4OUT = 0XFF;
  P5DIR = 0XFF;P5OUT = 0XFF;
  P6DIR = 0XFF;P6OUT = 0XFF;
  Init_CLK();
  LCD_init();                               //复位1602液晶

  P1SEL |= BIT2;                             //设置P1.2端口为功能模块使用
  P1DIR &=~BIT2;
  P1SEL |= BIT3;                             //设置P1.3端口为功能模块使用
  P1DIR &=~BIT3;
  TACTL |=TACLR;
  TACTL = TASSEL_2+TAIE+MC_2;          //定时器A时钟信号选择SMCLK 8M,清计数寄存器,使能中断,同时设置定时器A计数模式为连续增计模式
  TACCTL1 =CM_1+SCS+CAP+CCIE+CCIS_0;                //输入上升沿捕获,同步,capture模式 CCI1A为捕获信号源(P1^2),中断使能                                 
  TACCTL2 =CM_1+SCS+CAP+CCIE+CCIS_0;                //CCI2A为TA1的捕获信号源(P1.3)

while(1)
{
   e=overflow*65535+temp-start;
   f=overflow*65535+end-start;
   g=overflow*65535+start1-start;
   chuli(e,f,g);
   _EINT();
   LPM0;
}        
}

#pragma vector=TIMERA1_VECTOR              //定时器A中断处理
__interrupt void timer_a(void)
{

switch(TAIV)                              //向量查询
  { case 2:                                //捕获中断
       if(CCTL1&CM_1)                      //上升沿
         {
           tem++;
           if(tem==1)
           {
             CCTL1=(CCTL1&(~CM_1))|CM_2;       //更变设置为下降沿触发
             start=TACCR1;                      //记录A波初始时间(捕捉产生start)
             overflow=0;                     //溢出计数变量复位
           }
           else if(tem==2)
           {
             tem=0;
             temp=TACCR1;
             _DINT();
            LPM0_EXIT;
           }
         }
       else if(CCTL1&CM_2)                 //下降沿
        {  
         CCTL1=(CCTL1&(~CM_2))|CM_1;       //更变设置为上升沿触发           
         end=TACCR1;                        //用start,end,overflow计算脉冲宽度         
        }   
       break;
  case 4:
           if(CCTL2&CM_1)                      //上升沿
           {
             start1=TACCR2;                      //记录b波初始时间(捕捉产生start1)
             overflow=0;                     //溢出计数变量复位
           }
    break;
    case 10:                               //定时器溢出中断
       overflow++;
       break;                              //溢出计数加1
    default:break;
  }   
}
我用TIMERA1和TIMERA2测试两个波的上升沿并记下时间分别是start,start1。start为TIMERA1产生,start1为TIMERA2产生,将他们的差除以周期*360得出相位差。但是经过测试发现这个程序在频率和占空比的测量上都没有问题,但测量相位差的时候就不能得出相位差。相位差还受频率的影响“1000hz时相位差显示(55到414),2000hz为(110到469),3000hz为(170到529)。有没有精通430的前辈能够指点一下程序到底哪儿出了问题,或者给我一个能测两个方波相位差的程序。



相关帖子

沙发
angerbird| | 2013-8-22 22:57 | 只看该作者
这个主要是用到timer的捕获计数功能的,至于楼主说的相位差的我暂时也不太明白的

使用特权

评论回复
板凳
dirtwillfly| | 2013-8-23 18:57 | 只看该作者
没看明白楼主的相位差
相位差一般的测量方法:http://wenku.baidu.com/view/46192dc9da38376baf1fae7a.html

使用特权

评论回复
地板
pmp| | 2013-8-23 20:19 | 只看该作者
频率和占空比可以测,不知道相位差是什么原理呢

使用特权

评论回复
5
pmp| | 2013-8-23 20:19 | 只看该作者
网上的一种方法:
对于相位差的测量,一般的测量对象是两个幅度相同,频率相同的正弦信号。相位差的测量可以采用多种方法。一、将两个信号用模拟乘法器做乘法运算,得到的信号通过低通滤波器,将直流量分离出来,直流电压的大小反映了两个信号的相位差。二、采用两个比较器对信号进行过零比较,然后测量出两个上升沿之间的时间间隔,用时间间隔除以周期再乘以360就可以得到相位差。一般高精度的相位差测量都是用第二种方法。还有一种就是定性地观察,将两个信号接到双踪示波器的输入,得到李萨如图形,通过图形的形状可以判断相位差大概是是什么程度。

使用特权

评论回复
6
menzhulaok|  楼主 | 2013-8-27 16:02 | 只看该作者
dirtwillfly 发表于 2013-8-23 18:57
没看明白楼主的相位差
相位差一般的测量方法:http://wenku.baidu.com/view/46192dc9da38376baf1fa ...

我用的就是5楼说的第二种解决方法,将正弦波通过过零比较得到方波,然后通过检测两个方波上升沿时差除以周期*360得到相位差,上边的程序就是这个意思。TA1,TA2检测上升沿,但是现在进入中断有点问题,不知道为什么?

使用特权

评论回复
7
menzhulaok|  楼主 | 2013-8-27 16:03 | 只看该作者
pmp 发表于 2013-8-23 20:19
网上的一种方法:
对于相位差的测量,一般的测量对象是两个幅度相同,频率相同的正弦信号。相位差的测量可 ...

我用的是方法二,但是捕获上有问题,不知道程序问题出在哪儿了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

16

帖子

1

粉丝