这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 单片机在光谱仪控制及检测系统中的应用

共2条 1/1 1 跳转至

单片机在光谱仪控制及检测系统中的应用

工程师
2021-05-20 23:59:29     打赏



本文介绍使用单片机实现控制光谱仪的运作和对光谱仪出射信号光的检测。光谱仪是通过步进电机带动光栅转动,从而达到对信号光全波段的测量。只要实现对步进电机的控制即实现对光谱仪的控制。光谱仪的出射光通过光子计数器系统,成为具有与光强成一定比例的频率脉冲信号。只要完成对脉冲信号频率的测量即实现对光谱仪出射光的检测。单片机收集到出射光的频率参数,传送给计算机进行处理。计算机在此系统中提供良好的人机界面和进行数据处理、图形显示。


1硬件组成

为实现上述功能,系统组成有:AT89C51、MAX202、光子计数器、光谱仪和计算机。


单片机为ATMEL公司生产的AT89C51,此芯片具有和51系列单片机完全兼容的特性,其内部带4K字节Flash可编程可擦写只读存储器(PEROM)和128×8字节内部RAM ,本身即是一个完整的单片机最小系统,便不需要外接程序和数据存储器,大大减少系统功耗和时间。


MAX202是用来和计算机通信的电平转换芯片。计算机串行口输出电平是-15~+15V,而AT89C51使用的是0~+5V的电平。通过使用MAX202,可实现电平的转换。

光子计数技术是测量弱光功率的或光子速率的一种新技术 。光子计数器是由光电倍增管、宽带放大器、幅度比较器以及定时器和计数器组成。从光谱仪出射的微弱光信号经光电倍增管的阴极吸收后激发出光电子,经过倍增系统的放大,在输出端输出一脉冲半宽度为几到几十毫微秒的电流或电压信号,这个信号再经放大器和幅度比较器后被计数器计数,通过定时计数,便可得到光子速率,进而算出光功率。这里,光子计数器中的计数器和定时器由AT89C51的内部定时器/计数器T0完成。


整个系统的工作过程方框图如图1所示。


2单片机内软件编制

根据设计思想,为使单片机更好地与计算机通信及有效地进行控制和检测,单片机内的定时器/计数器T1用作串行口波特率发生器,定时器/计数器T0工作在方式3,此时,TH0作为定时器,TL0作为计数器。光子计数器中幅度比较器输出的脉冲信号送入单片机的外部引脚T0,可在被测信号每出现下跳沿时引起中断,计数器自动加1,以累加被测脉冲。因为中断计数的最高频率一般为振荡频率的1/24,本系统采用的是11.0592 MHz的串行通信用的标准晶振,就是说,计数的最高频率为460.8kHz。而幅度比较器输出的脉冲信号频率有时高达几十兆,所以此脉冲信号需要预先分频,再送入单片机的外部引脚T0。对光谱仪的控制是由单片机输出步进电机运行时所需的驱动脉冲来实现。因此,整个单片机程序分为七部分:主程序,定时中断服务程序,计数中断服务程序,读分频器内数值程序,串行通信程序,控制脉冲产生程序,时间延迟程序。下面将分别介绍各部分程序的编制方法。


定时器中断服务程序的作用主要是作1秒时间的精确定时。由于单片机的定时功能实际上是通过片内定时器对片内机器周期数进行计量来实现的,因此在单片机外接晶振11.0592MHz时,机器周期为晶振12分频后信号的周期:也就是1/921600秒。要实现1秒的定时,需计量921600个机器周期。而定时器T0工作在方式3时,只提供8位定时器TH0,最大只能计量256个周期,不能满足定时的要求。为此,必须借助于软件循环来扩大定时器的定时倍数。当程序设定的定时倍数为3600D时,定时器作256个周期的定时即可满足要求。由于AT89C51单片机的定时器/计数器是增量式计数器,实际装入计数器的初值应为定时数求补的结果,要作256个周期的定时,只要装入00H即可。为了使定时更加准确,可把T0设置成高中断优先级。这里有一个地方值得注意:即在中断服务程序里设计者要加入一定的程序代码,如给定时器装入初值等,这就势必增加定时的时间,所以,在计算定时周期时应考虑这些代码所占用的时间。下面举一个简单的例子,假设中断服务程序设定的定时倍数为100D,存入R7,定时器TH0初值装入00H,则程序为:

ST :DJNZR7,CONTINU;*


MOV R7,#64H

CONTINU:MOV TH0,#00H;*


RETI;*

由于定时中断服务程序中,每定时256个机器周期后,还要执行3条指令(见上,语句后有“*”的),一共6个机器周期,所以一次定时中断后,一共执行了262个机器周期。这是在程序编写中应该注意的。


在本系统中采用计数器TL0的中断服务程序来计数,当计数器TL0装入00H时,每产生一个计数中断,即256个脉冲后,把指定寄存器内容加1。为什么要这样做呢?因为该中断程序执行时间的长短直接决定了频率测量的上限。如果晶振为12MHz的话,则指令周期为1μs,如果TL0中断程序要执行50个机器周期,则电路允许测量的最高频率为20kHz;若执行时间为20个机器周期,则最高频率为50kHz。由此可见,编程时应尽量缩短中断服务程序。在计数256个脉冲以后再产生中断,这样不但可以少用一个8位寄存器,还可缩短中断服务程序,尽量提高允许测量的最高频率。


