《电子技术应用》

基于AVR32和μC/OS-II系统的激光扫描系统的研究与设计

2014年微型机与应用第21期
孙琳洋,习友宝,贺梓超
((电子科技大学 电子工程学院,四川 成都 610054))
摘要: 激光振境扫描技术已广泛应用于激光打标、激光快速成型、物体轮廓提取、激光舞台等诸多领域,并以其优良的矢量扫描特性在机场泊位引导系统、车辆防撞体系、车场停泊系统中发挥着重要作用。在激光扫描系统中,需要实时掌握扫描物体的状态,处理大量的激光测距数据。本设计通过在AVR32微控制器上移植μC/OS-II系统,完成激光扫描系统的控制和激光数据的处理。本文介绍了激光扫描系统的系统组成、μC/OS-II系统在AVR32上的移植和μC/OS-II下软件的编写。经实际运行,证明该设计能很好地完成对运动目标跟踪等功能并且运行效率得到有效提高。

Abstract:

  摘 要: 激光振境扫描技术已广泛应用于激光打标、激光快速成型、物体轮廓提取、激光舞台等诸多领域,并以其优良的矢量扫描特性在机场泊位引导系统、车辆防撞体系、车场停泊系统中发挥着重要作用。在激光扫描系统中,需要实时掌握扫描物体的状态,处理大量的激光测距数据。本设计通过在AVR32微控制器上移植μC/OS-II系统,完成激光扫描系统的控制和激光数据的处理。本文介绍了激光扫描系统的系统组成、μC/OS-II系统在AVR32上的移植和μC/OS-II下软件的编写。经实际运行,证明该设计能很好地完成对运动目标跟踪等功能并且运行效率得到有效提高。

  关键词: AVR32;μC/OS-II;嵌入式操作系统;激光扫描

0 引言

  本设计利用激光振镜扫描[1-4]技术,通过AVR32控制,完成对静止物体和动态物体的扫描。针对硬件资源和软件设计要求,本设计裁剪了μC/OS-II操作系统,移植到AVR32上,通过在μC/OS-II系统下的编程,完成激光扫描系统的扫描和控制。

1 系统硬件构成

  激光振镜扫描技术是指通过微控制器MCU控制水平方向和垂直方向的步进电机转动的同时,让激光测距仪扫描。通过激光测距仪测得的距离数据,分析物体的状态。系统组成如图1所示。

001.jpg

  本设计选用的AVR32是一款32位的高性能处理器,选用步距角为1.8°的P850步进电机,实际工作中可根据精度要求对步距角进行细分。设计中令电机16细分,即电机每转一步,转动0.1125°。选用步进电机驱动器escap36。该驱动器具有RS485接口,可实现参数化的设定和控制,并且能根据实际工作对电机精度的要求,实现电机步距角的1~64的细分。

  此设计中所选用的邦纳LT300激光测距仪包含红色瞄准激光。该款激光测距仪激光准直性好,测量时间短,具有可编程的串行口以及数字量和模拟量输出,测量范围大,受环境干扰小。

2 μC/OS-II移植

  2.1 μC/OS-II文件结构

  移植在AVR32后的μC/OS-II的文件系统结构如图2所示。

