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