光电传感器转速测量系统设计.docx
《光电传感器转速测量系统设计.docx》由会员分享,可在线阅读,更多相关《光电传感器转速测量系统设计.docx(16页珍藏版)》请在冰豆网上搜索。
![光电传感器转速测量系统设计.docx](https://file1.bdocx.com/fileroot1/2022-11/24/48b1e878-9379-4290-a40e-3114a1d9eb87/48b1e878-9379-4290-a40e-3114a1d9eb871.gif)
光电传感器转速测量系统设计
专业课程设计
题目
光电传感器的转速测量设计
院系:
自动化学院
专业班级:
小组成员:
指导教师:
日期:
2012年10月8---2012年10月19
一.课程设计描述
采用单片机、uln2003为主要器件,设计步进电机调速系统,实现电机速度开环可调。
二.课程设计具体要求
1、通过按键选择速度;
2、转速测量显示范围为0~9999转/秒。
3、检测并显示各档速度。
三.主要元器件
实验板(中号)1个步进电机1个
STC89C521个电容(30pF、10uF)各1个
数码管(共阳、四位一体)1个晶振(12MHz)1个
小按键4个ULN20031个
电阻若干发光二极管1个
三极管(NPN)4个排阻1个
四.原理阐述
4.1系统简述
按照题给要求,我们最终设计了如下的解决方案:
用户通过键盘键入控制指令(开关),微控制器在收到指令后改变输出的PWM波,最终在ULN2003的驱动下电机转速发生改变。
通过ST151传感器测量电机扇叶的旋转情况,将转速显示在数码管上。
在程序主循环中实现按键扫描与转速显示,将定时器0作为计数器,计数ST151产生的下降沿,可算出转速,并送至数码管显示。
设计思路:
(1)利用光电开关管做电机转速的信号拾取元件,在电机的转轴上安装一个圆盘,在圆盘上挖1小洞,小洞上下分别对应着光发射和光接受开关,圆盘转动一圈即光电管导通1次,利用此信号做为脉冲计数所需。
(2)对光电开关信号整流放大。
(3)脉冲经过单片机内部的计数器和定时器进行计数和定时。
(4)显示电路采用单片机动态显示。
4.2转速测量原理
在此采用频率测量法,其测量原理为,在固定的测量时间内,计取转速传感器产生的脉冲个数,从而算出实际转速。
设固定的测量时间为Tc(min),计数器计取的脉冲个数m,假定脉冲发生器每转输出p个脉冲,对应被测转速为N(r/min),则f=pN/60Hz;另在测量时间Tc内,计取转速传感器输出的脉冲个数m应为m=Tcf,所以,当测得m值时,就可算出实际转速值[1]:
N=60m/pTc(r/min)
(1)
4.3转速测量系统组成框图
系统由信号预处理电路、单片机STC89C51、系统化LED显示模块、串口数据存储电路和系统软件组成。
其中信号预处理电路包含信号放大、波形变换和波形整形。
对待测信号进行放大的目的是降低对待测信号的幅度要求;波形变换和波形整形电路则用来将放大的信号转换成可与单片机匹配的TTL信号;通过对单片机的编程设置可使内部定时器T0对输入脉冲进行计数,这样就能精确地算出加到T0引脚的单位时间内检测到的脉冲数;设计中转速显示部分采用价格低廉且使用方便的LED模块,通过相关计算方法计算得到的转速通过I2C总线放到E2PROM存储,既节省了所需单片机的口线和外围器件,同时也简化了显示部分的软件编程。
系统的原理框图如图2.1所示。
图2.1系统的原理框图
五.系统硬件电路的设计
系统硬件部分包含输入模块、显示模块、控制模块、测速模块等。
在硬件搭建前,先通过ProteusPro7.5进行硬件仿真实现。
5.1脉冲产生电路设计
设计采用了红外光电传感器,进行非接触式检测。
当有物体挡在红外光电发光二极管和高灵敏度的光电晶体管之间时,传感器将会输出一个低电平,而当没有物体挡在中间时则输出为高电平,从而形成一个脉冲。
系统在光电传感器收发端间加入电动机,并在电动机的转轴上安装一转盘。
在这个转盘的边沿处挖出若干个圆形过孔,把传感器的检测部分放在圆孔的圆心位置。
每当转盘随着后轮旋转的时候,传感器将向外输出若干个脉冲。
把这些脉冲通过一系列的波形整形成单片机可以识别的TTL电平,即可算出轮子即时的转速。
转盘的圆孔的个数决定了测量的精度,个数越多,精度越高。
这样就可以在单位时间内尽可能多地得到脉冲数,从而避免了因为两个过孔之间的距离过大,而正好在过孔之间或者是在下个过孔之前停止了,造成较大的误差。
设计中转盘的圆孔的实际个数受到技术的限制。
为了达到预定的效果设计在转盘过孔的设计上采用11个过孔,从而留下了10个同等的间距。
这样在以后的软件设计中能够较为方便的计算出脉冲频率。
脉冲发生源的硬件结构图如图3.1所示。
图3.1脉冲发生源硬件结构图(左为正视图,右为侧视图)
5.2光电转换及信号调理电路设计
由于系统需要将光信号转换为电信号,因而需要使用光电传感器并设计相应的信号调理电路,以得到符合要求的脉冲信号,送给单片机STC89C51进行计数,同时得到计数的时间,由单片机进行相关计算以得到电动机转速。
传感器将电机的转速信号转变成了电脉冲信号,该信号经过LM324集成运放整形驱动,送到单片机进行脉冲计数,从而测出电动机转速。
光电转换部分与单片机的连接框图如图3.2所示。
图3.2光电转换部分与单片机的连接框图
5.3时钟电路
系统采用12M晶振与两个30pF电容组成震荡电路,接STC89C52的XTAL1与XTAL2引脚,为微控制器提供时钟源
5.4按键电路
四个按键分别控制电机的不同转速,即控制PWM波高电平的占空比,以实现电机的速度控制,采用开环控制方法,不是十分精确,但控制简单,易实现,代码编写简单。
5.5显示部分
系统采用4位共阴极数码管实现转速显示。
数码管的位选端1~4分别接STC89C52的P2.0~P2.3管脚,端选段A~G与DP分别接STC89C52的P0.0~P0.7管脚。
需要说明的是:
实际焊接电路时,数码管的位选端需要焊接三极管,否则数码管显示亮度将会非常暗。
5.6电机控制与驱动部分
电机的运行通过PWM波控制。
PWM波通过STC89C52的P2.4口输出。
说明:
测速部分用的是Motro-encode电机,实际用ST151实现测速,焊接电路如下图:
其中R1=510Ω,R2=4.7KΩ
ST内部电路:
5.7其他电路
复位电路如下所示:
完整仿真电路图:
六、软件部分设计
系统软件采用Keil集成开发环境开发
程序代码如下(带注释):
#include
sbitP2_0=P2^0;//数码管选定位
sbitP2_1=P2^1;
sbitP2_2=P2^2;
sbitP2_3=P2^3;
sbitP2_4=P2^4;//电机控制位
sbitkeysp0=P1^0;//电机转速为0的控制键
sbitkeysp30=P1^1;//电机转速为30的控制键
sbitkeysp60=P1^2;//电机转速为60的控制键
sbitkeysp100=P1^3;//电机转速为100的控制键
unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsignedintmotorspeed;//电机转速
unsignedcharGE,SHI,BAI,QIAN;//电机转速motorspeed的各个位
unsignedintcounter=0;//光电传感器脉冲数
unsignedintpwm;//pwm占空比
unsignedintmid;//占空比设置值
unsignedintcalsp;//设定多长时间计算一次速度
voiddisplay();//数码管显示电机速度
voiddelay();//延迟函数
voidcontrolpwm();//控制电机占空比
voidcalspeed();//计算电机速度,放于motorspeed变量中
voidkeyscan();//按键扫描
voidmain()
{
P2=P2&0x0f;
mid=0;
EA=1;//开启总中断
EX0=1;//开启外部中断0
IT0=1;//设置成下降沿触发方式
TMOD=0x01;//设置定时器0为模式1,即16位计数模式
TH0=(65536-10000)/256;//计数时间为10ms
TL0=(65536-10000)%256;
ET0=1;//开启定时器0中断
TR0=1;//启动定时器0
while
(1)
{
keyscan();
display();
controlpwm();
calspeed();
}
}
voidkeyscan()//键盘扫描
{
if(keysp0==0)
{
delay();//延迟防止抖动
if(keysp0==0)
mid=0;
}
if(keysp30==0)
{
delay();
if(keysp30==0)
mid=1;
}
if(keysp60==0)
{
delay();
if(keysp60==0)
mid=3;
}
if(keysp100==0)
{
delay();
if(keysp100==0)
mid=5;
}
}
voidcalspeed()
{
if(calsp>=100)//100*10ms=1s计算一次电机转速
{
motorspeed=counter/3;//转的圈数除以时间
counter=0;//清零脉冲数
calsp=0;//清零标志
}
}
voidcontrolpwm()
{
if(pwm>=0&&pwm{
P2_4=1;//电机加速
}
elseif(pwm>=mid&&pwm<10)
{
P2_4=0;//电机不加速
}
elsepwm=0;
}
void_TIMER0()interrupt1
{
TH0=(65536-10000)/256;//重新装入初值,计数时间为10ms
TL0=(65536-10000)%256;
pwm++;
calsp++;
}
void_INT0()interrupt0
{
counter++;//接受脉冲数
}
voiddisplay()//数码管显示函数
{
GE=motorspeed%10;
SHI=motorspeed/10%10;
BAI=motorspeed/100%10;
QIAN=motorspeed/1000%10;
P2_0=0;
P0=table[QIAN];
delay();
P0=0xff;
P2_0=1;
P2_1=0;
P0=table[BAI];
delay();
P0=0xff;
P2_1=1;
P2_2=0;
P0=table[SHI];
delay();
P0=0xff;
P2_2=1;
P2_3=0;
P0=table[GE];
delay();
P0=0xff;
P2_3=1;
}
voiddelay()//延迟函数
{
unsignedchari=10;
while(i--)
;
}
七.系统测试
测试方案:
测试包含仿真测试和硬件测试两个部分。
仿真测试指使用ProteusPro7.5对系统进行仿真测试。
主要测试系统电路的设计和验证程序逻辑的正确性。
硬件测试指系统搭建后对硬件电气性能的测试。
主要测试各功能的完整性可靠性,以及系统电气性能的稳定性。
测试工具为示波器万用表等。
仿真测试结果:
真测试中,系统运行正常,程序逻辑正确。
按键输入正常、数码管显示正确。
P2.4管脚间输出PWM波正常。
硬件测试结果:
系统硬件搭建完毕后,进行硬件测试。
系统加电后,振荡电路正常起振,STC89C52在时钟源电路的驱动下运行正常。
系统可在复位电路的作用下正常复位。
系统按键输入正常,并能够正确消除抖动。
系统PWM波输出正常。
将示波器接STC89C52的P2.4管脚,可观察到峰峰值5V左右的方波,频率与调速要求一致。
ST151传感器测量正常。
数码管转速显示正常,数码管可正确显示并正确显示电机转速。
八.设计中的问题分析
1、在最初的设计电路时中没有使用采用硬件消抖的方式来避免三个按键按下时带来的不稳定信号,录入数据往往出错,后来使用软件消抖来解决这个问题,但是由于按键复用程度比较高,因此软件消抖浪费了不少一部分系统资源,后来采用RC电路硬件消抖比较完美的解决了这个问题。
2、在硬件调试过程中出现过某些零件不灵的情况,根据已经画好的电路图使用外用表可以很快的查找到问题的所在。
经过简单的焊接处理即可解决。
后来为了避免频繁操作对焊接电路的影响,专门在单片机的上下焊接了支撑部件,用来防止板子上元器件以及后面的焊接线路收到影响,事实证明这个很大程度保护了单片机,方便了对单片机的操作。
3、在硬件电路完成后遇到的最大问题是无法将程序导入到单片机,通过深入的研究,发现通过单片机的串口可以很容易的连接上单片机,进而将hex程序写入到单片机中。
为此专门扩展了串口电路,并且完成了相应的软件实现和PC之间的通信。
4、在单片机和PC通信的时候通过单片机发送数据给PC的时候经常会出现乱码,无论发送什么字符还是十六进制数字都无法准确收到,后来经过研究,发现问题出在晶振上,我们选用了12M晶振,12M的晶振波特率只能是2400。
因为9600的情况下会有7.8%的误差,所以会产生乱码,而2400波特率的情况下误差是0.16%,这样就会相对准确的发送和接收信息。
九.实验总结
.参考资料
《系列单片机设计实例》楼然苗北京航空航天大学出版社2006.2
《单片机原理及应用》张红润清华大学出版社2008.11
《单片机应用系统开发综合实例》张萌清华大学出版社2007.7
《51单片机开发入门与典型实例》王守中人民邮电出版社2007.8
《单片机典型模块设计实例导航第二版》求是科技人民邮电出版社2008.7
《单片机原理及接口技术》李全利高等教育出版社2004.1
《C语言程序设计》王曙燕科学出版社2008.8
《VisualC++程序设计全程指南》杨友东电子工业出版社2009.4