002.jpg

  μC/OS-II是一种具有可剥夺实时内核的实时操作系统[5-7], 而且是免费公开源代码,结构小巧。其内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能, 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。最小内核可编译至 2 KB, 适合小型控制系统。与 CPU 硬件相关的部分用汇编语言编写,其他绝大部分代码采用 C 语言编写。μC/OS-II在硬件平台上的移植主要分为两大步骤:μC/OS-II中与处理器相关的程序的修改、应用程序的添加。

  2.2 移植代码

  移植μC/OS-II操作系统主要包括OS_CPU.H、OS_CPU_A.S、OS_CPU_C.C三个文件。其中OS_CPU.H主要定义了处理器中的数据类型,以及与处理器相关的宏定义,例如全局中断的开关等。OS_CPU_A.S文件中代码是实现上下文切换以及中断实现的具体代码,这些代码主要负责保护好当前任务现场,并且将程序指针和堆栈指针指向新的任务区域,是整个移植的关键部分。OS_CPU_C.C集中了处理器相关的C代码。

  本文以OSCtxSw()函数、OSCtxRestore()函数为例。OSCtxSw()函数用来使一个更高优先级的任务处于就绪状态,它所需做的具体工作主要有以下几个方面:保存当前CPU寄存器的状态、保护当前任务栈的状态以及更新程序指针。其伪代码如下:

  void OSCtxSw (void)

  { /*保存寄存器*/

  Save processor registers;

  /*保存当前任务栈地址*/

  OSTCBCur->OSTCBStkPtr = SP;

  /*任务切换的钩子函数(可以省略)*/

  OSTaskSwHook();

  /*更高优先级任务*/

  OSTCBCur=OSTCBHighRdy;

  OSPrioCur = OSPrioHighRdy;

  /*完成任务切换*/

  OSCtxRestore(OSTCBHighRdy->OSTCBStkPtr)

  }

  OSCtxRestore()函数是任务级的任务切换函数,具体工作主要是更新链接寄存器LR并将堆栈指针指向新的任务栈,具体实现如下:

  OSCtxRestore:

  LDM R12, R0-R7 /*恢复R0-R7*/

  LD.D R8, R12[14*4] /*恢复R8-R9*/

  LD.D R10, R12[8*4] /*恢复PC、SR*/

  ST.D R12[14*4], R10 /*存储PC、SR*/

  SUB R12, -10*4 /*将指针指向 LR*/

  UB SP, R12, -4*4 /*恢复栈指针*/

  LDM R12, R10-R12, LR恢复R10-R12,LR*/

  RETS /*从SCALL返回*/

  2.3 板级支持包BSP的编写

  本次设计是基于激光扫描系统的控制板,编写板级支持包BSP[8]将有助于对底层的封装,便于上层用户程序的开发。根据激光扫描系统的需求,设计中对AVR32 UC3系列编写了串口USART、GPIO口、时钟Timer以及中断的BSP。下面以GPIO服务函数为例进行介绍。

  AVR32中每个I/O口可以实现多达4个外部设备接口。当一个I/O口被指定为外部接口时,该I/O口就为该外部设备控制。通过寄存器PMR0和PMR1来决定4个外部设备中哪个设备来控制该I/O口。当一个I/O口被指定为普通的I/O时,寄存器ODER的值决定了该I/O引脚的值。因此,编写函数BSP_GPIO_SetFnct()来封装与引脚配置相关的寄存器,从而配置一个引脚的功能,而不用每次都去直接操作寄存器。AVR32的端口与引脚的GPIO口号对应关系如式(1)和式(2)所示:

  GPIO port= floor((GPIO number) / 32) (1)

  GPIO pin = (GPIO number) mod 32 (2)

  其中,式(1)表示取GPIO口号除以32的商作为该GPIO口所在的端口号;式(2)表示取GPIO口号除以32的余商作为该GPIO口所在的端口里的第几位。

  函数BSP_GPIO_SetFnct()的代码如下:

  void BSP_GPIO_SetFnct (CPU_INT16U pin, CPU_INT08U fnct)

  {

  volatile avr32_gpio_port_t *gpio_port;

  /* 得到引脚号*/

  gpio_port= &AVR32_GPIO.port[pin/32];

  switch (fnct) {

  case 0: /* 若选择引脚的外部设备功能0*/

  gpio_port->pmr0c = 1 << (pin % 32);

  gpio_port->pmr1c = 1 << (pin % 32);

  break;

  case 1: /* 若选择引脚的外部设备功能1*/

  gpio_port->pmr0s = 1 << (pin % 32);

  gpio_port->pmr1c = 1 << (pin % 32);

  break;

  case 2: /* 若选择引脚的外部设备功能2*/

  gpio_port->pmr0c = 1 << (pin % 32);

  gpio_port->pmr1s = 1 << (pin % 32);

  break;

  case 3: /* 若选择引脚的外部设备功能3*/

  gpio_port->pmr0s = 1 << (pin % 32);

  gpio_port->pmr1s = 1 << (pin % 32);

  break;

  }

  /*将引脚设置为普通的GPIO口 */

  gpio_port->gperc = 1 << (pin % 32);

  }

  在设置了GPIO口的功能之后,编写3个函数,可以根据需要改变引脚的值,如表1所示。

006.jpg

3 μC/OS-II下应用程序的编写

  3.1 μC/OS-II系统的裁剪

  在编写应用程序之前,需要根据实际所需资源对μC/OS-II系统进行裁剪[9],使编译生成的操作系统所占的系统内存达到最小。头文件OS_CFG.H声明相应功能的配置常量,通过μC/OS-II中的条件编译,生成所需要的功能函数。函数中声明的配置常量如表2所示。

