另外,在一个项目中设计捕获信号的频率,想法就是捕获相邻两个脉冲的下降沿,计算出频率,加上while语句是为了防止执行其他程序时有漏掉一个或几个脉冲的情况,但是现在的问题就是如果正好在捕获两个脉冲中间,信号消失,就在陷入wihle中出不来,请问有什么好方法测这个频率么! if((CCIFG&TACCTL1)) // Wait for first signal from photodiode
{
for(i=0;i<Num_of_result;i++)
{
testloop=0;
while(!(CCIFG&TACCTL1));// Exit after capture 8 times
frequencyWidth[index]=CCR1;
index=(index+1)%Num_of_result;
if((TAIFG&TACTL))
{
overflow++;
TACTL &=~ TAIFG;
}
TACCTL1 &=~ CCIFG;
}
_NOP();
}
此帖出自
小平头技术问答
在 捕获脉冲的中断里才打开定时器,然后下一次进来,再计一个 静态变量定时器。
这样,每次来每次计数,而定时器一直开着,直到第N次,你才把两个中断都关掉,然后计算定时值,这种精确程度很高,我试过。
等,我上一段代码。
UINT test(void)
{
//设置计数器1初值
TH1 = COUNT_HIGH;
TL1 = COUNT_LOW;
//设置定时器0初值
TL0 = 0;
TH0 = 0;
//开计数器1,开始计数
TR1 = 1;
//立即启动定时器0,开始定时
TR0 = 1;
//等待计数器溢出
while(TF1 == 0);
//关闭定时器0,再关闭计数器1
TR0 = 0;
TR1 = 0;
//软件清溢出标志位
TF1 = 0;
TF0 = 0;
return (256 * TH0 + TL0);
}
我这里没使用定时中断——因为我测的频率比较高,几百K,我也没打算定时器会溢出,更没打算让它没事去定时中断里跑几圈,影响精度。
同理,我也没开启 计数器中断。
这里我牺牲了主程序的流畅度,去换取最大可能的精度——当然,这是我对测量面对的频率有把握,几百K,就是一次测100个,也就10来个毫秒,对于人的反应来说,这个已经是等于没差别了。
一周热门 更多>