董 瑩
(青海民族大學(xué), 青海 西寧 810007)
ARM處理器以其體積小、低耗能、成本低、性能高等優(yōu)勢廣泛占領(lǐng)了在嵌入式系統(tǒng)領(lǐng)域。μC/OS-II 提供了如郵箱、隊列、信號量、固定大小的內(nèi)存分區(qū)等多項系統(tǒng)服務(wù)并在醫(yī)療設(shè)備領(lǐng)域、發(fā)動機控制領(lǐng)域、網(wǎng)絡(luò)設(shè)備領(lǐng)域、自動提款機設(shè)置領(lǐng)域及工業(yè)機器人設(shè)計領(lǐng)域等諸多生活以及工業(yè)領(lǐng)域獲得了廣泛的應(yīng)用。王燕東等人(2016)提出了三路步進電機控制系統(tǒng)的設(shè)計思路,在提高基礎(chǔ)系統(tǒng)的實用性以及后期拓展功能的前提之下,完善了系統(tǒng)的實時性,提高了系統(tǒng)的可控性以及穩(wěn)定性[1]。常博博等人(2017)介紹了控制系統(tǒng)的發(fā)展歷程,針對不同的控制對象,將ARM技術(shù)應(yīng)用于不同控制系統(tǒng)中,并提出了SoC功能的控制系統(tǒng)實際工作情況,并對芯片處理器的優(yōu)勢做出簡單介紹[2]。張金玲等人(2017)將ARM技術(shù)應(yīng)用于傳感器控制系統(tǒng)中,設(shè)計了無刷直流電機控制系統(tǒng),從而完成了控制系統(tǒng)實際運行過程中對于機器的轉(zhuǎn)速以及電流調(diào)控[3]。綜上所示,目前ARM技術(shù)在步進電機控制中的設(shè)計研究目前處于空白狀態(tài),筆者主要研究ARM處理器及其編程模型,及嵌入式實時操作系統(tǒng)μC/OS-II的內(nèi)核結(jié)構(gòu),實現(xiàn)μC/OS-II在ARM上的移植,并在此平臺上進行步進電機控制程序設(shè)計,控制步進電機啟停、正反轉(zhuǎn)及加減速。
μC/OS-II在應(yīng)用于某一類特定處理器時的移植工作將工作重點設(shè)置在多任務(wù)切換上,這是由于計算機設(shè)備的讀寫寄存器是不能采用C語言完成代碼保存與恢復(fù)工作的,也有一部分計算機處理系統(tǒng)只允許利用特定的處理器匯編語言來恢復(fù)處理器現(xiàn)場,在這兩類情況發(fā)生時,需要采取μC/OS-II移植到ARM處理器的方式來解決問題,這一處理方式只需要修改三個與體系結(jié)構(gòu)相關(guān)的數(shù)據(jù)文件即可達到效果。數(shù)據(jù)文件是來定義堆棧單位的,步進定義了需要保護以及恢復(fù)的數(shù)據(jù)類型,還提出了文件需要與寄存器長度一致的要求。處理器的堆棧增長方式有兩種:從上向下和從下向上。此處選擇1表示從上向下增長(高地址到低地址),反之0表示從下向上增長。
OS_CPU.c的項目移植工作由三個工作步驟組成,第一步需要完成任務(wù)堆棧初始化,這一步主要是通過調(diào)用OSTaskCreate()或OSTaskCreateExt()這兩個具體函數(shù)來完成。第二部需要利用ARM體系結(jié)構(gòu),保存任務(wù)堆??臻g的初始化數(shù)據(jù)。第三步,在初始化工作結(jié)束后,需要將OSTaskStkInit()函數(shù)撤回到新的堆棧任務(wù)中,并完成任務(wù)的保存。OSTaskStkInit()初始化后的堆棧內(nèi)容如圖1所示。
圖1 OSTaskStkInit()初始化后的堆棧內(nèi)容關(guān)系
OS_CPU_A.s的項目移植共分為以下幾步:首先需要確定時鐘節(jié)拍中斷服務(wù)函數(shù),這一函數(shù)主要是用來確定系統(tǒng)的額外開銷工作的,時鐘節(jié)拍率與系統(tǒng)的額外開銷呈正比關(guān)系。本次測試所設(shè)計的系統(tǒng)采用S3C2410的timer 0作為時鐘節(jié)拍源。其次,需要進行OSTimeTick()函數(shù)的調(diào)用,如果在系統(tǒng)工作的過程中有優(yōu)先級更高的任務(wù)插入,則需要中斷嵌套的最后一層。最后需要退出臨界區(qū)域,而宏ARMDisableInt需要在系統(tǒng)進入臨界狀態(tài)之前關(guān)閉中斷狀態(tài),在系統(tǒng)退出臨界區(qū)時重新恢復(fù)中斷狀態(tài)。
設(shè)計選用二相四拍步進電機系統(tǒng),通過使用控制換相順序的方式來完成對步進電機的控制,由于所使用的S3C2410 的GPIO驅(qū)動能力有限,所以使用ULN2003達林頓集成驅(qū)動芯片來驅(qū)動步進電機。ULN2003是高耐壓、大電流、內(nèi)部由七個硅NPN達林頓管組成的驅(qū)動芯片,其每一對達林頓都串聯(lián)一個2.7KΩ的基極電阻。驅(qū)動系統(tǒng)要求信號必須為脈沖信號,沒有脈沖的時候,步進電機靜止,如果加入適當?shù)拿}沖信號,驅(qū)動系統(tǒng)就會以一定的角度轉(zhuǎn)動,系統(tǒng)的轉(zhuǎn)動速度與釋放的脈沖的頻率呈正比。ULN2003內(nèi)部結(jié)構(gòu)圖如圖2所示。
圖2 ULN2003內(nèi)部結(jié)構(gòu)圖
ULN2003是大電流驅(qū)動陣列,多用于單片機、智能儀表、PLC、數(shù)字量輸出等控制電路中,可直接驅(qū)動繼電器等負載。ULN2003芯片內(nèi)部結(jié)構(gòu)及引腳如圖3所示。系統(tǒng)中的步進電機的四相(實際工作模式為二相四拍)由0x28000006的bit0~bit3控制,bit0對應(yīng)于MOTOR_A,bit1對應(yīng)于MOTOR_B,bit2對應(yīng)于MOTOR_C,bit3對應(yīng)于MOTOR_D。通過編制脈沖分配控制步進電機。
圖3 ULN2003芯片引腳
系統(tǒng)在μC/OS-II平臺上,設(shè)計步進電機的控制程序,能夠控制步進電機轉(zhuǎn)動和停止、電機正反轉(zhuǎn)和電機轉(zhuǎn)速。
1)步進電機使能控制函數(shù),啟動或停止步進電機運行。其參數(shù)可以為STEP_ MOTOR_ ENABLE或STEP_MOTOR_DISABLE。
2)步進電機正反轉(zhuǎn)實現(xiàn)。系統(tǒng)中使用的步進電機工作模式為二相四拍。采用整步模式,該模式下的步距角為1.8°,正轉(zhuǎn)相序為:0101-1001-1010-0110-0101,則反轉(zhuǎn)相序就為:0101-0110-1010-1001-0101。
3)步進電機轉(zhuǎn)速控制。設(shè)置步進電機轉(zhuǎn)速,單位為每步l0ms,值越小,速度越快。
由主函數(shù)Main()建立兩個任務(wù)TaskSTEP和TaskSEG,優(yōu)先級分別為5和13。從串口打印輸出任務(wù)運行的信息。TaskSTEP任務(wù)輸出提示信息,控制步進電機的起停、正反轉(zhuǎn)和加減速。TaskSEG任務(wù)輸出程序運行時的信息,同時控制數(shù)碼管。系統(tǒng)主函數(shù)Main,用來實現(xiàn)目標板的初始化,操作系統(tǒng)的初始化,建立任務(wù)等,OSStart()函數(shù)是操作系統(tǒng)啟動函數(shù),該函數(shù)永遠不會返回,在調(diào)用OSStart()之前必須先調(diào)用OSInit()函數(shù)。高優(yōu)先級的函數(shù)TaskSTEP(),用來啟動時鐘節(jié)拍定時器,開始多任務(wù)調(diào)度,從串口打印輸出任務(wù)運行的信息,初始化步進電機,開始啟動步進電機,根據(jù)按鍵來控制步進電機轉(zhuǎn)動和停止、電機正反轉(zhuǎn)和電機轉(zhuǎn)速。
為實現(xiàn)嵌入式實時操作系統(tǒng)μC/OS-II的移植,通過修改三個和體系結(jié)構(gòu)相關(guān)的文件,使得μC/OS-II成功移植到μC/OS-II到S3C2410處理器上。在研究中,通過對ARM及S3C2410處理器、系統(tǒng)硬件模塊、系統(tǒng)硬件資源分配以及步進電機的研究,完成硬件系統(tǒng)的設(shè)計。完成了步進電機,掃描鍵盤電路的設(shè)計。軟件部分,完成了電機模塊、鍵盤模塊、數(shù)碼管模塊功能實現(xiàn)的程序設(shè)計。這樣移植就成功了,并控制步進電機啟停、正反轉(zhuǎn)以及加減速,完成了步進電機控制系統(tǒng)設(shè)計。