(廣西師范大學 電子工程學院,廣西 桂林 541004)
隨著社會與經濟的飛速發展,自動化控制代替人為操作越顯明顯[1]。步進電機作為自動化控制重要的執行機構來說,其控制一直以來都是一個重要的研究課題,其主要研究集中在加減速曲線優化和具體實現上。與此同時隨著嵌入式技術的快速發展,特別是其ARM架構芯片的性能有了大幅度的提升以及嵌入式實時控制系統的功能變得更加完善。因此將嵌入式技術應用于多路步進電機控制系統中不僅可以提高了步進電機控制的實時性和可靠性,而且還降低了控制系統的成本[2]。本文設計的主控芯片使用了ST公司的的STM32F4系列微處理器,嵌入式以太網控制器W5500、電機控制芯片A4984、光電傳感器、RFID射頻識別傳感器等多種外設,操作系統采用嵌入式實時操作系統FreeRTOS,上位機控制軟件應用程序采用PyQt,并進行相應的軟件程序開發,本設計致力于設計一種可靠穩定,實時性高的多路步進電機控制系統。
本設計總體架構如圖1所示。主控芯片通過嵌入式以太網控制器W5500與上位機通信,接收上位機軟件發送的命令,并向上位機返回現在所處的工作狀態。W5500通過SPI通信將上位機命令發送給主控制端STM32,后由主控進行命令解析,得到指令中的電機脈沖數、頻率以及正反轉等參數,最終得到驅動電機的脈沖數量、脈沖頻率以及脈沖信號順序,從而控制各路步進電機按照指令所需的頻率精確達到目的位置。

圖1 系統總體結構圖
本設計電路中主控芯片采用ST公司的STM32F407系列微控制器,電機驅動芯片采用A4984SLPTR-T芯片,步進電機選擇倆相四線的混合式步進電機。
STM32網絡通信主要有倆種方式一種采用移植LWIP協議棧,一種是采用外置網絡芯片與主控芯片之間進行通信。由于主控芯片已經移植了小型操作系統FreeRTOS,為了不增加主控芯片的內存壓力且外置網絡芯片加以外部晶振,較LWIP協議棧以及內部晶振時鐘會更加精確,故采用外置網絡芯片加以外部晶振來進行網絡通信。網絡通信芯片采用韓國WIZnet公司的W5500芯片,該芯片集成了IP/TCP協議棧,方編程模塊化,有助于系統后期的擴展性,也減少了主控芯片的資源占用。
本系統電路中電機驅動模塊采用Allegro公司的A4984SLPTR-T電機驅動器,該驅動器是一個完整的帶有內置轉換器的微電機驅動器。A4984SLPTR-T包括一個固定停機時間電流穩壓器,該穩壓器可在慢或混合衰減模式下工作。該電機驅動器具有高達35 V和±2 A的輸入驅動能力,且控制簡單。若電機的溫度過高,會導致電機力矩降低乃至失步,故將電機的電流設定為1.414 A,既可以使得電機芯片不過載,又盡可能的使得電機的利用率更高。驅動模塊電路如圖2所示。

