目录摘要 (1)一课程设计任务和功能要求 (1)1.1设计应用背景 (1)1.2设计原理 (1)1.3系统结构 (2)二传感器模块设计 (3)2.1脉冲信号的获得 (3)2.2霍尔传感器 (3)2.3光电传感器 (3)2.4光电编码器 (4)2.5三套方案的选择与比较 (4)三.设计总结 (5)3.1硬件连接 (5)3.2实验程序及分析 (6)3.4原理图 (7)3.5 PCB原理图 (7)四.设计总结 (8)五.参考文献 (9)六.成员及分工情况 (9)附录 (9)摘要测速是工农业生产中经常遇到的问题,学会使用单片机技术设计测速仪表具有很重要的意义。
要测速,首先要解决是采样的问题。
在使用模拟技术制作测速表时,常用测速发电机的方法,即将测速发电机的转轴与待测轴相连,测速发电机的电压高低反映了转速的高低。
使用单片机进行测速,可以使用简单的脉冲计数法。
只要转轴每旋转一周,产生一个或固定的多个脉冲,并将脉冲送入单片机中进行计数,即可获得转速的信息。
关键词:拾取信号光电传感器霍尔传感器光电编码器转速一课程设计任务和功能要求任务:电机转速自动检测功能要求:请设计一种电机转速监控装置,能够提供电机转速的电量信息。
1.1设计应用背景电动机作为风机、水泵、机床等设备的动力,广泛应用于工业、农业、商业、公用设施、制造业等各个领域,在我国,电动机的用电量已经占到社会总用电量的60%以上。
我国能源相对缺乏,优质能源严重短缺,同时巨大的能源消耗引起的环境污染已在某种程度上制约了经济的发展,从节约能源,保护环境出发,我国开展了很多节能研究工作电动机作为量大面广的机电产品,降低电动机的损耗、提高电动机的效率已成为节能降耗、降低生产成本、追求经济效益最大化的重要手段,是利国利民的大事。
对老式耗能大的电动机必须进行节能改造,因此,研究其节能问题具有非常重要的意义。
1.2设计原理(1)利用光电开关管做电机转速的信号拾取元件,在电机的转轴上安装一圆盘,在圆盘上挖一小洞,小洞上下分别对应着光发射和光接收开关,圆盘转动一圈即发光电管导通一次,利用此信号作为进行脉冲计数所需。
(2)计数脉冲通过计数电路进行有效的计数,按照设计要求每一秒种都必须对计数器清零一次,因为电路实行秒更新,所以计数器到译码电路之间有锁存电路,在计数器进行计数的过程中对上一次的数据进行锁存显示,这样做不仅可以解决数码显示的逻辑混乱,还可以避免了数码显示的闪烁问题。
(3)对于脉冲记数,有测周和测频的两种方式。
测周电路的测量精度主要受电路系统的脉冲产生电路的影响,对于低频率信号,其精度较高。
测频电路其对于高低电平的信号差比较敏感,对于低频率信号的测量误差较大,但是本电路仍然采用测频方式,原因是本电路对于马达电机转速精度要求较低,本电路还有升级为频率计使用,而测频方式对高频的精度还是很高的。
(4)显示电路采用静态显示方法,由于静态显示易于制作和调试,原理也较简单,所需元件易于购买。
(5)电路时钟是整个电路的关键,它是整个电路有效工作的核心,负责电路的锁存和清零。
其基本思路是:产生频率一秒是时钟,当秒时钟到来时,即上升沿到来时,对锁存电路进行锁存,锁存以后才能对计数器进行清零,锁存和清零间隔要充分小,否则就影响电路的计数准确度。
鉴于此,对锁存集成必须采用边沿触发形式的集成,并且计数器应该与锁存同步工作,即都在秒时钟的上升沿触发工作。
另外大多的译码器都带有锁存功能,但是其他锁存方式基本上都是电平触发,若设计成电平触发的话,势必会增加电路的复杂度,还不如直接采用边沿锁存的单集成,所以不使用译码器中的锁存电路。
时钟实现方法很多,本电路采用晶振电路,以求得高精度的时钟需求。
1.3系统结构本文主要针对电机的转速进行测量,然后用数码管把电机的转速显示出来。
本装置主要有两部分构成:(1)光电测速部分。
(2)测得的脉冲处理和显示部分。
光电测速部分主要由光电传感器构成,脉冲处理部分主要经施密特触发器对接收到的脉冲进行波形校正,由单片机的T1口输入,经80C51处理后显示输出电机的转速。
二传感器模块设计2.1脉冲信号的获得可以有多种方式来获得脉冲信号,因而需要用到以下传感器中一种来获取脉冲信号。
2.2霍尔传感器霍尔传感器是对磁敏感的传感元件,常用于开关信号采集的有CS3020、CS3040等,这种传感器是一个3端器件,外形与三极管相似,只要接上电源、地,即可工作,输出通常是集电极开路(OC)门输出,工作电压范围宽,使用非常方便。
如图1所示是CS3020的外形图,将有字面对准自己,三根引脚从左向右分别是Vcc、地和输出。
图1 CS3020外形图使用霍尔传感器获得脉冲信号,其机械结构也可以做得较为简单,只要在转轴的圆周上粘上一粒磁钢,让霍尔开关靠近磁钢,就有信号输出,转轴旋转时,就会不断地产生脉冲信号输出。
如果在圆周上粘上多粒磁钢,可以实现旋转一周,获得多个脉冲输出。
在粘磁钢时要注意,霍尔传感器对磁场方向敏感,粘之前可以先手动接近一下传感器,如果没有信号输出,可以换一个方向再试。
这种传感器不怕灰尘、油污,在工业现场应用广泛。
2.3光电传感器光电传感器是应用非常广泛的一种器件,有各种各样的形式,如透射式、反射式等,基本的原理就是当发射管光照射到接收管时,接收管导通,反之闭合。
以透射式为例,图2可以看出,当不透光的物体挡住发射与接收之间的间隙时,开关管闭合,否则打开。
为此,可以制作一个遮光叶片如图3,安装在转轴上,当扇叶经过时,产生脉冲信号。
当叶片数较多时,旋转一周可以获得多个脉冲信号。
图2光电传感器的原理图图3遮光叶片2.4光电编码器光电编码器的工作原理与光电传感器一样,不过它已将光电传感器、电子电路、码盘等做成一个整体,只要用连轴器将光电传感器的轴与转轴相连,就能获得多种输出信号。
它广泛应用于数控机床、回转台、伺服传动、机器人、雷达、军事目标测定等需要检测角度的装置和设备中。
图4是某光电编码器的外形。
图4 成品光电编码器2.5三套方案的选择与比较根据三套方案的原理与实施方法,对三种传感器在原理、优缺点、成本、功耗、稳定性方面进行了对比分析,如表2.4所示。
表2.4 三种传感器这次课设选的是光电传感器,在稳定低功耗和低成本下,比较合适。
采用穿透法测量电机转速。
光电传感器的原理上面有详细的介绍。
当不透光的物体挡住发射与接收之间的间隙时,开关管闭合,否则打开。
为此,可以制作一个遮光叶片如图3所示,安装在转轴上,当扇叶经过时,产生脉冲信号。
当叶片数较多时,旋转一周可以获得多个脉冲信号。
这里我们才用转10个孔的方式。
在一分钟的时间内,假如产生了10000脉冲,则电机的转速就为1000r/min。
三.设计总结3.1硬件连接测速的方法决定了测速信号的硬件连接,测速实际上就是测频。
因此,频率测量的一些原则同样适用于测速。
通常,可以用计数法、测脉宽法和等精度法来进行测试。
所谓计数法,就是给定一个闸门时间,在闸门时间内计数输入的脉冲个数;测脉宽法是利用待测信号的脉宽来控制计数门,对一个高精度的高频计数信号进行计数。
由于闸门与被测信号不能同步。
因此,这两种方法都存在±1误差的问题,第一种方法适用于信号频率高时使用,第二种方法则在信号频率低时使用。
等精度法则对高、低频信号都有很好的适应性。
这里为简化讨论,仅采用计数法来进行测试。
图5仿真电路图如上图:因为光电传感器不好仿真,这里我们采用了555芯片构成一个施密特触发器,由光电传感器得到的脉冲由2,5脚输入,经3脚输出接到单片机的T1(P3.5)。
经89C51编程处理后由P1口输出通过数码管显示出转速。
3.2实验程序及分析测量转速,使用光电传感器,被测电机带动纸片旋转,我们在纸片上开了10小孔,电机每旋转一周就会产生10个脉冲,产生12个脉冲,要求将转速值(转/分)显示在数码管上。
图6仿真电路如上图:光电传感器测得脉冲由555的2或5脚输入,由555的三脚输出,接入AT9C51的P3.5口。
P2.4---P2.7为数码管的位选端口,p1为数据端口。
3.4原理图用protel DXP画出原理图:图7 protel DXP画出原理图3.5 PCB原理图根据原理图得到的PCB:图8 PCB四.设计总结根据课题要求,设计一种电机转速监控装置,能够提供电机转速的电量信息,达到电机转速自动检测的目的,通过数码管显示。
通过查询相关资料,了解到现在电机用电量之高造成了很大的能源浪费,更意识到了这个课题的现实意义。
设计的原理首先是对电机转速的信号拾取,这就有三种传感器可以选择,通过书本,网上查资料,对各个传感器有一定了解后,根据实际情况以及成本选取用光电传感器作为信号收集,它的优点是结构简单、形式灵活多样、体积小、采样精确、采样速度快、敏感范围大、非接触。
脉冲处理部分主要经施密特触发器对接收到的脉冲进行波形校正,经89C51编程处理后由P1口输出通过数码管显示出转速。
对于设计,用protel DXP画出原理图,仿真实现了对电机转速自动检测,数码管显示转速要求,精确度,灵敏度都符合要求,还对电路画了PCB电路图,可以通过刻板在实际中做出模型,实现课设要求。
总体来说能够实现其基本功能,电机转速700---1500r/min。
通过这次课设,让我们感受到了传感器在生活中的普遍性和重要性。
也通过这次课设,对光电传感器结构特点和工作原理的一些知识有了更深的了解、掌握。
将自己所学的内容在课程设计中表达了出来。
经过这一周的努力和付出,在老师的指导和小组成员的共同协作下,成功的完成了此次课设。
五.参考文献[1]徐科军等,传感器与检测技术,电子工业出版社,2006[2]周杏鹏等,现代检测技术,高等教育出版社,2004[3]王幸之等,单片机应用系统抗干扰技术,北京航空航天大学出版社,2004六.成员及分工情况附录实验程序如下:#include <REG52.H>#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define LED_DAT P1sbit LED_SEG0 = P0^3;sbit LED_SEG1 = P0^2;sbit LED_SEG2 = P0^1;sbit LED_SEG3 = P0^0;//sbit pin_SpeedSenser = P3^5; //光电传感器信号接在T1上#define TIME_CYLC 100 //12M晶振,定时器10ms 中断一次我们1秒计算一次转速// 1000ms/10ms = 100#define PLUS_PER 10 //码盘的齿数,这里假定码盘上有10个齿,即传感器检测到10个脉冲,认为1圈#define K 100.0 //校准系数unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar data Disbuf[4];// 显示缓冲区uint Tcounter = 0; //时间计数器bit Flag_Fresh = 0; // 刷新标志bit Flag_clac = 0; //计算转速标志bit Flag_Err = 0; //超量程标志//在数码管上显示一个四位数void DisplayFresh();//计算转速,并把结果放入数码管缓冲区void ClacSpeed();//初始化定时器T0void init_timer0();//初始化定时器T1void init_timer1();//延时函数void Delay(uint ms);void it_timer0() interrupt 1 /* interrupt address is 0x000b */{TF0 = 0; //d定时器T0用于数码管的动态刷新//TH0 = 0xC0; /* init values */TL0 = 0x00;Flag_Fresh = 1;Tcounter++;if(Tcounter>TIME_CYLC){ Flag_clac = 1;//周期到,该重新计算转速了}}void it_timer1() interrupt 3 /* interrupt address is 0x001b */{TF1 = 0; //定时器T1用于单位时间内收到的脉冲数//要速度不是很快,T1永远不会益处Flag_Err = 1; //如果速度很高,我们应考虑另外一种测速方法,:脉冲宽度算转速}void main(void){Disbuf[0] = 0; //开机时,初始化为0000Disbuf[1] = 0;Disbuf[2] = 0;Disbuf[3] = 0;init_timer0();init_timer1();while(1){if(Flag_Fresh){ Flag_Fresh = 0;DisplayFresh(); // 定时刷新数码管显示}if(Flag_clac){ Flag_clac = 0;ClacSpeed(); //计算转速,并把结果放入数码管缓冲区Tcounter = 0;//周期定时清零TH1=TL1 = 0x00;//脉冲计数清零}if(Flag_Err) //超量程处理{//数码管显示字母'EEEE'Disbuf[0] = 0x9e; //开机时,初始化为0000 Disbuf[1] = 0x9e;Disbuf[2] = 0x9e;Disbuf[3] = 0x9e;while(1){ DisplayFresh();//不再测速等待复位i}}}}//在数码管上显示一个四位数void DisplayFresh(){P2 |= 0xF0;LED_SEG0 = 0;LED_DAT = table[Disbuf[0]];Delay(1);P2 |= 0xF0;LED_SEG1 = 0;LED_DAT = table[Disbuf[1]];Delay(1);P2 |= 0xF0;LED_SEG2 = 0;LED_DAT = table[Disbuf[2]];Delay(1);P2 |= 0xF0;LED_SEG3 = 0;LED_DAT = table[Disbuf[3]];Delay(1);P2 |= 0xF0;}//计算转速,并把结果放入数码管缓冲区void ClacSpeed(){uint speed ;uint PlusCounter;PlusCounter = TH1*256 + TL1;speed = K*(PlusCounter/PLUS_PER)/60;//K是校准系数,如速度不准,调节K 的大小Disbuf[0] = (speed/1000)%10;Disbuf[1] = (speed/100)%10;Disbuf[2] = (speed/10)%10;Disbuf[3] = speed%10;}//初始化定时器T0void init_timer0(){TMOD &= 0xf0; //定时10毫秒/* Timer 0 mode 1 with software gate */TMOD |= 0x01; /* GATE0=0; C/T0#=0; M10=0; M00=1; */TH0 = 0xC0; /* init values */TL0 = 0x00;ET0=1; /* enable timer0 interrupt */EA=1; /* enable interrupts */TR0=1; /* timer0 run */}//延时函数void Delay(uint ms){uchar i;while(ms--)for(i=0;i<100;i++);}//初始化定时器T1void init_timer1(){TMOD &= 0x0F; /* Counter 1 mode 1 with software gate */ TMOD |= 0x50; /* GATE0=0; C/T0#=1; M10=0; M00=1; */TH1 = 0x00; /* init values */TL1 = 0x00;ET1=1; /* enable timer1 interrupt */EA=1; /* enable interrupts */TR1=1; /* timer1 run */}。