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

2019-08-06 16:54发布

/***********************************
   捕获方波信号,算出频率,占空比
**********************************/
#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的前辈能够指点一下程序到底哪儿出了问题,或者给我一个能测两个方波相位差的程序。



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
menzhulaok
2019-08-07 07:05
pmp 发表于 2013-8-23 20:19
网上的一种方法:
对于相位差的测量,一般的测量对象是两个幅度相同,频率相同的正弦信号。相位差的测量可 ...

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

一周热门 更多>