,,
(云南民族大學(xué) 電氣信息工程學(xué)院,昆明 650504)
自動導(dǎo)引小車(Automated Guided Vehicle, AGV)是一種能沿預(yù)先設(shè)定路徑行駛的智能化搬運設(shè)備,廣泛應(yīng)用于現(xiàn)代工業(yè)自動化物流系統(tǒng)中。目前,國內(nèi)現(xiàn)有的AGV控制器仍大多采用可編程控制器或51系列單片機(jī),通過串行處理或輪詢方式執(zhí)行AGV系統(tǒng)任務(wù),其動態(tài)響應(yīng)能力差[1-2]、系統(tǒng)運行不穩(wěn)定,實際運行過程容易引起脫軌、車身行駛異常。針對這些不足,本文以STM32F103ZET6為核心設(shè)計AGV控制器,嵌入微型實時操作系統(tǒng),采用分層模型結(jié)構(gòu),管理AGV系統(tǒng)的軟硬件資源,以并行處理方式實現(xiàn)實時任務(wù)調(diào)度,大幅度提高系統(tǒng)性能,有效克服運行過程中脫軌、車身行駛異常等不足。
AGV控制器的硬件系統(tǒng)主要包括控制系統(tǒng)單元、傳感器單元、人機(jī)交互單元、運動控制單元、電源管理單元[3],如圖1所示為AGV硬件系統(tǒng)架構(gòu)。
控制系統(tǒng)單元主要由STM32單片機(jī)最小系統(tǒng)電路組成,主要完成人機(jī)交互、邏輯控制以及運動控制算法等功能。
傳感器單元主要由磁導(dǎo)航傳感器、地標(biāo)傳感器、障礙物檢測傳感器等組成。通過傳感器單元采集磁導(dǎo)航信號、地標(biāo)指令信號、障礙物檢測信號,然后經(jīng)過光耦隔離輸入控制器單元處理。
人機(jī)交互單元主要是在觸摸屏和控制器單元之間通過RS232串口電路建立通信,實現(xiàn)觸摸屏人機(jī)界面與控制器之間的信息交互。
運動控制單元主要由前級傳感器信號經(jīng)控制器單元運算處理后輸出控制指令,再輸入AD7225芯片進(jìn)行D/A轉(zhuǎn)換,經(jīng)運算放大電路輸出模擬信號給后級驅(qū)動。
圖1 AGV硬件系統(tǒng)架構(gòu)
電源管理單元主要給其它各個單元模塊進(jìn)行供電以及控制器系統(tǒng)電源電量采集的模擬量信息。電源管理單元由24 V直流電源輸入,經(jīng)過TPS5450電源管理芯片生成12 V、5 V、3.3 V的直流電源。其中,24 V給觸摸屏、伺服驅(qū)動電路供電,12 V給各組傳感器供電,5 V給信號放大電路、邏輯電平轉(zhuǎn)換電路供電,3.3 V給控制芯片STM32F103ZET6供電。
μC/OS-II是專門為嵌入式系統(tǒng)設(shè)計的硬實時內(nèi)核,其內(nèi)核精簡,多任務(wù)管理功能十分完善,實時性能好,并且具有可裁剪、可固化、源碼開放、可移植性強(qiáng)的特點[4]。同時,μC/OS-II是搶占式的多任務(wù)操作系統(tǒng),總是運行就緒列表中優(yōu)先級最高的任務(wù),其核心是任務(wù)調(diào)度器。μC/OS-II有5種任務(wù)狀態(tài),分別是運行態(tài)、就緒態(tài)、掛起態(tài)、睡眠態(tài)以及中斷服務(wù)態(tài),通過調(diào)度實現(xiàn)在這5種狀態(tài)之間的任務(wù)轉(zhuǎn)換。本控制器在設(shè)計系統(tǒng)任務(wù)時,通過任務(wù)調(diào)度的方式使控制器在滿足功能需求的同時實現(xiàn)程序設(shè)計的合理化、最優(yōu)化[5],從而實現(xiàn)AGV的直行、轉(zhuǎn)彎、避障、人機(jī)交互等功能。圖2所示為本文設(shè)計的控制器軟件體系架構(gòu)。
本系統(tǒng)軟件平臺采用分層、模塊化結(jié)構(gòu),包括物理層、MAC層和應(yīng)用層。系統(tǒng)軟件包括Cortex-M3標(biāo)準(zhǔn)外設(shè)庫、Cortex-M3內(nèi)核庫、嵌入式實時微型操作系統(tǒng)μC/OS-II。應(yīng)用層包括電源管理控制庫、傳感器信號分析處理庫和運動控制庫,主要進(jìn)行磁導(dǎo)航傳感器數(shù)據(jù)采集、數(shù)值插補計算、誤差補償、校正等任務(wù),地標(biāo)傳感器的中斷任務(wù)處理、指令采集、分析、生成和輸出任務(wù),障礙物檢測傳感器的信號檢測和執(zhí)行任務(wù),電量數(shù)據(jù)的采集和電源調(diào)度任務(wù),運動控制的速度控制任務(wù)及其調(diào)度,人機(jī)交互操作任務(wù)。
圖2 軟件體系架構(gòu)
通過對任務(wù)的合理劃分可以有效地簡化程序設(shè)計,提高系統(tǒng)的動態(tài)響應(yīng)性能和穩(wěn)定性,本控制器根據(jù)系統(tǒng)任務(wù)需求,將系統(tǒng)任務(wù)進(jìn)行劃分,采用靜態(tài)優(yōu)先級設(shè)置,賦予各個任務(wù)一定的優(yōu)先級別。如表1所列為任務(wù)的具體劃分和優(yōu)先級設(shè)置。
如圖3所示為本控制器系統(tǒng)任務(wù)調(diào)度切換示意圖。系統(tǒng)啟動后,μC/OS-II實時操作系統(tǒng)和硬件首先進(jìn)行初始化配置,然后CPU的控制權(quán)由操作系統(tǒng)開始管理,CPU內(nèi)核開始對任務(wù)按優(yōu)先級循環(huán)調(diào)度。
表1 任務(wù)優(yōu)先級分配
圖3 任務(wù)調(diào)度切換示意圖
Modbus協(xié)議是Modicon公司開發(fā)的一種通信協(xié)議,采用主從問答方式工作,允許一個主機(jī)與一個從機(jī)或者多個從機(jī)通信,廣泛應(yīng)用于自動化控制領(lǐng)域,已成為一種通用的工業(yè)標(biāo)準(zhǔn),控制器與觸摸屏之間可以利用此協(xié)議進(jìn)行通信。
FreeModbus是一位奧地利人寫的針對嵌入式應(yīng)用的一種免費通用的Modbus從機(jī)協(xié)議,其代碼規(guī)范、易移植、
可裁剪、對軟硬件要求低、資源占用少[6-7]。本系統(tǒng)人機(jī)交互任務(wù)可以通過移植FreeModbus協(xié)議棧到STM32內(nèi)核,實現(xiàn)觸摸屏對系統(tǒng)信息的實時監(jiān)測和控制。本系統(tǒng)采用臺達(dá)DOP-B07系列觸摸屏,兼容Modbus RTU模式。通過臺達(dá)DOPSoft軟件設(shè)計觸摸屏界面,將觸摸屏設(shè)為主站,控制器設(shè)為從站,采用Modbus協(xié)議RTU模式進(jìn)行通信。
本系統(tǒng)設(shè)計的觸摸屏主要用來監(jiān)控AGV的電量、速度、行駛狀態(tài)等信息,以及顯示主板各個傳感器和電機(jī)工作狀態(tài)是否正常。系統(tǒng)基于STM32內(nèi)核配置使用Modbus從機(jī)的 01功能和06功能,其分別在內(nèi)核開辟2個字節(jié)的離散變量地址存儲區(qū)域usDiscreteInputBuf[0]~usDiscreteInputBuf[1],以及 8個字節(jié)的保持寄存器地址存儲區(qū)域usRegHoldingBuf[0]~usRegHoldingBuf[7],然后通過配置STM32內(nèi)部的TIM2通用定時器,以及UART1寄存器進(jìn)行串口通信,最終實現(xiàn)AGV行駛狀態(tài)、傳感器運行狀態(tài)等信息的人機(jī)交互。如表2所列為主機(jī)觸摸屏和從機(jī)控制器之間的存儲地址映射。
表2 主從地址映射表
障礙物檢測是通過采集激光傳感器掃描傳回的編碼信息,調(diào)用Read_Obstacle()函數(shù)對采集的編碼信息讀取分析,如果掃描的距離小于系統(tǒng)設(shè)定的安全距離,則調(diào)用Avoidance_Obstacle_Process_task()函數(shù),使電機(jī)停止運行。Obstacle_Check_task()的主要代碼如下所示:
VoidObstacle_Check_task(void *pdata){
while(1){
Read_Obstacle();
}
//讀取傳感器編碼
if(Command_Security_Obstacle==Unsafe)
//讀取編碼信息是否小于安全距離Avoidance_Obstacle_Process_task();
//執(zhí)行避障處理任務(wù)
OSTimeDlyHMSM(0, 0, 0, 20);
}
//系統(tǒng)延時20ms,讓出CPU使用權(quán)
2.3.1磁地標(biāo)指令讀取時隙糾錯方法
AGV控制系統(tǒng)任務(wù)中地標(biāo)指令讀取是AGV平穩(wěn)運行的關(guān)鍵任務(wù)之一,如果地標(biāo)讀取錯誤,可能導(dǎo)致行駛異常甚至災(zāi)難性后果[8]。為了提高命令地標(biāo)指令讀取的準(zhǔn)確性,本文設(shè)計了一種指令讀取時隙糾錯方法,使AGV在不同速度、不同負(fù)載的條件下,有效降低地標(biāo)命令誤碼率,提高系統(tǒng)穩(wěn)定性。磁地標(biāo)指令讀取主要通過觸發(fā)地標(biāo)磁條,使控制器開始讀取地標(biāo)指令,解析生成相應(yīng)的控制指令,從而控制AGV執(zhí)行加減速、停車、轉(zhuǎn)向等功能[8]。
2.3.2軟件設(shè)計
如圖4所示為地標(biāo)指令讀取流程圖。本控制器設(shè)計的地標(biāo)指令讀取時隙糾錯方法,每組地標(biāo)傳感器有3個磁極信號采集輸入端,分別是觸發(fā)地標(biāo)南極S1、命令地標(biāo)南極S2、命令地標(biāo)北極N1,當(dāng)S極觸發(fā)記為字符S,N極觸發(fā)記為字符N。當(dāng)?shù)貥?biāo)S1被觸發(fā),產(chǎn)生上升沿信號輸入STM32的PF0口而觸發(fā)外部中斷0時,執(zhí)行中斷函數(shù)EXTI0_IRQHandler(),通過I2C總線觸發(fā)實時時鐘芯片的時鐘輸出功能,并產(chǎn)生32 Hz的脈沖輸入PB8口,觸發(fā)外部中斷8,執(zhí)行中斷函數(shù)EXTI9_5_IRQHandler(),開始計時指令讀取時間。當(dāng)指令讀取時間超過設(shè)定的時隙閾值時,則判定指令讀取出錯,此時自動清除地標(biāo)指令輸入存儲區(qū)的指令代碼,初始化指令存儲區(qū),重新開始讀取指令。本控制器設(shè)計的計時時隙閾值為6 s。
圖4 地標(biāo)指令處理流程圖
上述兩個中斷函數(shù)主要代碼如下:
void EXTI0_IRQHandler(void){
if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
//判斷外部中斷0發(fā)生{
EXTI_ClearFlag(EXTI_Line0); //清除外部中斷0 標(biāo)志位
Trigger_Marker_En = 1;//觸發(fā)地標(biāo)標(biāo)志置位
RTC_CLKOUT_Control(Enable,Freq_32);
//使能實時時鐘產(chǎn)生32Hz時鐘
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
//清除外部中斷0標(biāo)志位,退出中斷
void EXTI9_5_IRQHandler(void){
if(EXTI_GetITStatus(EXTI_Line8)!=RESET){
//判斷外部中斷8發(fā)生
EXTI_ClearFlag(EXTI_Line8);//清除外部中斷8標(biāo)志位
if(Slot_Count>65534)//判斷時隙計數(shù)值
Slot_Count = 0;//計數(shù)值歸零
else Slot_Count++;//否則繼續(xù)計數(shù)
EXTI_ClearITPendingBit(EXTI_Line8);
}
}//清除外部中斷8標(biāo)志位
2.4.1磁導(dǎo)航偱跡偏差補償控制算法
AGV控制系統(tǒng)任務(wù)中導(dǎo)航循跡任務(wù)也是AGV平穩(wěn)運行的關(guān)鍵任務(wù)之一[9-10]。一旦導(dǎo)航偏差過大,將導(dǎo)致AGV脫軌。本系統(tǒng)設(shè)計了磁導(dǎo)航偱跡偏差補償控制算法。如圖5所示的算法模型,每個點的數(shù)值為其所在位置的權(quán)值,算法表達(dá)如下所示:
(1)
式(1)中,ai為每個位置磁導(dǎo)航傳感器的權(quán)值,N為被觸發(fā)磁導(dǎo)航傳感器的個數(shù),ε為磁導(dǎo)航偱跡偏移值。其中,第1組為直行行駛模型,傳感器8和9感應(yīng)到磁極信號而觸發(fā),ε=(8+9)/(1+1)-8.5=0。第2組為左轉(zhuǎn)彎模型,傳感器5、6感應(yīng)到磁極信號而觸發(fā),ε=(5+6)/(1+1)-8.5= -3。第3組為右轉(zhuǎn)彎模型,傳感器11、12感應(yīng)到磁極信號而觸發(fā),ε=(11+12)/(1+1)-8.5= 3。
圖5 偱跡算法模型
2.4.2軟件設(shè)計
本系統(tǒng)采用8位磁導(dǎo)航傳感器,即上述模型5、6、7、8、9、10、11、12共8個點作為磁導(dǎo)航傳感器的磁條信號采集點。如圖6所示為導(dǎo)航循跡流程圖。根據(jù)地標(biāo)傳感器觸發(fā)采集到的地標(biāo)指令,調(diào)用 Command_Analysis()函數(shù)解析指令,再調(diào)用Offset_Analysis()實時計算并反饋磁導(dǎo)航傳感器循跡偏移值,同時調(diào)用AGV_Motion_Control()函數(shù),將偏移值反饋給驅(qū)動信號輸入端進(jìn)行補償計算,再調(diào)用 WR_Speed()函數(shù)將補償計算后的值經(jīng)過D/A芯片轉(zhuǎn)換,輸出相應(yīng)驅(qū)動電壓信號,從而實現(xiàn)AGV直行、轉(zhuǎn)彎、加減速等功能。表3為AGV地標(biāo)指令功能編碼。
圖6 導(dǎo)航循跡流程圖
地標(biāo)指令編碼功能說明地標(biāo)指令編碼功能說明NNNS高速行駛SNNS調(diào)轉(zhuǎn)行駛NNSN中速行駛SNSN左轉(zhuǎn)彎行駛NNSS低速行駛SNSS右轉(zhuǎn)彎行駛NSNN停止行駛SSNN直線行駛
圖7 AGV實驗平臺
功能測試主要對本文設(shè)計的控制器人機(jī)交互任務(wù)、障礙物檢測任務(wù)、運動控制任務(wù)、地標(biāo)指令讀取任務(wù)的功能及系統(tǒng)性能驗證。如圖7所示為搭載本文設(shè)計的AGV控制器實驗平臺。當(dāng)系統(tǒng)上電時,觸摸屏開啟,人機(jī)界面顯示AGV的電量、速度等狀態(tài)信息,系統(tǒng)上電默認(rèn)設(shè)置為中速直行,設(shè)定地標(biāo)指令讀取時隙閥值為6 s,如圖8所示為AGV運行過程中地標(biāo)指令界面。通過安裝在控制器主板上的驅(qū)動電壓信號采集裝置得到各驅(qū)動電機(jī)的驅(qū)動電壓信號,如表4所列。本控制器設(shè)計了4檔(零速、低速、中速、高速)速度驅(qū)動電壓信號,充分滿足實際生產(chǎn)中的運行需求。從采集的各個驅(qū)動輪驅(qū)動電壓信號可以驗證,當(dāng)AGV檢測到障礙物時,各檔速度模式下電機(jī)驅(qū)動均
立即輸出0 V的信號,使系統(tǒng)迅速停機(jī)。同時,當(dāng)本系統(tǒng)采用差速驅(qū)動方式實現(xiàn)AGV轉(zhuǎn)彎時,各檔速度模式下4個電機(jī)的驅(qū)動信號值均非常穩(wěn)定。實測表明,AGV系統(tǒng)運行穩(wěn)定可靠、行駛平穩(wěn),沒有出現(xiàn)AGV脫軌、車身行駛異常的情況。
圖8 地標(biāo)指令及行駛信息界面
驅(qū)動輪直行驅(qū)動電壓/V右轉(zhuǎn)驅(qū)動電壓/V左轉(zhuǎn)驅(qū)動電壓/V檢測到障礙物時驅(qū)動電壓/V零速低速中速高速零速低速中速高速零速低速中速高速零速低速中速高速前左00.61.73.601.02.14.000.31.43.00000前右00.61.73.600.21.33.200.92.13.80000后左00.61.73.601.02.14.000.41.53.10000后右00.61.73.600.21.33.201.02.13.90000