007.jpg

  3.2 应用程序编写

  激光扫描系统中,需要对激光测距仪、水平方向的步进电机、垂直方向的步进电机[10]进行控制,通过对激光测距仪返回的测量数据进行分析。根据分析结果,判断刚才扫描的是静止物体还是动态物体,决定要发送的下一条命令。

  在系统工作中,需要同时执行电机转动[11]和激光测距,因此建立了任务MoveMeasure。由于在工作中,不同的应用对激光测距仪的参数要求不同,因此建立了任务LDMConfig,通过信号量LDM_SEM来同步任务LDMConfig和任务Move_Measure。当激光测距仪测距结束时,通过信号量LDM_DATA启动任务DataLDM。再通过信号量DATA_SEM启动任务DATADispose。当任务DATADispose完成数据的处理后,根据处理结果,决定下一条要发送的命令,并通过消息邮箱CMD_MBOX把要执行的命令发送给任务Move_Measure。任务Move_Measure根据CMD_MBOX控制电机和激光测距仪工作。任务间的流程如图3所示。

003.jpg

4 试验验证

  4.1 试验

  试验中使用一个长45 cm、宽45 cm的长方体,在该长方体的一侧边沿连接一个高45 cm、长50 cm的平面板。使相邻的平板的板面错开,形成一个类似方波形状的物体,如图4所示。激光扫描系统距离最近的平板板面的距离为14 m,距离最远的平板板面的距离为20 m。

004.jpg

  系统上电后,先通过激光测距仪的红色瞄准激光固定好激光测距仪和双振镜的位置,使激光扫描系统位于相连板面的中间。然后关闭红色瞄准激光。让激光扫描系统开始工作,进行物体轮廓扫描。

  4.2 实验结果


005.jpg

  将实验距离测量数据按照距离值分布,如图5所示,横坐标数值表示数据点个数,纵坐标数值表示距离值。从测量数据的分布显示波形看,落在板子正面上的点为16个,电机每走一步的角度为0.112 5°,激光扫描系统距试验板的最近距离为14 m,因此电机每走一步转过的水平距离为tan(0.112 5°)×1 400≈27(mm)。扫描的板子正面的长度为27×17=459(mm),与板子正面的实际长度45 cm误差2%,满足通过激光扫描描绘物体外围轮廓的精度要求。图形正确地表现了所摆放的平板的图形。

5 结束语

  基于AVR32和μC/OS-II系统的激光扫描系统可以很好地实现对物体的多次扫描和物体轮廓的点云数据的获取。但由于μC/OS-II系统本身只是一个微内核,功能相对简单,因此下一步将继续研究基于Linux操作系统的激光扫描系统,实现扫描数据的曲线图的实时显示,动态把握扫描过程。

参考文献

  [1] 刘文. 基于FPGA技术的激光测距系统研究[D]. 南京:南京理工大学,2007.

  [2] 韩万鹏,蒙文,李云霞,等. 双振镜激光扫描的误差分析及校正方 法[J]. 光电技术应用, 2011, 26(4):14-18.

  [3] 邢刚, 徐冬生,夏云,等. 基于CPLD的多目标脉冲激光测距系统的设计与实现[J]. 激光与红外,2010, 40(2):152-154.

  [4] 刘文. 基于FPGA技术的激光测距系统研究[D]. 南京:南京理工大学,2007

  [5] 邵贝贝. 嵌入式实时操作系统μC/OS-II[M]. 北京: 北京航天航空大学出版社,2003.

  [6] 黄燕平. μC/OS-IIARM移植要点详解[M]. 北京: 北京航空航天大学出版社,2005.

  [7] 黄杰. μC/OS-II在ARM系列单片机S3C44B0x上的移植[J]. 现代电子技术, 2009(18): 44-45.

  [8] 陈是知. μC/OS-II内核分析、移植与驱动开发[M]. 北京:人民邮电出版社, 2007.

  [9] 周航慈. 基于嵌入式实时操作系统的程序设计[M]. 北京:北京航空航天大学出版社, 2011.

  [10] 闫剑虹, 何泰祥. 步进电机高速启停控制的单片机实现[J]. 空间电子技术,2009(2):124-128.

  [11] 贺启波. AVR32的便携式无线医疗点滴监控系统[J]. 单片机与嵌入式系统应用,2012(9): 52-55.


继续阅读>>