光电传感器——基于红外反射式的测速机引言在工程实践中,经常会遇到各种需要测量转速的场合。
转速是电动机极为重要的一个状态参数,在很多运动系统的测控中,都需要对电机的转速进行测量,不论是直流调速系统还是交流调速系统,只有转速的高精度检测才能得到高精度的控制系统。
迄今为止,测速可分为两类:模拟电路测速和数字电路测速。
随着微电子技术的发展,计算机技术的广泛应用,出现了以计算机为核心的数字测速装置。
这样的速度测量装置测量范围宽、工作方式灵活多变、适应面广,具有普通数字测速装置不可比拟的快速性、精确性和优越性。
一:设计思路用一个红外发光二极管和一个接受红外光的二极管组成一套光电管。
当检测到物表面为黑色时,反射光很弱,接收端检测到的光线可以忽略,使接收端呈现一种状态,例如开关管截止;当被检测物表面为白色时,反射光强烈,发射端发射的红外线被接收端全部接收,使接收端呈现另一种相反的状态,例如开关管开通。
这两种相反的状态表现在电路中,就是高低电平组成的脉冲信号。
由此,我想到用一个比较器来比较两种接受到的信号,从而输出“0”“1”两种高低电平,并把两种信号传给单片机进行统计,然后利用设定算法进行计算,最后通过数码显示管显示计算结果。
二:所需模块本测速系统共有两个模块构成,一个为光电传感器部分,用于接收光信号并转换为电信号,即高低电平信号;另一个为单片机部分,用于接收高低电平信号并通过内部计算,然后再通过数码显示管显示测出的结果。
(一)光电传感器部分(1)LM339工作原理及管脚图:LM339类似于增益不可调的运算放大器。
每个比较器有两个输入端和一个输出端。
两个输入端中的一个称为同相输入端,用“+”表示,另一个称为反相输入端,用“-”表示。
当用作比较两个电压时,任意一个输入端加一个固定电压做参考电压(也称为门限电平,它可选择LM339输入共模范围的任何一点),另一端加一个待比较的信号电压,当“+”端电压高于“-”端时,输出管截止,相当于输出端开路。
当“-”端电压高于“+”端时,输出管饱和,相当于输出端接高电位。
两个输入端电压差别大于10mV就能确保输出能从一种状态可靠地转换到另一种状态,因此,把LM339用在弱信号检测等场合是比较理想的。
LM339的输出端相当于一只不接集电极电阻的晶体三极管,在使用时输出端到正电源一般须接一只电阻(称为上拉电阻,选3-15K)。
选不同阻值的上拉电阻会影响输出端高电位的值。
因为当输出晶体三极管截止时,它的集电极电压基本上取决于上拉电阻与负载的值。
下图(1a)给出了一个LM399的基本单限比较器。
输入信号Uin为待比较电压,把它加到同相输入端,在反相输入端接一个参考电压(门限电平)Ur。
当输。
图(1b)为其传输特性。
图(1c)为LM339入电压Uin>Ur时,输出为高电平UOH的管脚图。
(c)图(1)LM339工作原理图及管脚图(2)整体连线图:如下图(2)所示:图(2) 比较型光电传感器整体电路图在上图中, LED 灯相当于一个红外线发射管,JP1是红外线接收管,接收光强在上面转换成电流,在R 上成为电压信号。
当光线照射到白色面上时,光线反射强烈,光线照射到黑色面上时,光线反射较弱。
因此当光照在不同颜色面上时,阻值会发生明显的变化。
将阻值的变化值与RA1的标准值进行比较,就可以从LM339输出逻辑电平给单片机。
(二) 单片机部分(1)单片机外部连线图:如下图(3)所示AL E W R RD RXD T XD INT 0E A/VP 31X119X218RE SE T 9RD 17W R16INT 012INT 113T 014T 115P101P112P123P134P145P156P167P178P0039P0138P0237P0336P0435P0534P0633P0732P2021P2122P2223P2324P2425P2526P2627P2728PSE N29AL E /P 30T XD 11RXD 10VCC 40GND 20U189C52PSE NP10P11P12P13P14P15P16P17T 0T 1INT 1P00P01P02P03P04P05P06P07P 00P 01P 02P 03P 04P 05P 06P 07P20P21P22P23P24P25P26P27P 20P 21P 22P 23a b f cg deDPY117421105a b c d e fg 3d p d pa b f c g d ed pab fc gd ed pab fc g ded p C 06C 28C 39C 412LED DPY 4-L E D12345678161514131211109R 1KP 00P 01P 02P 03P 04P 05P 06P 075V图(3)单片机连线图在上接线图中,可在数码管与单片机之间接上一个分压电阻,起到保护作用。
单片机型号选89C51或89C52都行。
在试验板上把图(1)中的2管脚(逻辑电平输出管脚)和图(2)中的12管脚(中断输入管脚)连接,即可构成整个测速系统。
(2)单片机内部主程序流程图主程序是控制单片机系统按照预定的操作方式运转,它完成人机对话和各种控制功能,是单片机系统程序的框架。
主程序的主要任务是完成系统自检、初始化、处理键盘命令等功能。
在本实验中,未涉及到键盘命令。
本系统的主程序流程如下图(4)所示。
图(4)主程序流程图图(5)外部中断0 中断程序流程图在该测速系统的程序中,主程序执行的过程中共执行了3 个中断程序,即外部中断0 中断、外部脉冲计数0 中断和定时器1 中断。
图(5)所示为外部中断0 中断程序流程图。
外部中断0 中断程序主要用于测速起始。
当测速开始时,执行外部中断0 中断,外部脉冲计数加1,并判断T0、T1 是否开启,若没有开启则开启,再判断1S 定时到了没有,若1S 定时到计算转速,并关INT0、T0、T1 软件清零。
图(6)为T0 中断程序流程图。
T0 对内部时钟脉冲计数, T0 为8 位定时器,1S 定时的内部时钟脉冲超过了T0 上限,故采用软件延时计数。
图(7)为T1 中断程序流程图,T1 定时1S, 当一秒定时到,则置位标志位。
图(6)T0 中断程序流程图图(7)T1 中断程序流程图三:测速原理首先,选一小型直流电机,在其轴上固定一张圆形硬纸片,以此来代替被测物。
其次把此圆形纸片平均分成6等分,并把其中的三块涂黑(具体见实物)。
再次,用光电管正对圆形纸片。
最后,启动整个系统就可以进行测速了。
因为当红外线照到面黑色时,反射光很弱,接收端检测到的光线可以忽略,当照到白色面时,反射光强烈,发射端发射的红外线几乎被接收端全部接收,因此,检测到的信号经过比较电路输出后,会给单片机输入高低两种电平。
所以,在编程中,假定在1S时间内共检测到n个低电平信号,那么此电机的转速为。
四:整体电路图及实物图见附一图所示。
五:所需器件名称型号个数价格51单片机STC89C51RC 1件9元光电管1套5元四电压比较器LM339 1件 1.5元四位数码显示管12管脚1件5元1/4电阻0.47K,1K,3.3K,10K, 各10个(备用)0.8元电位器103(10K)2个1元瓷片电容22PF,104(100nF)各10个(备用)2元万用版1块3元电池盒1个1元PIC座20,40脚(2+1)个1元排针40PIN 2排1元晶振12M 1个1元复位开关1个0.1元LED灯5个0.5元共计:31.9元六:总结本设计的光电传感器测速机能够快速检测到电机横截面上的黑白相间的面,并通过单片机编写测速程序,用数码管显示。
但本设计的测速系统的整体性能只能满足一般小型电机和一些要求不高的测速,并且在其测速时,还需要在被测物上安装一个黑白相间的圆盘,这对某些被测物体来说是不太好实现的,即其是存在一定的局限性的。
除此之外,其精确度也不尽完美。
但整体来说,此测速系统还是具有可行性的。
当我们需要知道某电机的转速而又缺少测速装置时,就可以用此套系统来进行测速。
它的简单性,方便性和快捷性也是某些测速装置不可比拟的。
至于其缺点,由于设计者水平目前有限,暂不能完美解决,只待以后对此方面有较多理解后在解决,同时也希望对此精通的师生给予指点,从而进行改进测速方法,提高整个系统的测速性能。
附一:整体电路图附二:程序源代码#include<reg52.h>#define uint unsigned intuint temp,qian,bai,shi,ge,aa,n;sbit dula=P0;sbit wela=P1;sbit zd=P3^2;uint codetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void display(uint qian,uint bai,uint shi,uint ge);void delay (uint z);void init();void main(){EA=1;//开总中断EX0=1;//开外部中断0init();//初始化子程序while(1){display(qian,bai,shi,ge);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uint qian,uint bai,uint shi,uint ge) {P0=table[qian];P1=0xf7;delay(1);P0=table[bai];P1=0xfb;delay(1);P0=table[shi];P1=0xfd;delay(1);P0=table[ge];P1=0xfe;delay(1);}void exter0() interrupt 0{n++;while(zd==0);}void init(){wela=0;dula=0;temp=0;TMOD=0x01;TCON|=0X04;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}timer0() interrupt 1 {TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==20){aa=0;temp=20*n;n = 0;qian=temp/1000;bai=temp%1000/100;shi=temp%100/10;ge=temp%10;}}。