摘 要: 激光振境掃描技術(shù)已廣泛應(yīng)用于激光打標(biāo)、激光快速成型,、物體輪廓提取,、激光舞臺(tái)等諸多領(lǐng)域,并以其優(yōu)良的矢量掃描特性在機(jī)場(chǎng)泊位引導(dǎo)系統(tǒng),、車輛防撞體系,、車場(chǎng)停泊系統(tǒng)中發(fā)揮著重要作用。在激光掃描系統(tǒng)中,,需要實(shí)時(shí)掌握掃描物體的狀態(tài),,處理大量的激光測(cè)距數(shù)據(jù)。本設(shè)計(jì)通過(guò)在AVR32微控制器上移植μC/OS-II系統(tǒng),,完成激光掃描系統(tǒng)的控制和激光數(shù)據(jù)的處理,。本文介紹了激光掃描系統(tǒng)的系統(tǒng)組成、μC/OS-II系統(tǒng)在AVR32上的移植和μC/OS-II下軟件的編寫,。經(jīng)實(shí)際運(yùn)行,,證明該設(shè)計(jì)能很好地完成對(duì)運(yùn)動(dòng)目標(biāo)跟蹤等功能并且運(yùn)行效率得到有效提高。
關(guān)鍵詞: AVR32;μC/OS-II,;嵌入式操作系統(tǒng),;激光掃描
0 引言
本設(shè)計(jì)利用激光振鏡掃描[1-4]技術(shù),通過(guò)AVR32控制,,完成對(duì)靜止物體和動(dòng)態(tài)物體的掃描,。針對(duì)硬件資源和軟件設(shè)計(jì)要求,本設(shè)計(jì)裁剪了μC/OS-II操作系統(tǒng),,移植到AVR32上,,通過(guò)在μC/OS-II系統(tǒng)下的編程,完成激光掃描系統(tǒng)的掃描和控制,。
1 系統(tǒng)硬件構(gòu)成
激光振鏡掃描技術(shù)是指通過(guò)微控制器MCU控制水平方向和垂直方向的步進(jìn)電機(jī)轉(zhuǎn)動(dòng)的同時(shí),讓激光測(cè)距儀掃描,。通過(guò)激光測(cè)距儀測(cè)得的距離數(shù)據(jù),,分析物體的狀態(tài)。系統(tǒng)組成如圖1所示,。
本設(shè)計(jì)選用的AVR32是一款32位的高性能處理器,,選用步距角為1.8°的P850步進(jìn)電機(jī),實(shí)際工作中可根據(jù)精度要求對(duì)步距角進(jìn)行細(xì)分,。設(shè)計(jì)中令電機(jī)16細(xì)分,,即電機(jī)每轉(zhuǎn)一步,轉(zhuǎn)動(dòng)0.1125°,。選用步進(jìn)電機(jī)驅(qū)動(dòng)器escap36,。該驅(qū)動(dòng)器具有RS485接口,可實(shí)現(xiàn)參數(shù)化的設(shè)定和控制,,并且能根據(jù)實(shí)際工作對(duì)電機(jī)精度的要求,,實(shí)現(xiàn)電機(jī)步距角的1~64的細(xì)分。
此設(shè)計(jì)中所選用的邦納LT300激光測(cè)距儀包含紅色瞄準(zhǔn)激光,。該款激光測(cè)距儀激光準(zhǔn)直性好,,測(cè)量時(shí)間短,具有可編程的串行口以及數(shù)字量和模擬量輸出,,測(cè)量范圍大,,受環(huán)境干擾小。
2 μC/OS-II移植
2.1 μC/OS-II文件結(jié)構(gòu)
移植在AVR32后的μC/OS-II的文件系統(tǒng)結(jié)構(gòu)如圖2所示,。
μC/OS-II是一種具有可剝奪實(shí)時(shí)內(nèi)核的實(shí)時(shí)操作系統(tǒng)[5-7], 而且是免費(fèi)公開(kāi)源代碼,,結(jié)構(gòu)小巧。其內(nèi)核提供任務(wù)調(diào)度與管理,、時(shí)間管理,、任務(wù)間同步與通信、內(nèi)存管理和中斷服務(wù)等功能, 具有執(zhí)行效率高、占用空間小,、實(shí)時(shí)性能優(yōu)良和可擴(kuò)展性強(qiáng)等特點(diǎn),。最小內(nèi)核可編譯至 2 KB, 適合小型控制系統(tǒng)。與 CPU 硬件相關(guān)的部分用匯編語(yǔ)言編寫,,其他絕大部分代碼采用 C 語(yǔ)言編寫,。μC/OS-II在硬件平臺(tái)上的移植主要分為兩大步驟:μC/OS-II中與處理器相關(guān)的程序的修改、應(yīng)用程序的添加,。
2.2 移植代碼
移植μC/OS-II操作系統(tǒng)主要包括OS_CPU.H,、OS_CPU_A.S、OS_CPU_C.C三個(gè)文件,。其中OS_CPU.H主要定義了處理器中的數(shù)據(jù)類型,,以及與處理器相關(guān)的宏定義,例如全局中斷的開(kāi)關(guān)等,。OS_CPU_A.S文件中代碼是實(shí)現(xiàn)上下文切換以及中斷實(shí)現(xiàn)的具體代碼,,這些代碼主要負(fù)責(zé)保護(hù)好當(dāng)前任務(wù)現(xiàn)場(chǎng),并且將程序指針和堆棧指針指向新的任務(wù)區(qū)域,,是整個(gè)移植的關(guān)鍵部分,。OS_CPU_C.C集中了處理器相關(guān)的C代碼。
本文以O(shè)SCtxSw()函數(shù),、OSCtxRestore()函數(shù)為例,。OSCtxSw()函數(shù)用來(lái)使一個(gè)更高優(yōu)先級(jí)的任務(wù)處于就緒狀態(tài),它所需做的具體工作主要有以下幾個(gè)方面:保存當(dāng)前CPU寄存器的狀態(tài),、保護(hù)當(dāng)前任務(wù)棧的狀態(tài)以及更新程序指針,。其偽代碼如下:
void OSCtxSw (void)
{ /*保存寄存器*/
Save processor registers;
/*保存當(dāng)前任務(wù)棧地址*/
OSTCBCur->OSTCBStkPtr = SP;
/*任務(wù)切換的鉤子函數(shù)(可以省略)*/
OSTaskSwHook();
/*更高優(yōu)先級(jí)任務(wù)*/
OSTCBCur=OSTCBHighRdy;
OSPrioCur = OSPrioHighRdy;
/*完成任務(wù)切換*/
OSCtxRestore(OSTCBHighRdy->OSTCBStkPtr)
}
OSCtxRestore()函數(shù)是任務(wù)級(jí)的任務(wù)切換函數(shù),具體工作主要是更新鏈接寄存器LR并將堆棧指針指向新的任務(wù)棧,,具體實(shí)現(xiàn)如下:
OSCtxRestore:
LDM R12, R0-R7 /*恢復(fù)R0-R7*/
LD.D R8, R12[14*4] /*恢復(fù)R8-R9*/
LD.D R10, R12[8*4] /*恢復(fù)PC,、SR*/
ST.D R12[14*4], R10 /*存儲(chǔ)PC、SR*/
SUB R12, -10*4 /*將指針指向 LR*/
UB SP, R12, -4*4 /*恢復(fù)棧指針*/
LDM R12, R10-R12, LR恢復(fù)R10-R12,LR*/
RETS /*從SCALL返回*/
2.3 板級(jí)支持包BSP的編寫
本次設(shè)計(jì)是基于激光掃描系統(tǒng)的控制板,,編寫板級(jí)支持包BSP[8]將有助于對(duì)底層的封裝,,便于上層用戶程序的開(kāi)發(fā)。根據(jù)激光掃描系統(tǒng)的需求,,設(shè)計(jì)中對(duì)AVR32 UC3系列編寫了串口USART,、GPIO口、時(shí)鐘Timer以及中斷的BSP,。下面以GPIO服務(wù)函數(shù)為例進(jìn)行介紹,。
AVR32中每個(gè)I/O口可以實(shí)現(xiàn)多達(dá)4個(gè)外部設(shè)備接口。當(dāng)一個(gè)I/O口被指定為外部接口時(shí),,該I/O口就為該外部設(shè)備控制,。通過(guò)寄存器PMR0和PMR1來(lái)決定4個(gè)外部設(shè)備中哪個(gè)設(shè)備來(lái)控制該I/O口,。當(dāng)一個(gè)I/O口被指定為普通的I/O時(shí),寄存器ODER的值決定了該I/O引腳的值,。因此,,編寫函數(shù)BSP_GPIO_SetFnct()來(lái)封裝與引腳配置相關(guān)的寄存器,從而配置一個(gè)引腳的功能,,而不用每次都去直接操作寄存器,。AVR32的端口與引腳的GPIO口號(hào)對(duì)應(yīng)關(guān)系如式(1)和式(2)所示:
GPIO port= floor((GPIO number) / 32) (1)
GPIO pin = (GPIO number) mod 32 (2)
其中,式(1)表示取GPIO口號(hào)除以32的商作為該GPIO口所在的端口號(hào),;式(2)表示取GPIO口號(hào)除以32的余商作為該GPIO口所在的端口里的第幾位,。
函數(shù)BSP_GPIO_SetFnct()的代碼如下:
void BSP_GPIO_SetFnct (CPU_INT16U pin, CPU_INT08U fnct)
{
volatile avr32_gpio_port_t *gpio_port;
/* 得到引腳號(hào)*/
gpio_port= &AVR32_GPIO.port[pin/32];
switch (fnct) {
case 0: /* 若選擇引腳的外部設(shè)備功能0*/
gpio_port->pmr0c = 1 << (pin % 32);
gpio_port->pmr1c = 1 << (pin % 32);
break;
case 1: /* 若選擇引腳的外部設(shè)備功能1*/
gpio_port->pmr0s = 1 << (pin % 32);
gpio_port->pmr1c = 1 << (pin % 32);
break;
case 2: /* 若選擇引腳的外部設(shè)備功能2*/
gpio_port->pmr0c = 1 << (pin % 32);
gpio_port->pmr1s = 1 << (pin % 32);
break;
case 3: /* 若選擇引腳的外部設(shè)備功能3*/
gpio_port->pmr0s = 1 << (pin % 32);
gpio_port->pmr1s = 1 << (pin % 32);
break;
}
/*將引腳設(shè)置為普通的GPIO口 */
gpio_port->gperc = 1 << (pin % 32);
}
在設(shè)置了GPIO口的功能之后,編寫3個(gè)函數(shù),,可以根據(jù)需要改變引腳的值,,如表1所示。
3 μC/OS-II下應(yīng)用程序的編寫
3.1 μC/OS-II系統(tǒng)的裁剪
在編寫應(yīng)用程序之前,,需要根據(jù)實(shí)際所需資源對(duì)μC/OS-II系統(tǒng)進(jìn)行裁剪[9],,使編譯生成的操作系統(tǒng)所占的系統(tǒng)內(nèi)存達(dá)到最小。頭文件OS_CFG.H聲明相應(yīng)功能的配置常量,,通過(guò)μC/OS-II中的條件編譯,生成所需要的功能函數(shù),。函數(shù)中聲明的配置常量如表2所示,。
3.2 應(yīng)用程序編寫
激光掃描系統(tǒng)中,需要對(duì)激光測(cè)距儀,、水平方向的步進(jìn)電機(jī),、垂直方向的步進(jìn)電機(jī)[10]進(jìn)行控制,通過(guò)對(duì)激光測(cè)距儀返回的測(cè)量數(shù)據(jù)進(jìn)行分析,。根據(jù)分析結(jié)果,,判斷剛才掃描的是靜止物體還是動(dòng)態(tài)物體,決定要發(fā)送的下一條命令,。
在系統(tǒng)工作中,,需要同時(shí)執(zhí)行電機(jī)轉(zhuǎn)動(dòng)[11]和激光測(cè)距,因此建立了任務(wù)MoveMeasure,。由于在工作中,,不同的應(yīng)用對(duì)激光測(cè)距儀的參數(shù)要求不同,因此建立了任務(wù)LDMConfig,,通過(guò)信號(hào)量LDM_SEM來(lái)同步任務(wù)LDMConfig和任務(wù)Move_Measure,。當(dāng)激光測(cè)距儀測(cè)距結(jié)束時(shí),通過(guò)信號(hào)量LDM_DATA啟動(dòng)任務(wù)DataLDM,。再通過(guò)信號(hào)量DATA_SEM啟動(dòng)任務(wù)DATADispose,。當(dāng)任務(wù)DATADispose完成數(shù)據(jù)的處理后,,根據(jù)處理結(jié)果,決定下一條要發(fā)送的命令,,并通過(guò)消息郵箱CMD_MBOX把要執(zhí)行的命令發(fā)送給任務(wù)Move_Measure,。任務(wù)Move_Measure根據(jù)CMD_MBOX控制電機(jī)和激光測(cè)距儀工作。任務(wù)間的流程如圖3所示,。
4 試驗(yàn)驗(yàn)證
4.1 試驗(yàn)
試驗(yàn)中使用一個(gè)長(zhǎng)45 cm,、寬45 cm的長(zhǎng)方體,在該長(zhǎng)方體的一側(cè)邊沿連接一個(gè)高45 cm,、長(zhǎng)50 cm的平面板,。使相鄰的平板的板面錯(cuò)開(kāi),形成一個(gè)類似方波形狀的物體,,如圖4所示,。激光掃描系統(tǒng)距離最近的平板板面的距離為14 m,距離最遠(yuǎn)的平板板面的距離為20 m,。
系統(tǒng)上電后,,先通過(guò)激光測(cè)距儀的紅色瞄準(zhǔn)激光固定好激光測(cè)距儀和雙振鏡的位置,使激光掃描系統(tǒng)位于相連板面的中間,。然后關(guān)閉紅色瞄準(zhǔn)激光,。讓激光掃描系統(tǒng)開(kāi)始工作,進(jìn)行物體輪廓掃描,。
4.2 實(shí)驗(yàn)結(jié)果
將實(shí)驗(yàn)距離測(cè)量數(shù)據(jù)按照距離值分布,,如圖5所示,橫坐標(biāo)數(shù)值表示數(shù)據(jù)點(diǎn)個(gè)數(shù),,縱坐標(biāo)數(shù)值表示距離值,。從測(cè)量數(shù)據(jù)的分布顯示波形看,落在板子正面上的點(diǎn)為16個(gè),,電機(jī)每走一步的角度為0.112 5°,,激光掃描系統(tǒng)距試驗(yàn)板的最近距離為14 m,因此電機(jī)每走一步轉(zhuǎn)過(guò)的水平距離為tan(0.112 5°)×1 400≈27(mm),。掃描的板子正面的長(zhǎng)度為27×17=459(mm),,與板子正面的實(shí)際長(zhǎng)度45 cm誤差2%,滿足通過(guò)激光掃描描繪物體外圍輪廓的精度要求,。圖形正確地表現(xiàn)了所擺放的平板的圖形,。
5 結(jié)束語(yǔ)
基于AVR32和μC/OS-II系統(tǒng)的激光掃描系統(tǒng)可以很好地實(shí)現(xiàn)對(duì)物體的多次掃描和物體輪廓的點(diǎn)云數(shù)據(jù)的獲取。但由于μC/OS-II系統(tǒng)本身只是一個(gè)微內(nèi)核,,功能相對(duì)簡(jiǎn)單,,因此下一步將繼續(xù)研究基于Linux操作系統(tǒng)的激光掃描系統(tǒng),實(shí)現(xiàn)掃描數(shù)據(jù)的曲線圖的實(shí)時(shí)顯示,,動(dòng)態(tài)把握掃描過(guò)程,。
參考文獻(xiàn)
[1] 劉文. 基于FPGA技術(shù)的激光測(cè)距系統(tǒng)研究[D]. 南京:南京理工大學(xué),,2007.
[2] 韓萬(wàn)鵬,蒙文,李云霞,等. 雙振鏡激光掃描的誤差分析及校正方 法[J]. 光電技術(shù)應(yīng)用,, 2011, 26(4):14-18.
[3] 邢剛, 徐冬生,,夏云,,等. 基于CPLD的多目標(biāo)脈沖激光測(cè)距系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 激光與紅外,2010, 40(2):152-154.
[4] 劉文. 基于FPGA技術(shù)的激光測(cè)距系統(tǒng)研究[D]. 南京:南京理工大學(xué),2007
[5] 邵貝貝. 嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II[M]. 北京: 北京航天航空大學(xué)出版社,2003.
[6] 黃燕平. μC/OS-IIARM移植要點(diǎn)詳解[M]. 北京: 北京航空航天大學(xué)出版社,,2005.
[7] 黃杰. μC/OS-II在ARM系列單片機(jī)S3C44B0x上的移植[J]. 現(xiàn)代電子技術(shù), 2009(18): 44-45.
[8] 陳是知. μC/OS-II內(nèi)核分析,、移植與驅(qū)動(dòng)開(kāi)發(fā)[M]. 北京:人民郵電出版社,, 2007.
[9] 周航慈. 基于嵌入式實(shí)時(shí)操作系統(tǒng)的程序設(shè)計(jì)[M]. 北京:北京航空航天大學(xué)出版社, 2011.
[10] 閆劍虹,, 何泰祥. 步進(jìn)電機(jī)高速啟??刂频膯纹瑱C(jī)實(shí)現(xiàn)[J]. 空間電子技術(shù),2009(2):124-128.
[11] 賀啟波. AVR32的便攜式無(wú)線醫(yī)療點(diǎn)滴監(jiān)控系統(tǒng)[J]. 單片機(jī)與嵌入式系統(tǒng)應(yīng)用,,2012(9): 52-55.