光栅式位移测量仪的设计.docx
《光栅式位移测量仪的设计.docx》由会员分享,可在线阅读,更多相关《光栅式位移测量仪的设计.docx(19页珍藏版)》请在冰豆网上搜索。
![光栅式位移测量仪的设计.docx](https://file1.bdocx.com/fileroot1/2023-6/13/1f1dcfbd-cfeb-4474-8096-9909fdad8513/1f1dcfbd-cfeb-4474-8096-9909fdad85131.gif)
光栅式位移测量仪的设计
1、系统工作原理
1.1光栅位移传感器的原理
光栅位移传感器通过主光栅(即标尺光栅)与位移部件固定连接,随着主光栅和副光栅(即指示光栅)进行相对位移,栅线间夹角为θ,则光栅组透光部分呈菱形,综合效果是一组等间距亮带,即形成了莫尔条纹。
光栅位移传感器位移时莫尔条纹也移动,经过光电器件转换使黑白相间的条纹转换成正弦波变化的电信号。
(a)长光栅结构(b)莫尔条纹的形成
图1莫尔条纹的原理
电信号再经过放大器放大、整形电路整形,细分、辨向等电路,最终送到单片机对移动的莫尔条纹进行计数,运算后送到LCD屏显示。
1.2系统整体设计框图
系统整体框图如图2所示:
图2系统整体框图
光栅尺移动产生莫尔条纹,光栅传感器检测后产生近似正弦波的电信号。
该电信号经过放大、整形电路将正弦信号变成方波,再经四细分、辨向电路实现模拟信号到数字信号的转变,省去了模-数转换的部分使电路简单,编程容易。
细分信号输入到单片机T0口进行计数,通过程序运算,再由LCD屏显示出运算结果。
二、系统硬件设计
2.1放大电路设计
采用同向比例放大电路,如图3:
图3同向比例放大电路
同相比例放大电路结构简单,比较常用,放大倍数易于调整。
采用LM324系列运算放大器(引脚图如图4),是价格便宜的差动输入功能的四运算放大器。
可工作在单电源下,电压范围是3.0V-32V。
LM324的特点:
1.短跑保护输出
2.真差动输入级
3.可单电源工作:
3V-32V
4.低偏置电流:
最大100nA(LM324A)
5.每封装含四个运算放大器。
6.具有内部补偿的功能。
7.共模范围扩展到负电源
8.行业标准的引脚排列
图4LM324引脚图9.输入端具有静电保护功能
2.2整形电路设计
图5可以把幅值为0.7v~15v的正弦波转换为方波。
NE5532为一个滞回比较器,把正弦波转化为有正负值的方波,再接一级LM311,可以使方波只有5v和0v电压值。
NE5532A是一种双运放高性能低噪声运算放大器。
相比较大多数标准运算放大器,如1458,它显示出更好的噪声性能,提高输出驱动能力和相当高的小信号和电源带宽。
这使该器件特别适合应用在高品质和专业音响设备,仪器控制电路和电话通道放大器。
LM311的电压比较器设计运行在更宽的电源电压:
从标准的±15V运算放大器到单5V电源用于逻辑集成电路。
其输出兼容RTL,DTL和TTL以MOS电路。
此外,他们可以驱动继电器,开关电压高达50V,电流高达50mA。
图5整形电路
2.3细分辨向电路的设计
四细分辨向电路如下,图6:
图6四细分辨向电路
为了提高系统分辨率,需要对莫尔条纹进行细分,为记录光栅上移过的条纹数目和判断光栅的移动率等,光电转换器件采用4极硅光电池来接收莫尔条纹信号。
调整莫尔条纹的宽度B,使它正好与2个硅光电池的宽度相同。
则可直接获得在相位上依次相差90°的2路信号,进行4倍细分。
位移除了有大小的属性外,还具有方向的属性。
为了辨别标尺光栅位移的方向,本设计采用的是2个硅光电池来接收莫尔条纹信号,则输出的2路信号在相位上相差90°,W-光栅的栅距,x-标尺光栅位移量。
2个硅光电池输出的2路信号:
Ua=U0+UmSIN(
)
Ub=U0+UmSIN(
+90°)=U0+UmCOS(
)
位移为矢量,有方向和大小,判向电路输出的加法和减法计数脉冲表示位移的方向和大小。
2.4单片机及其附属电路
系统中的单片机采用AT89C52系列, AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央 处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。
AT89C52有40个引脚(引脚图如图7),32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。
图7AT89C52引脚图
AT89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。
主要功能特性:
· 兼容MCS51指令系统
· 8k可反复擦写(>1000次)Flash ROM
· 32个双向I/O口
· 256x8bit内部RAM
· 3个16位可编程定时/计数器中断
· 时钟频率0-24MHz
· 2个串行中断
· 可编程UART串行通道
· 2个外部中断源
· 共6个中断源
· 2个读写中断口线
· 3级加密位
· 低功耗空闲和掉电模式
· 软件设置睡眠和唤醒功能
单片机的连接图如图8:
图8单片机连线图
AT89C52的复位电路和晶振电路在图8的左上角,晶振为12MHz。
图中P2口连接LCD液晶显示屏,作为屏幕的数据接口(其他有关LCD屏的连接在下一节中介绍),P3^4接四细分后的脉冲输出,作为单片机的脉冲信号输入端进行计数。
2.5LCD液晶显示屏的设计
液晶显示器简称LCD(LiquidCrystalDiodes)是利用液晶经过处理后能够改变光线传输方向的特性,达到显示字符或者图形的目的。
其特点是体积小、重量轻、功耗极低、显示内容丰富等特点,在单片机应用系统中有着日益广泛的应用。
2.5.1LCD显示模块LCDM
在实际应用中,用户很少直接设计LCD显示器驱动接口,一般是直接使用专用的LCD显示驱动器和LCD显示模块LCDM。
LCDM是把LCD显示屏、背景光源、线路板和驱动集成电路等部件构造成一个整体,作为一个独立部件使用。
其特点是功能较强、易于控制、接口简单,在单片机系统中应用较多。
其内部结构如下页图所示。
LCDM一般带有内部显示RAM和字符发生器,只要输入ASCII码就可以进行显示。
实物图见图9。
图9LCD模块外观
图10液晶显示器基本结构
液晶屏其结构如图10,液晶显示器LCD是一种极低功耗显示器,其应用特别广泛。
目前常用的LCD是根据液晶的扭曲-向列效应原理制成的。
这是一种电场效应,夹在两块导电玻璃电极之间的液晶经过一定处理后,其内部的分子呈90°的扭曲,这种液晶具有旋光特性。
当线形偏振光通过液晶层时,偏振面回旋转90°。
当给玻璃电极加上电压后,在电场的作用下液晶的扭曲结构消失,其旋光作用也随之消失,偏振光便可以直接通过。
当去掉电场后液晶分子又恢复其扭曲结构。
把这样的液晶放在两个偏振之间,改变偏振片的相对位置就可得到黑底白字或白底黑字的显示形式。
LCD的响应时间为毫秒级,域值电压为3~20V,功耗为5~100mW/cm2.
2.5.2设计中LCD液晶屏的连线
基于LCD显示块低功耗、短响应时间以及适应低频工作的特点,设计者选用LCD显示器完成显示部分的功能,并且使用静态驱动。
所选的LCD型号为1601。
1601是一款最常用也是最便宜的液晶显示屏。
1601的意思是每行显示16个字符,一共可以显示一行。
1601可显示内部字符,也可以显示自定义字符。
1601液晶的引脚图如图11所示。
图11LCD1601液晶屏引脚图
接口说明如下:
①液晶1,2端为电源;15、16为背光电源;在15脚串接一个10欧姆电阻用于限流。
②液晶3端为液晶对比度调节端,通过一个10K欧姆电位器接地来调节液晶显示对比度。
③液晶4端为向液晶控制器写数据/写命令选择端,接单片机的P3.0口。
④液晶5端为读/写选择端,因为我们不从液晶读取任何数据,只向其写入命令和显示数据,因此此端始终选择写状态,我们直接将它接地。
⑤液晶6端为使能信号,是操作时必需的信号,接单片机的P3.2口
⑥液晶7-14端为八位数据口,接单片机的P2口。
三、系统软件设计
把计数脉冲接到单片机的片内计数器T0端即可,相对外部计数芯片来说,使用软件方法电路相对要简单的多。
下图为程序流程图:
图12系统程序流程图
四、系统仿真电路图
用protues软件画出电路图,整体电路图如图13:
图13系统整体电路图
总结
两周的测控系统原理与设计课程设计终于顺利完成了,其中包含着快乐,也有辛酸。
我们选的设计题目是“光栅位移测量仪的设计”,大家都觉得这个题目是比较简单的。
其实不然,做了之后,发现设计电路虽然简单,但我们认为它真正困难的地方是程序设计,不过在我们同心努力下最终完成了。
我们刚选该题目时,真的是一头雾水,硬件电路不知如何下手,更何谈解决程序那块,因为我们所学的都是单片机方面的理论知识,应用到实践中去还比较少。
不过,我们俩人也没偷下懒,迅速分工去查阅和收集资料。
我们去了图书馆借一些参考书,上网找一些相关资料,并且请教指导老师。
通过不断努力,终于把设计的思路和模型定了下来,并最终完成了设计。
本文对单片机用于位移测量的理论、原理进行了系统的分析、比较,并对每种测量方法定性、定量的予以阐述,设计了显示接口电路和应用程序。
以下从三个方面进行总结:
硬件电路
本系统采用89C52单片机,充分利用单片机内部自带的16位定时计数器进行设计,较完全的开发了单片机自身的功能,接口利用了89C52的I/O口具有较大的电流驱动能力的特点,直接由单片机驱动,简化了硬件电路。
有一定的实用价值和较高的性价比。
测量方法
在测量原理上采用了利用单片机内部计数器实现可逆计数的测量方法,保证了在位移测量中获得较高的精度。
应用范围广泛,可通过扩展进行二次开发。
程序调试
本系统进行了全面的程序设计,显示程序、中断服务程序和初始化程序,并对这些程序在KeilU4软件上进行编译和调试,并且与Proteus进行了联机仿真,取得了较好的仿真效果。
Keil的编译HEX文件还可通过编程器写入芯片中。
这次的设计基本达到了设计的要求.
参考文献
1.王福瑞等.《单片微机测控系统设计大全》.北京航空航天大学出版社,1999
2.《现代测控技术与系统》韩九强清华大学出版社2007.9
3.《智能仪器》程德福,林君主编机械工业出版社2005年2月
4.《测控仪器设计》浦昭邦,王宝光主编机械工业出版社2001
5.基于AT89C51单片机的数字电压表的设计,黄亮,电子制作,2006.10,25-27
6.《误差理论与数据处理》,费业泰.机械工业出版社,2010
7.KeilC51帮助文档
附录一元器件清单
器件类型
器件名
数量
单片机
AT89C52
1
集成运放
LM324
2
集成运放
LM311
2
集成运放
NE5532
2
电容
C
7
电阻
R
21
开关
按键开关
1
液晶屏
LCD1601
1
与门
74LS08
11
变阻器
RV1
1
晶振
X1
1
非门
74LS04
4
或非门
7425
2
附录二程序代码
#include
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP2
sbitRS=P3^0;//定义端口(显示屏)
sbitRW=P3^1;
sbitEN=P3^2;
voidLCD_Init(void);
voidinti()
{LCD_Init();
TMOD=0x05;//*T0为16位计数方式*/
TH0=F0;
TL0=60;//*预置初值*/
TR0=1;
}
//单片机计算脉冲数显示
uintnum;//计数变量声明
/*延时子程序********************/
voiddelay(uintxms)
{
uintj;
for(;xms>0;xms--)
for(j=110;j>0;j--);
}
voidDelayUs2x(unsignedchart)
{
while(--t);
}
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
bitLCD_Check_Busy(void)
{
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return(bit)(DataPort&0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
voidLCD_Write_Com(unsignedcharcom)
{
//while(LCD_Check_Busy());//忙则等待
DelayMs(5);
RS_CLR;
RW_CLR;
EN_SET;
DataPort=com;
_nop_();
EN_CLR;
}
/*------------写入数据函数-----------------------------
voidLCD_Write_Data(unsignedcharData)
{
//while(LCD_Check_Busy());//忙则等待
DelayMs(5);
RS_SET;
RW_CLR;
EN_SET;
DataPort=Data;
_nop_();
EN_CLR;
}
/*----------------清屏函数----------------------*/
voidLCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*---------------写入字符函数---------------------*/
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
{
if(y==0)
{
LCD_Write_Com(0x80+x);
}
else
{
LCD_Write_Com(0xC0+x);
}
LCD_Write_Data(Data);
}
/*--------------初始化函数---------------------*/
voidLCD_Init(void)
{
LCD_Write_Com(0x38);/*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);/*显示关闭*/
LCD_Write_Com(0x01);/*显示清屏*/
LCD_Write_Com(0x06);/*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C);/*显示开及光标设置*/
}
/*主程序**********************************/
voidmain()
{
inti();
while
(1)
{
floatnum1,num2,num;
Data=TH0*255+TL0;//读计数器数据
if(Data==4000){TH0=F0;TL0=60;TR0=0;}//计满清零
num1=Data/4*0.05;
num2=0.05/4*(Data%4);
num=num1+num2;
LCD_Write_Char(x,y,num);
}
}