圖2 電機驅動模塊原理圖
根據設計需要實現的目標,本文把系統分為不同的子功能,充分利用嵌入式系統多任務的優勢,把各個子功能作為系統中不同的任務進程實現[3],包括:網絡通信任務、上位機通訊協議解析任務、電機驅動任務、光電傳感器任務等,各個任務通過操作系統的信號量進行同步運行,由上位機軟件統籌規劃。為了保證步進電機系統的實時性,其中電機驅動進程為核心進程,設定其任務優先級為次高,除W5500的通信模塊,沒有其他進程可以搶占他的CPU控制權。
本文主要介紹軟件設計網絡通信管理和電機控制的實現:從網口讀取運動指令,轉換為實際電機的移動。
1)上位機軟件通過工作人員設定的電機工作時序來發送相對應的電機控制指令,命令通過網絡傳輸至網絡控制芯片中的命令緩存區中,后由SPI通信發送至主控制端STM32所建立的循環鏈表中進行存儲,防止命令丟失,最后又主控制端進行相對應的命令解析;
2)主控制端解析電機控制命令后,使用電機控制算法來控制電機來進行相對應的電機動作,其中主要參數包括電機脈沖頻率、電機轉動方向、脈沖總數以及加減速脈沖數等信息;
3)完成動作后,主控制端再通過SPI向網絡控制芯片傳輸完成指令,請求下一指令;網絡控制芯片向上位機返回相對應的結束命令,結束動作,等待下一次協議命令;
ARM系列的微處理器不支持大型操作系統的移植,但是在單片機模式下的縱向處理程序處理又滿足不了任務量多的程序設計。而此時嵌入式實時操作系統既滿足ARM處理器的內存要求且可以進行多個任務假性同步運行,一個處理器核心每次僅可以執行一個任務,但實時操作系統的主要工作則是將任務切換的時間變得非常短,而這已經滿足了本設計對操作系統的需求。
本設計采用了FreeRTOS嵌入式實時操作系統。FreeRTOS實時操作系統內核占用空間小、源碼公開、可移植、實時性高,可免費用于商業用途。其基本功能包括:通過時間片調度切換任務;多種信號量應用于各種場景;多個實時任務且及其優先級的配置;文件任務的管理等。
在嵌入式領域,FreeRTOS是不多的同時具有實行性,開源性,可靠性,易用性,多平臺支持等特點的嵌入式操作系統[4]。
由于單步執行的程序架構中,下位機會來不及處理上位機發送的連續運動指令,上位機向網關發送命令,對數據進行實時監控,但是由于接收到的命令要從流水線的控制器交互,交互需要一個過程,在這個過程里,導致上位機命令冗余,存儲在一個數組里,但是上位機長時間收不到命令,網絡連接會中斷,這種異常在工業控制里是堅決不允許的,所以,對處理的命令進行過濾,即設計了一個環形鏈表算法,將先存儲在鏈表中但未處理的命令刪除,把剛接收到的命令,插入尾部。如圖3環形鏈表示意圖。

圖3 環形鏈表示意圖
環形鏈表結構體定義所示:
typedef struct rx_net_data
{
char rx_data[CMD_MAX_DATA_LEN];
unsigned char rx_data_len;
SemaphoreHandle_t task_binarySemaphore;
SemaphoreHandle_t ISR_binarySemaphore;
Struct rx_net_data *next;
} RX_NET_DATA_LinkedListDef;
結構體中的 rx_data用來存放上位機發送過來的指令,rx_data_len表示rx_data數據長度,task_binarySemaphore為任務級的二值信號量,ISR_binarySemaphore為中斷級的信號量,用來同步中斷中接收到的數據與數據包解析任務同步。
中斷接收指令過程,流程圖如圖4所示。

圖4 網絡通信流程圖
步進電機的控制方式通常分為倆種,一種是使用定時器中斷來驅動步進電機,另一種則是定時器PWM脈寬調制來驅動。本文采用的則是定時器PWM脈寬調制,通過設置自動裝載值和預分頻值來控制占空比,從而控制電機的頻率。
由于步進電機本身的局限性,在步進電機起始階段頻率變化過大,則會導致電機失步、過沖現象,所以啟動階段需要一段較為緩慢的預熱階段。為了防止電機出現過沖或失步的現象,在電機控制中加入改進型S型算法,則有效的規避了該現象。
由文獻[3]可得S型曲線的速度函數,所得的S型曲線,如圖5所示:

(1)
式(1)中:a為設定的系統加速度;Vm為步進電機運行的最大速度;Vs為步進電機運行的起始速度。
S型算法的好處是速度具有很好的平滑性,運動精度也很高[5-6]。S型算法又名Sigmoid函數,Sigmoid函數原型為:
(2)
對其加以修改,式如下所示:

