尤锦江,陶辰宁,蔡建楠,朱思宇,李 炯,陈水桥
(1.浙江大学 竺可桢学院,浙江 杭州 310027;2.浙江大学 物理学系,浙江 杭州 310027)
“激光扫描成像”,指利用平面镜对光的反射,让激光打在屏幕上,形成高速移动的光斑。同时,利用人眼的视觉残留效应,让光斑的移动轨迹在人眼中形成一个图案。
一般来说,激光扫描都是利用两片反射镜来控制激光在两个正交方向的反射角度,从而控制光斑的移动的。对于屏幕上任意一个点,可以用直角坐标系坐标(X,Y)来描述。经过数学演算,可以将点(x,y)位置信息转化为平面镜转动的角度θ1,θ2,然后通过两台电机来实现平面镜的转动[1]。
本文设计了一套基于STM32单片机和DAC8562数模转换器的激光成像系统。使用两台伺服电机分别转动两片平面镜,实现激光光斑在X和Y方向的移动。先在电脑上确定好激光成像的图形、编写相应的代码,然后烧录到STM32单片机上,利用单片机产生坐标的数字信号,再用DAC8562数模转换器将数字信号转换为模拟信号,再将模拟信号输给振镜电机,从而实现激光扫描图像输出。本系统实现方法简单,操作方便,成本低廉,很适合作为实验教学仪器[2]。
振镜是一种特殊的摆动马达,基本原理是通电线圈在磁场中产生力矩,但与旋转电机不同,其转子上通过机械纽簧或电子的方法加有复位力矩,大小与转子偏离平衡位置的角度成正比,当线圈通以一定的电流而转子发生偏转到一定的角度时,电磁力矩与回复力矩大小相等,故不能像普通电机一样旋转,只能偏转,偏转角与电流成正比,与电流计一样,故振镜又叫电流计扫描振镜。
振镜的原理是:输入一个位置信号,摆动电机(振镜)就会按一定电压与角度的转换比例摆动一定角度[3]。整个过程采用闭环反馈控制,由位置传感器、误差放大器、功率放大器、位置区分器、电流积分器等五大控制电路共同作用。振镜的扫描原理见如下图1。
图1 振镜扫描原理示意图
a、b是振镜,通过转动振镜a和b可以使入射光束投影到XY平面的指定位置。设a、b振镜的X轴和Y轴的反射镜之间的距离为e,b振镜的轴线到视场平面坐标原点的距离为d,当X、Y轴的光学偏转角分别为θx和θy时,视场平面上相应光点坐标为(x,y),且当x=y=0时,θx=θy=0,则
(1)
(2)
振镜a、b的偏转角θx和θy与振镜a、b的控制电压Vx和Vy的关系为
θx=kx×Vx
(3)
θy=ky×Vy
(4)
其中kx、ky是系数[4]。
所以通过控制Vx和Vy就可以控制振镜a、b的偏转角度。
想要驱动振镜,一种办法是直接编写代码,让单片机根据代码产生输出的信号。在实际应用中,更多遇到的情形是给定一张图片,根据图片让激光打出对应的图案[5]。
此时就要设计一个程序,输入一张图片,程序对图片进行采样,生成一系列用坐标数据表示的“采样点”。当激光逐个扫过这些点的时候,形成的图案正好是图片中的物体。
具体的实现方法是将图像转化为灰度图,进而再转化为黑-白二值图,最后利用一定的算法生成轮廓点。
1.2.1 灰度计算公式
计算机内一般用RGB对颜色进行编码。每种颜色的取值范围为00h(对应十进制0)~FFh(对应十进制255)。0表示无,255表示最大光强[6]。
将某种颜色转化为灰度值,可以使用平均值法:
(5)
但由于人眼对三原色的感知能力不同,实际应用中更常用的是如下所示的著名心理学公式:
Gray=0.299R+0.587G+0.114B
(6)
则[Gray,Gray,Gray]就是原来[R,G,B]颜色灰化后的颜色。
1.2.2 彩色图转灰度图
图像的基本单位是一个像素,每像素又由R、G、B三种信息组成。所以,一个图像可以视为一个H×W×3的三维数组。H为图像的高度(垂直方向上像素个数),W为图像宽度(水平方向上像素个数),3指RGB三种信息[7]。将图像转化为灰度图,其实就是对每个像素求灰度。
下面是浙江大学徽标彩色图转化灰度图的效果图,见图2。
图2 彩色图转灰度图
1.2.3 灰度图转二值图
灰度图中每个像素仍然具有256种不同的信息量。为了便于采样,还需要将灰度图转化为“二值图”[8]。在二值图中,每个像素只有两个信息量:0和255。0代表黑色,255代表白色。
常用的转化方式是设定一个阈值“thresh”,当灰度超过这个阈值时,像素值设为255;小于等于这个阈值时,像素值设为0[9]。
(7)
当阈值“thresh”取不同的值时,能够产生不同的二值图,见如下图3。一般取能够使图像轮廓最清晰时的阈值,即图3(c)。
图3 不同的二值徽标图
出于“寻找轮廓”的需要,在本例中还要将图片取反,则变成图4所示。
图4 图片取反后的徽标图
1.2.4 寻找轮廓
本文使用在二值图像中提取值为“1”(即白色)的区域轮廓。
首先,考虑到一个图像中可能存在多个轮廓,因此需要对找出的轮廓进行“编号”。
定义:图像的框架(frame),是指图片的最外边的矩形轮廓(由图片的最上行、最下行、最左列、最右列像素构成),编号为1[10]。
采用“光栅扫描”法,从左往右、从上往下,先扫描第一行、再扫描下一行的方式寻找轮廓。寻找过程中设定两个变量:NBD记录当前追踪的轮廓B的编号,LNBD记录上一次追踪的轮廓B′的编号。每次扫描到新的一行的最左端时,都要把LNBD重设为1,表示上一次追踪的轮廓是frame[11]。下面是实现效果,见图5所示。
图5 徽标轮廓
本文设计的成像系统由图像取点采样、程序烧录、数模信号转换和振镜驱动四个部分。系统总框图见图6所示[12]。
图6 系统总框图
实现过程:(1)图像取点采样:根据图像的灰度得到图像的外部轮廓,然后得到轮廓每个点的坐标。(2)程序烧录:将得到的轮廓点坐标复制到成像程序,然后烧录进入STM32单片机中。(3)数模信号转换:DAC8562模块将STM32输出的离散的数字信号转换为连续变量的模拟信号。(4)振镜驱动:振镜中的伺服电机驱动器将DAC8562模块输出的电压信号转化为转矩和转速的控制信号,控制伺服电机运动。
2.1.1 STM32单片机
2.1.1.1 STM32基本功能
单片机是一种集成电路芯片[13]。STM32单片机是单片机的一种,它属于一个微控制器,适用于控制类,自带了各种常用通信接口,比如USART、I2C、SPI等,可接非常多的传感器,可以控制很多的设备。STM32单片机具有极高的性能、强大的软件支持、全面丰富的技术文档等诸多优点。
2.1.1.2 STM32模式设置
STM32可以设置GPIO模式。STM32 MCU允许 GPIO引脚被配置为8种模式,这种模式配置可以通过软件配置来实现,所谓GPIO即使用STM32的通用输入输出模式。其中,主要包含浮空输入、下拉输入、上拉输入、模拟输入、开漏复用输出、推挽输出、推挽复用输出、开漏输出等模式[14]。
同时,STM32可以进行I/O模式和速率的选择,通过采用软件进行编程,能够使STM32单片机输出50兆赫、10兆赫、2兆赫等不同的输出功率。
2.1.1.3 STM32内部结构
STM32的CPU采用的是72 MHZ,是零等待处理器,即在处理数据时不需要响应时间,在一个机器周期里就能实现乘除法运算[15]。
STM32内部组成主要如下图7所示。
图7 STM32内部组成
2.1.2 DAC8562数模转换器
2.1.2.1 DAC基本原理
DAC的全称是Digital-to-Analog Converter,中文名数模转换器,可以将离散的数字信号转换为连续变量的模拟信号的器件。
2.1.2.2 基本参数
DAC8562模块精度为16bit,也就是可以转化范围为[0,216-1],操作的电压为5 V,相对精度为12LSBINL。模块有输入逻辑单元、控制逻辑单元还有DAC。输入数据并不直接进行转换,而是先存到寄存器中,然后用控制逻辑单元进行控制。具体的控制时序见图8。
图8 DAC8562模块控制时序
最后输出的电压公式为
(9)
其中,n=16,DIN就是转换的16位二进制数,VREF为DAC的参考电压,Gain为一个参数,在使用内部参考时设置为2,不使用时设置为1。
2.1.3 DAC8562&STM32库函数设计
在驱动振镜时使用到了DAC8562.cpp和DAC8562.h两个库文件,可以进行初始化和转化的参数。
2.1.3.1 电压转换函数
传入的Voltage为连续的数据,范围为[-5,5],其中第四行的代码调整是因为芯片的输出范围,第五行代码将电压变成[0,216-1],第六行调整了在低电压下可能的误差,最后返回计算完离散的电压值。
2.1.3.2 初始化
这一段代码使用到了SPI库,DAC8562模块具体接线图见图9。
图9 DAC8562模块接线图
程序中先激活SPI,然后将SPI的模式设置为模式1,数据采样在时钟下降沿,数据转移在时钟的上升沿。并设置数据传输模式为从高位进入,然后开始对DAC模块的初始化阶段。
2.1.3.3 使用
使用时会调用writeA和writeB函数,因为有两个电机,因此一个函数对应控制其中的一个电机。
软件部分由三部分组成:DAC8562函数库、轮廓采样程序、STM32烧录程序。关系如图10所示。
图10 软件架构图
对求是鹰图像(图2)提取轮廓,根据所写的采样算法,获得了图像采样点的对应数据和成像结果,见如下图11所示。
图11 求是鹰激光图
经过分析,误差来源主要有如下几个方面:
(1)振镜系统误差
振镜系统的标定误差主要来源于光平面方程误差和系统安装误差两个方面。由系统标定原理可知,在空间中每两条相交的激光条纹可以确定一个光平面方程,因此激光条纹坐标的提取精度将直接决定光平面拟合的精度。系统安装误差主要来源于光平面与振镜转轴的安装误差。
(2)电机驱动能力有限
由实验数据部分可知,在扫过一些曲率半径小、尖角的地方(例如正方形的顶点),电机没法在给定的时间内转过指定的角度,所以会导致一些轮廓扫描不到。这是由于电机驱动能力有限导致的。激光扫描过程中要求光斑移动非常迅速(这样才能利用人眼视觉残留效应),但带来的后果就是电机驱动可能跟不上。
(3)DAC精度有限
使用RSS(root sum squared)的方法来进行误差估计,方程为
(10)
对于16位DAC8562来说,详细参数如下表1。
表1 DAC8562详细参数
为了计算TUE,需要将所有内容转换到同一个单位,转换为的数值如下表2所示:
表2 转换的数值
由此可以得到误差为±23LSBs或者是1.78 mV或者0.035 6%FSR。
(4)STM32单片机运算速度不够与STM32芯片的具体参数有关。微型计算机芯片的计算能力一般不如用户PC机。
本文设计了一套成熟的激光扫描成像系统,操作方便,只需要提供原始任意图片,就能用激光扫描出对应图案。还需要改进的有如下几方面:
(1)优化轮廓采样算法。在轮廓采样前可以用一些图像处理方法,消除原始图像的边缘噪音,这样可以使整个轮廓变得更加光滑。
(2)优化用户程序,让用户可以手动微调、添加、删除程序自动生成的采样点,使用更加灵活。
(3)实现STM32单片机和用户计算机之间的通讯功能。这需要给代码加上一些通讯协议。所有的数据都从用户计算机这里处理和发出,STM32只负责接收数据、发送数字信号。这样顺便也就解决了STM32运算能力有限和RAM有限的问题。
(4)提高伺服电机的驱动能力。