摘 要: 激光振境掃描技術已廣泛應用于激光打標、激光快速成型、物體輪廓提取、激光舞臺等諸多領域,并以其優良的矢量掃描特性在機場泊位引導系統、車輛防撞體系、車場停泊系統中發揮著重要作用。在激光掃描系統中,需要實時掌握掃描物體的狀態,處理大量的激光測距數據。本設計通過在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所示。
本設計選用的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所示。
μ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所示。
3 μC/OS-II下應用程序的編寫
3.1 μC/OS-II系統的裁剪
在編寫應用程序之前,需要根據實際所需資源對μC/OS-II系統進行裁剪[9],使編譯生成的操作系統所占的系統內存達到最小。頭文件OS_CFG.H聲明相應功能的配置常量,通過μC/OS-II中的條件編譯,生成所需要的功能函數。函數中聲明的配置常量如表2所示。
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所示。
4 試驗驗證
4.1 試驗
試驗中使用一個長45 cm、寬45 cm的長方體,在該長方體的一側邊沿連接一個高45 cm、長50 cm的平面板。使相鄰的平板的板面錯開,形成一個類似方波形狀的物體,如圖4所示。激光掃描系統距離最近的平板板面的距離為14 m,距離最遠的平板板面的距離為20 m。
系統上電后,先通過激光測距儀的紅色瞄準激光固定好激光測距儀和雙振鏡的位置,使激光掃描系統位于相連板面的中間。然后關閉紅色瞄準激光。讓激光掃描系統開始工作,進行物體輪廓掃描。
4.2 實驗結果
將實驗距離測量數據按照距離值分布,如圖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.