打印
[应用相关]

测量相位差

[复制链接]
840|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bbapple|  楼主 | 2017-5-4 22:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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得出相位差。但是经过测试发现这个程序在频率和占空比的测量上都没有问题,但测量相位差的时候就不能得出相位差。
沙发
handleMessage| | 2017-5-4 22:39 | 只看该作者
相位差还受频率的影响啊?

使用特权

评论回复
板凳
zhouhuanの| | 2017-5-4 22:43 | 只看该作者
找个能测两个方波相位差的程序试试。

使用特权

评论回复
地板
wanglaojii| | 2017-5-4 22:45 | 只看该作者
这个主要是用到timer的捕获计数功能的。

使用特权

评论回复
5
laozhongyi| | 2017-5-4 22:49 | 只看该作者
看看,楼主说的相位差的我暂时也不太明白。

使用特权

评论回复
6
Edisons| | 2017-5-4 22:53 | 只看该作者
频率和占空比可以测,不知道相位差是什么原理呢。。。

使用特权

评论回复
7
wahahaheihei| | 2017-5-4 22:58 | 只看该作者
这个是怎么个原理?

使用特权

评论回复
8
_gege| | 2017-5-4 23:00 | 只看该作者
对于相位差的测量,一般的测量对象是两个幅度相同,频率相同的正弦信号。

使用特权

评论回复
9
Mozarts| | 2017-5-4 23:01 | 只看该作者
相位差的测量可以采用多种方法吧。

使用特权

评论回复
10
Listate| | 2017-5-4 23:06 | 只看该作者
这个是怎么回事的?这个需要相关的算法支持的。

使用特权

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

本版积分规则

293

主题

1811

帖子

1

粉丝