(3)
在式(3)所示:F(i)為即時頻率值;Fmin為步進電機運行的起始速度;Fmax為步進電機運行的最大速度;k為代表設定的加速度;i為加速或者減速的脈沖索引(i≥2 num)。
給定K值為7時,電機運作較為良好,值得提醒的是加速階段或者減速階段脈沖索引都從0開始計數。
通過MATLAB對公式(3)的加速部分進行仿真,取電機初始頻率Fmin為2 000 Hz,最大頻率Fmax為3 000 Hz,加速脈沖數num(電機一個脈沖數為1.8°)為4 000,T1取值為2 000,加速度k為7,所獲得加速S曲線如圖5所示:電機轉動主要分為3個階段,加加速,勻加速以及加減速階段[7-8],減速和加速階段類似,故不做多余講解。

圖5 文獻[3]S型加速曲線圖

圖6 本文S型加速曲線圖
通過圖5,圖6倆者比較可以明顯發現,本文中的S型算法有效的避免了電機初始加速速率變化過大而導致的電機速率突變的情況,避免了電機過沖與丟步的現象;電機也可以在最短的時間內達到所需的頻率,也大大的降低系統的功耗[9-10]。將圖5、圖6進行對比,通過對MATLAB仿真圖進行取脈沖值0,1 000,2 000,3 000,4 000,得到電機的實時頻率值,比較S型加減速的脈沖數和頻率之間的關系如表1。
PC上位機使用python3.5和pyqt5進行研發編寫。

表1 步進脈沖時間間隔
Python是功能很強大的跨平臺解釋性腳本語言,而 PyQt 是python針對Qt的一門功能性拓展[11]。由于Qt本身功能的強大性加上Python語言的良好的擴展性,該設計選擇Python和PyQt作為開發語言和開發環境。
界面如圖7所示,電機開始偵聽則開始與下位機進行連接,連接成功則顯示連接成功,如果失敗則返回連接失敗。界面主要參數包括:脈沖總數、電機轉向、起始頻率值、最大頻率值、脈沖加速脈沖數、減速脈沖數以及電機選擇等。通訊協議數據幀以圖7為例為:

圖7 上位機軟件示意圖
0231|CT|MA|500|10 000|CW|20 000|5 000|5 000|AABB03。其中起始位0231,控制位CT;電機選擇為MA;起始頻率為500;最大頻率10 000;電機轉向,正向為CW,反向為CCW;電機總脈沖數為20 000;加速脈沖數為5 000;減速脈沖數為5 000;校驗位為AABB以及截止位為03。當電機動作完成之后,下位機需返回信息給上位機告知動作完成。返回信息的通訊協議僅將控制位和電機選擇進行互換,表示是下位機向上位機返回的信息。電機動作完全結束后,需將電機進行復位,等待下一次的動作命令。復位是通過觸碰光電傳感器從而使電機返回初始位置,后進入待機狀態,等待上位機的協議命令。電機的誤差就不會進行疊加。
在實際應用中有8臺步進電機同時工作,所以在FreeRTOS中創建8個實時電機控制任務。給電機相同起始頻率2 000以及最大頻率5 000,不同脈沖數,比較丟失步的比例。由于電機轉動需要主控制端給脈沖,而每給一個脈沖數就要進入一次定時器中斷,故在定時器中斷中給一個疊加參數,當脈沖數完成后由串口通信打印至串口調試助手,即可得到其電機實際接受到的脈沖數。

表2 電機丟失步比例情況
由上述數據以及通過若干次測試可以顯示該電機控制系統的丟失步比例均在1%以內,電機一個脈沖為1.8°,加上電機細分數為8細分,所以電機丟失步所造成的轉動距離非常的小。因此將此控制系統運用至實際工程中去,實際項目工程圖如圖8所示。

圖8 項目工程圖
用嵌入式實時控制系統和步進電機控制技術,設計了一種基于嵌入式系統的多路步進電機控制系統,并且闡述了系統的硬件設計、步進電機控制技術以及上位機控制軟件應用程序。通過測試表明該系統提高了電機控制的穩定性以及可靠性,有效的防止步進電機失步和過沖現象,有效的提高了試管架的檢測效率;另一方面使用ARM7微處理器的嵌入式控制技術,使得控制成本大大降低,更適合中小型控制系統的低成本要求。該系統現已在多進樣流水線中運用,且系統運作良好。