- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单片机频率测量原理
单片机频率测量原理
AVR单片机 ??2008-10-09 19:29 ??阅读721???评论0 ?
字号: 大大? 中中? 小小
?
单片机应用系统中,经常要对一个连续的脉冲波频率进行测量。在实际应用中,对于转速,位移、速度、流量等物理量的测量,一般也是由传感器转换成脉冲电信号,采用测量频率的手段实现。
使用单片机测量频率或周期,通常是利用单片机的定时计数器来完成的,测量的基本方法和原理有两种:
测频法:在限定的时间内(如1秒钟)检测脉冲的个数。
测周法:测试限定的脉冲个数之间的时间。
这两种方法尽管原理是相同的,但在实际使用时,需要根据待测频率的范围、系统的时钟周期、计数器的长度、以及所要求的测量精度等因素进行全面和具体的考虑,寻找和设计出适合具体要求的测量方法。
在具体频率的测量中,需要考虑和注意的因素有以下几点。
ü???????? 系统的时钟。首先测量频率的系统时钟本身精度要高,因为不管是限定测量时间还是测量限定脉冲个数的周期,其基本的时间基准是系统本身时钟产生的。其次是系统时钟的频率值,因为系统时钟频率越高,能够实现频率测量的精度也越高。因此使用AVR测量频率时,建议使用由外部晶体组成的系统的振荡电路,不使用其内部的RC振荡源,同时尽量使用频率比较高的系统时钟。
ü???????? 所使用定时计数器的位数。测量频率要使用定时计数器,定时计数器的位数越长,可以产生的限定时间越长,或在限定时间里记录的脉冲个数越多,因此也提高了频率测量的精度。所以对频率测量精度有一定要求时,尽量采用16位的定时计数器。
ü???????? 被测频率的范围。频率测量需要根据被测频率的范围选择测量的方式。当被测频率的范围比较低时,最好采用测周期的方法测量频率。而被测频率比较高时,使用测频法比较合适。需要注意的是,被测频率的最高值一般不能超过测频MCU系统时钟频率的1/2,因为当被测频率高于MCU时钟1/2后,MCU往往不能正确检测被测脉冲的电平变化了。
除了以上三个因素外,还要考虑频率测量的频度(每秒内测量的次数),如何与系统中其它任务处理之间的协调工作等。频率测量精度要求高时,还应该考虑其它中断以及中断响应时间的影响,甚至需要在软件中考虑采用多次测量取平均的算法等。
?
?
采用测频法的频率计设计与实现
1)??? 硬件电路
?
硬件电路的显示部分,PA口为8个LED数码管的段输出,PC口控制8个LED数码管的位扫描。使用T/C0对被测信号输入的脉冲个数进行计数,被测频率信号由PB0(T0)输入。
2)??? 软件设计
我们首先给出系统程序,然后做必要的说明。
/*********************************************
File name?????????? : demo_11_1.c
Chip type?????????? : ATmega16
Program type??????? : Application
Clock frequency???? : 4.000000 MHz
Memory model??????? : Small
External SRAM size? : 0
Data Stack size???? : 256
*********************************************/
?
#include mega16.h
flash char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
flash char position[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
?
char??? dis_buff[8];??????????????????? // 显示缓冲区,存放要显示的8个字符的段码值
char??? posit;
bit time_1ms_ok,display_ok=0;
char??? time0_old,time0_new,freq_time;
unsigned int ?? freq;
?
void display(void)????????????????? // 8位LED数码管动态扫描函数
{
??? ??? PORTC = 0xff;
??? ??? PORTA = led_7[dis_buff[posit]];
??? ??? if (posit==5) PORTA = PORTA | 0x80;
??? ??? PORTC = position[posit];
??? ??? if (++posit =8 ) posit = 0;
}
?
// Timer 2 output compare
文档评论(0)