单片机频率测量原理
+ time0_new);
time0_old = time0_new;
if (++freq_time >= 100)
{
freq_time = 0; // 100ms到,
freq_to_disbuff(); // 将100ms内的脉冲计数值送显示
freq = 0;
}
time_1ms_ok = 0;
}
};
}
程序中LED扫描形式函数desplay(),以及脉冲计数值转换成BCD码并送显示缓冲区函数freq_to_disbuff()比较简单,请读者自己分析。
在该程序中,使用了两个定时计数器。T/C0工作在计数器方式,对外部T0引脚输入的脉冲信号计数(下降沿触发)。T/C2工作在CTC方式,每隔1ms中断一次,该定时时间即作为LED的显示扫描,同时也是限定时间的基时。每一次T/C2的中断中,都首先记录下T/C0寄存器TCNT0当前的计数值,因此前后两次TCNT0的差值(time0_new – time0_old)或(256 - time0_old + time0_new)就是1ms时间内T0脚输入的脉冲个数。为了提高测量精度,程序对100个1ms的脉冲个数进行了累计(在变量freq中),即已知限定的时间为100ms。
读者还应该注意频率的连续测量与LED扫描、BCD码转换之间的协调问题。T/C2中断间隔为1ms,因此在1ms时间内,程序必须将脉冲个数进行的累计、BCD码转换和送入显示缓冲区,以及LED的扫描工作完成掉,否则就会影响到下一次中断到来后的处理。
在本实例的T/C2中断中,使用了display_ok标志,将LED扫描分配在奇数ms(1、3、5、7、……),而将1ms的TCNT0差值计算、累积和转换等处理放在主程序中完成。另外由于计算量大的BCD码转换是在偶数ms(100ms)处理,所以程序中LED的扫描处理和BCD码转换处理不会同时进行(不会在两次中断间隔的1ms内同时处理LED扫描和BCD码转换),这就保证了在下一次中断到达时,前一次的处理已经全部完成,使频率的连续测量不受影响。
该实例程序的性能和指标为(假定系统时钟没有误差 = 4MHz):
ü 频率测量绝对误差:±10Hz。由于限定的时间为100ms,而且T/C0的计数值有±1的误差,换算成频率为±10Hz。
ü 被测最高频率值:255KHz。由于T/C0的长度8位,所以在1ms中,TO输入的脉冲个数应小于255个,大于255后造成T/C0的自动清另,丢失脉冲个数。
ü 测量频度:10次/秒。限定的时间为100ms,连续测量,所以为10次/秒。
ü 使用资源:两个定时器,一个中断。
单片机频率测 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)