由上所述,采用中断法时电路允许测量的最高频率受到限制,所以幅度比较器的输出信号经过了分频。因此总的频率值除了计数器中断计数值外,还应把分频器中未产生进位溢出的数值读出,算入信号频率部分。数值的读入可通过P0和P2这两个端口来实现。这时,应该是对P0和P2口进行读引脚操作,而不是读锁存器操作。因此,在读数之前要先对端口置1,进行MOV P0,#FFH的操作。但在AT89C51的实际操作中有一点不同,这就是如果用:


MOVP0,#FFH


MOVA,P0

这样来读P0口的话,并不能读出正确值,而用:


MOV80H,#FFH


MOVA,80小时

80H为P0的位地址,这时才能正确读取数据。另外,在进行这部分数据读取时,还应注意一点,因为P0和P2口的主要功能是读取外部程序和数据存储器,其总线上的数据不稳定,因此对输入端幅度比较器的输出数据应进行锁存,以保证单片机正确地读取数值。

主程序主要包括为数据开辟存储区,设定其大小,设置控制标志位值,设置T1和T0的工作方式、定时初值、优先级高低以及软件循环倍数等等。如图2所示,其中的检测子程序包括上面提到的启动定时器TH0、计数器TL0,允许中断设置,清计数器,启动计数系统等等操作,限于篇幅,这里就不详细介绍。初始化子程序包括控制脉冲产生子程序,延迟子程序。


串行通信程序部分是为实现单片机和计算机之间的串行通信,把各种操作指令传给单片机。这里是利用单片机片内的串行I/O端口RXD和TXD,配合外设电路MAX202与计算机进行全双工串行异步通信的。AT89C51的串行口共有4种工作方式,本系统中使用的是方式1,这可通过写串行端口控制寄存器SCON来设定。单片机的串口工作在方式1时,为10位异步通信方式。其中,1个起始位(0),8个数据位(由低位到高位)和1个停止位。波特率由定时器T1的溢出率和SMOD位(其中SMOD是控制寄存器PCON中的一位控制位)的状态确定 。


一条写SBUF指令就可启动数据发送过程。在发送移位时钟(由波特率确定)的同步下,从TXD先送出起始位,然后是8位数据位,最后是停止位。这样的一帧10位数据发送完后,中断标志TI置位。


在允许接收的情况下(REN=1,通过写SCON设置),当RXD出现由1到0的负跳变时,即被当成是串行发送来的一帧数据的起始位,从而启动一次接收过程。当8位数据接收完,并检测到高电平停止位后,即把收到的8位数据装入SBUF,置位RI,一帧数据的接收过程就完成了。


此时的波特率BR(位/秒)计算式为BR=2SMOD/32×CeT1式中CeT1为定时器T1的溢出率。


下面举一个例子来说明对于不同波特率值的T1初值的求法。

T1作为波特率发生器时,一般是设置在方式2的运行状态,此时是8位自动加入时间常数的方式,T1的溢出率算式可表达为CeT1=fosc/12(256-x)

式中fosc为外部晶振的振荡频率,x为设置的初值,于是波特率表达式为


BR = 2SMOD / 32×fosc / 12(256-x)

由上式可见,选取不同的x初值,就可得到不同的波特率。

在本系统中fosc为11.0592MHz,波特率为9600位/秒,则由上式可得x=253


则TH1和TL1装入的初值为#0FDH。

在本部分程序编写时,有两个小技巧应该值得注意。一是前面提到的定时器T1工作方式的设置,让其工作在方式2下,可以让定时器的初值自动装入;另外一个是在进行数据串行接收和发送时,如果采用的是查询法,都是通过RI和TI的变化来判断,这时,在读或发完数据以后,应该用软件对RI和TI清0,


如:NJBRI,


CLRRI

但一般很容易忘记清0,如果采用下法,则较好:AR1:JBCRI,AR2;为“1”则清0SJMPAR1


AR2:……

这样一般不会出错,并且程序可读性增强了,也方便了今后的软件维护。


其它程序部分,如延时程序和脉冲产生程序比较简单,这里不介绍了。


3计算机部分程序设计

在计算机程序部分,主要是提供友好的人机界面,方便研究人员对整个系统进行操作。编制方法除了符合最一般的人机界面设计方法的要求外,这里面还涉及了与单片机的通信程序的编制问题。为了更好地控制单片机的运作,诸如何时发出对光谱仪的控制指令,发出何种控制指令,何时启动和停止光子计数系统等,这些都需要根据工作人员的需求,通过友好的人机界面对系统进行设置,再由通信程序传给单片机。这样便需要制定一套通信协议来说明不同的操作方式,单片机再根据这些协议进行运作。通信协议可根据方便好记的原则设计,这里就不详细讲了。至于怎样在Windows环境下实现串行通信程序,我们是利用


4实验结果


实验中,我们把红发光二极管作为发光光源,进行光谱测试,最后得到如图3所示的光谱图。


结束语

本系统中使用了单片机对光谱仪进行控制和信号检测,在保证检测精度和速度的基础之上,建立了与计算机的通信,使得研究人员能够通过友好的人机界面方便地操作和使用系统;同时又能充分利用单片机的系统资源,减轻计算机的工作量,便于计算机处理更加庞大的光谱数据和图形显示工作。在实践应用中,起到了较好的效果。




高工
2021-06-04 23:50:26     打赏
2楼

应用起来还是非常不错的


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]