《测频法和测周法转速测量的课程设计报告.pdf》由会员分享,可在线阅读,更多相关《测频法和测周法转速测量的课程设计报告.pdf(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、一、任务要求 1性能要求:测量范围:55000rpm;2功能要求:采用 MCS51 系列单片机完成测量,并将测量值显示于数码管上。分别采用测频法和测周法进行设计,并比拟不同速度段的测量精度。二、方案论证 系统组成:图 1-1 系统组成框图 如图 1-1 所示,本次设计的系统主要由以下几个局部组成,即:传感器、单片机以及显示局部组成。各个局部的方案论证如下:2.1 传感器的选择 目前,可用于测速的传感器有很多,例如:光电传感器,开关型霍尔传感器,电涡流传感器以及光电编码器等。方案一:采用光电传感器 光电传感器是通过光电二极管和光敏三极管把光输入信号转化为磁输入信号的器件。光电传感器的优点是响应速
2、度快、测量精度高,能够直接输出上下电平,缺点是容易受外来光线、灰尘等的影响,即对周围环境的要求比拟高。方案二:采用开关型霍尔传感器 开关型霍尔传感器是利用霍尔效应把磁输入信号转换成电信号的器件。开关型霍尔的优点是能够直接输出上下电平,属于大信号传感器,对外部的信号调理电路要求不高,缺点是响应速度不如光电传感器。方案三:采用电涡流传感器 电涡流传感器是利用电涡流效应来工作的传感器,具有长期工作稳定性好,抗干扰能力强,但是输出信号比拟弱,后续处理电路比拟复杂,且一般价格比拟高。在灰尘和粉尘较少而要求频率响应范围比拟宽的情况下,可以采用光电传感器。而在灰尘和粉尘比拟多的情况下,那么选用开关型霍尔传感
3、器。由于本次设计主要针对自行车和汽车的测速,应选用开关型霍尔传感器。2.2 显示模块的选择 方案一:采用 LED 数码管 LED 数码管只可以显示数字和简单的字母,其优点是价格廉价,程序编写比拟简单,功耗低,缺点是亮度不高,在要显示数字多的场合下,体积较大,比拟占空间。方案二:采用 LCD1602 液晶显示 LCD1602 液晶显示模块具有体积小、功耗低,比照度可调且能够显示 ASCII 码和简单的汉字等优点,其缺点是本钱比数码管高,而且程序编写相对复杂。方案三:采用 LCD12864 液晶显示 LCD12864 液晶显示屏优点是能够显示汉字,且功耗比拟低,其确定是软件编程比拟复杂。2.3 测
4、速原理论证 2.3.1 测频法原理:测频法原理图如图 1-2 所示,即测量一段时间 t 内,所计的脉冲数为 N,那么所测得的频率为 f=t/N,其“1 误差为ftN/1/1。由此可见,在 t 一定时,所测频率 f 越高,那么“1 误差越小。因此测频法适用于测低频。图 1-2 测频法原理图 测周法原理:测周法原理图如图 1-3 所示,即对信号的周期 T 进行测量,然后根据 f=1/T 就可以得到频率。在本设计中就是通过对单片机内部时钟脉冲计数得到两个脉冲之间的时间间隔 T。假设单片机内部时钟为f,所计得的脉冲数为 N,那么时间间隔 T=N/f,即频率 f=f/N。其“1 误差为TfN/1/1。由
5、此可知,在时钟脉冲f一定时,所测的时间间隔 T 越大,即所测频率越低,那么“1 误差越小,精度越高。图 1-3 测周法原理图 综上所述,为了提高所设计的测速仪的精度,因此本次设计采用测频法和测周法相结合的方法,即低频时采用测周法,高频时采用测频法。三、硬件设计 总的原理框图:图 1-4 总的硬件原理框图 如图 1-4 所示,即为整个系统的原理框图,该智能测速仪是利用霍尔传感器来采集信号,当磁粒靠近霍尔传感器时,霍尔传感器向单片机输出一个脉冲,经过单片机的处理,将频率和转速送到 LCD1602中显示。3.1 单片机最小系统 图 1-5 单片机最小系统原理图 单片机的最小系统电路如上图 1-5 所
6、示,主要由单片机、晶振电路、复位电路三局部组成。其中晶振电路由一个 12MHz 的晶体振荡器和两个瓷片电容组成,为单片机提供时钟频率,本次设计采用 12M晶振是为了使定时能够更精准,计算更方便。复位电路由上图中的S1,R3,R4 和 C1 所组成,具有上电复位和按键复位两种复位方式。由于要使用 P0 口作为数据传送端,所以需要在 P0 加上拉电阻。本次设计选用的单片机是 STC89C54RD+。3.2 霍尔传感器电路 图 1-6 霍尔传感器电路原理图 霍尔传感器电路如上图 1-6 所示,本次设计选用的霍尔型号为 44E 开关型霍尔传感器,当小磁粒靠近时,霍尔输出低电平。图中 D2 为电源指示灯
7、,D1 为小磁粒靠近霍尔的指示灯。LM393 为电压比拟器,2 脚输入电压为 2.5V,此处加个电压比拟器使输出信号更稳定,能够输出比拟稳定的脉冲信号。3.3 液晶显示模块电路 图 1-7 液晶显示电路原理图 液晶显示电路如右图所示,其中 1 脚 VSS 和 2 脚 VDD 为电源地和电源正极,3 脚 VO 是用来调节液晶屏幕显示的比照度的,4 脚 RS为数据/命令选择端,5 脚 R/W 为读写端,6 脚 E 为使能端,714 脚的 DB0DB7 为数据端,15 脚 BLA 和 16 脚 BLK 为背光电源端。四、软件设计 4.1 软件实现功能 软件主要实现功能是完成测频法和测周法的算法实现,
8、并且能够进行自动的根据频率范围进行两种方法之间的转换。4.2 主程序框图 开始液晶和中断初始化频率大于1000?测频法标志位置位测周法标志位清零测周法标志位置位测频法标志位清零显示频率和转速结束是否 图 1-8 主程序框图 主程序框图如图 4.3 定时器中断程序框图 进入中断测频法标志 位为1?测周法标志 位为1?重新给TH0和TL0赋值定时1S到?频率和转速计算时间计数器加1退出中断是是是 4.4 外部中断程序框图 进入中断测周法标志 位为1?测频法标志 位为1?频率和转速计算时间计数器加1退出中断是重新给TH0和TL0赋值是 三、模拟调试局部 5.1 模拟装置简介 本次设计所使用的 5,2
9、 模拟调试方法 5.3 结果 四、小结 6.1 实验中所遇到的问题、在编程时,采用测周法时始终无法得到正确的频率,所显示的频率值始终在 4000 到 5000 左右变化,而定时器的计数值用来计算两个脉冲之间的时间的量始终只有几百,即时间为几百微秒。、在实际测量时,发现测得的频率值与实际的频率值相差很大,且相对误差在 10%左右,例如实际值为 325r/min,而测得值为354r/min,即相对误差为(354-325)/325*100%=8.9%,误差比拟大。、采用测周法时,当频率为 0 时,其实际显示值不为零,始终停留在之前的值,保持不变。6.2 分析、解决 6.3 设计结果评价 附录 1#i
10、nclude#define uint unsigned int#define uchar unsigned char sbit LCD_RS=P26;/液晶控制端 sbit LCD_RW=P25;sbit LCD_EP=P27;uchar code tab1=freq 0000 Hz;/液晶第一行默认显示数据 uchar code tab2=n 0000 r/min;/液晶第二行默认显示数据 long speed_count=0;/计数值 uint freq=0;/频率值 uint speed=0;/转速值 uint timer_count=0;/定时器计数值 uint int_t0_coun
11、t=0;/M 法时外部中断计数值 uchar intt0_count=0;/T 法中用来平均的 bit m_flag=1;/M 法标志位 bit t_flag=0;/T 法标志位 bit first_flag=0;/第一个测频值显示的标志 void delay(uchar ms);/延时子程序 void init_interuppt();/定时器 0 初始化 void lcd_init();/液晶初始化 void write_1602_wcmd(uchar com);/液晶写入指令函数 void write_1602_wdat(uchar dat);/液晶写入数据函数 void write_s
12、peed(uchar address,uint dat);/1602写速度值 void main()lcd_init();/液晶初始化 init_interuppt();/中断初始化 while(1)if(first_flag=1)if(freq1000)/频率大于 1000 那么采用测频法 m_flag=1;t_flag=0;else m_flag=0;t_flag=1;write_speed(0 x45,freq);/显示频率值 write_speed(5,speed);/显示转速值 /*/*延时函数 */*/void delay(uchar ms)uint i,j;for(i=ms;i0
13、;i-)for(j=150;j0;j-);/*/*定 时 器 计 数 器 初 始 化 */*/void init_interuppt()TMOD=0 x01;/设置为工作方式 1,16 位计数方式 TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;/使能定时器 0 中断 EX0=1;/使能外部中断 IT0=1;/下降沿触发 EA=1;/使能总中断 TR0=1;/开定时器 0 中断 /*/*定时器中断函数 */*/void timer0()interrupt 1 TH0=(65536-50000)/256;/每 50 毫秒进一次中断 TL0=(6
14、5536-50000)%256;if(m_flag=1)timer_count+;if(timer_count=20)/每 1 秒钟更新一次速度 freq=int_t0_count;speed=freq*10;/频率转换为转速 int_t0_count=0;timer_count=0;if(first_flag=0)first_flag=1;if(t_flag=1)timer_count+;if(timer_count=10)speed=0;freq=0;/*/*外部中断函数 */*/void int_t0()interrupt 0 if(m_flag=1)int_t0_count+;if(t
15、_flag=1)intt0_count+;speed_count+=TH0*256+TL0+timer_count*65536;if(intt0_count=2)freq=(unsigned int)(2000000.0/(speed_count);speed=(unsigned int)(2000000.0/(speed_count)*10);speed_count=0;intt0_count=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;timer_count=0;/*/*LCD 初始化设定 */*/void lcd_init()uchar i
16、;write_1602_wcmd(0 x38);/16*2 显示,5*7 点阵,8 位数据 write_1602_wcmd(0 x0c);/显示开,关光标 write_1602_wcmd(0 x06);/移动光标 write_1602_wcmd(0 x01);/去除 LCD 的显示内容 write_1602_wcmd(0 x82);/第一行字符写入的位置 for(i=0;i13;i+)write_1602_wdat(tab2i);write_1602_wcmd(0 xc0);for(i=0;i12;i+)write_1602_wdat(tab1i);/*/*写指令到 LCD */*/void
17、write_1602_wcmd(uchar com)LCD_RS=0;/置为写入命令,低为写指令 LCD_RW=0;P0=com;/送入数据 delay(1);LCD_EP=1;/拉高使能端 delay(1);LCD_EP=0;/完成高脉冲,传入数据到 LCD /*/*写数据到 LCD */*/void write_1602_wdat(uchar dat)LCD_RS=1;/置为写入数据,高为写数据 LCD_RW=0;P0=dat;/送入数据 delay(1);LCD_EP=1;/拉高使能端 delay(1);LCD_EP=0;/完成高脉冲,传入数据到 LCD /*/*写速度值到 LCD */*/void write_speed(uchar address,uint dat)uchar gw,sw,bw,qw;qw=dat/1000;bw=dat%1000/100;sw=dat%1000%100/10;/分出十位数据 gw=dat%1000%100%10;/分出个位数据 write_1602_wcmd(0 x80+address);/在第二行对应位置显示 write_1602_wdat(0 x30+qw);write_1602_wdat(0 x30+bw);write_1602_wdat(0 x30+sw);write_1602_wdat(0 x30+gw);
限制150内