TI中文支持网
TI专业的中文技术问题搜集分享网站

利用msp430测脉宽,测得的值变化很大

用的是timera,p5.6的aclk输出   现在求10次平均值为226。  时钟为8m。误差还是蛮大,能差一两百

程序如下:

TACTL = TASSEL_2+TACLR+TAIE+MC_2+ID_0;//定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式1

CCTL1 = CM_1+SCS+CAP+CCIE;//输入上升沿捕获,CCI0A为捕获信号源//寄存器设置
#pragma vector=TIMERA1_VECTOR //定时器A中断处理
__interrupt void timer_a(void)
{
unsigned char s; switch(TAIV) //向量查询
{ case 2: //捕获中断
if(CCTL1&CM0) //上升沿
{ CCTL1=(CCTL1&(~CM0))|CM1; //更变设置为下降沿触发

start=TAR; //记录初始时间
overflow=0; //溢出计数变量复位
s=1;//上升沿不进行计算和显示
}
else if (CCTL1&CM1) //下降沿
{ CCTL1=(CCTL1&(~CM1))|CM0; //更变设置为上升沿触发
end=TAR; //用start,end,overflow计算脉冲宽度
s=2;//下降沿进行显示
} break;
case 10: //定时器溢出中断
overflow++;
break; //溢出计数加1
default:break;
}
if((end >start)&&(s==2))//上升沿不进行计算和显示,下降沿进行显示
{
LCD_WCMD(0x80);
LCD_WDAT((end-start)/100000%10+48);
LCD_WDAT((end-start)/10000%10+48);
LCD_WDAT((end-start)/1000%10+48);
LCD_WDAT((end-start)/100%10+48);
LCD_WDAT((end-start)/10%10+48);
LCD_WDAT((end-start)%10+48);
delay(1000);
end=start=0;
}

}

wszqq:

粗略的看了一下,有以下几个问题。最重要的是aclk输出的是方波否。一般32768无源晶振输出是正弦波。如果正弦波的话你测脉宽就不太稳定

1、overflow这个根本没有起到作用。作为本应用来讲也可以不判断溢出直接脉宽=(end+0xffff-start)%0xffff

2、中断里面进行显示程序,还有延时不合理。容易造成中断溢出

3、也没看出来你求平均值啊。

 

Hardy Hu:

你好!

能给大家说一下你需要测得信号频率和需要达到的精度吗?

这样才能给你更合理的建议,满足你的需求。

灰小子:

回复 wszqq:

谢谢回答。这是我一个朋友的程序问题。

赞(0)
未经允许不得转载:TI中文支持网 » 利用msp430测脉宽,测得的值变化很大
分享到: 更多 (0)