熊遠生,劉春元,蔡偉忠
(嘉興學院 機電工程學院,嘉興 314001)
步進電機轉(zhuǎn)動的角度和輸入驅(qū)動脈沖的個數(shù)成正比,其轉(zhuǎn)動速率可以通過驅(qū)動脈沖的頻率來控制,有較高的定位精度,無位置累積誤差及特有的開環(huán)運行機制,與閉環(huán)控制系統(tǒng)相比,可減少系統(tǒng)成本,并提高了可靠性,具有較高的控制精度;因此,在精度要求不高的運動控制系統(tǒng)中,在工業(yè)領(lǐng)域得到了大量應用[1,2]。
為進一步提高控制精度,在實際應用中廣泛應用步進電機細分驅(qū)動器,細分驅(qū)動器一般提供三個輸入接口信號,ENA信號為脫機信號(低電平有效),當此輸入控制端為低時,電機勵磁電流被關(guān)斷,電機處于脫機自由狀態(tài),此信號在大多數(shù)應用時一般懸空,DIR信號方向電平信號輸入端,高低電平控制電機正/反轉(zhuǎn),PUL步進脈沖信號輸入,每個信號提供兩個輸入端,內(nèi)部用光耦實現(xiàn)隔離。
在工業(yè)控制中,有很多應用場合需要在上位機控制多個步進電機同時工作,如在水位傳感器的初始螺栓位置調(diào)整中,為提高工作效率,希望10個步進電機在上位機控制下帶動10個傳感器同時進行位置調(diào)整。但是上位機一般不能直接連接細分驅(qū)動器,通常采用PLC的普通輸出端口連接細分驅(qū)動器的DIR信號,PLC的脈沖輸出端口連接細分驅(qū)動器的PUL信號,PLC與上位機之間通過RS485連接。但PLC價格相對較貴,編程靈活性不高。
本文針對在控制中需要控制多個步進電機的需求,設(shè)計了一種基于STM32的步進電機控制器,采用RS485與上位機相連,STM32輸出端口經(jīng)過放大后連接細分驅(qū)動器的DIR信號和PUL信號,將FreeModbus協(xié)議移植到STM32上,使用Modbus協(xié)議和上位機通信,接收DIR信號、PUL信號和設(shè)置參數(shù)等信息,通過軟件實現(xiàn)輸出脈沖頻率可調(diào)、已輸出脈沖個數(shù)可查詢、輸出脈沖可終止等功能。
在需要上位機對多個步進電機控制的場合,系統(tǒng)應用方案如圖1所示,上位機通過USB轉(zhuǎn)485和N個步進電機控制器進行485組網(wǎng),上位機使用Modbus協(xié)議和N個步進電機控制器進行通信,步進電機控制器在收到方向和轉(zhuǎn)動步數(shù)等信息后,將方向信號以高低電平的形式發(fā)送給相應的細分驅(qū)動器,將轉(zhuǎn)動步數(shù)以脈沖個數(shù)的形式發(fā)送給相應的細分驅(qū)動器,細分驅(qū)動器在方向信號和脈沖信號的控制下,帶動相應的步進電機轉(zhuǎn)動。
圖1 系統(tǒng)應用方案圖
基于STM32的步進電機控制器硬件框圖如圖2所示。系統(tǒng)由24V供電,經(jīng)過降壓處理后提供5V和3.3V直流電,上位機通過USB轉(zhuǎn)485接口后與步進電機控制器的RS485接口連接,STM32的IO口經(jīng)過驅(qū)動后,通過輸出接口連接細分驅(qū)動器的ENA、DIR和PUL接口,撥碼開關(guān)輸入用于設(shè)置步進電機控制器地址。
圖2 基于STM32的步進電機控制器硬件框圖
系統(tǒng)電源電路如圖3所示,該電路主要是由78M05和LM1117兩個三端穩(wěn)壓器構(gòu)成。24V的直流電壓經(jīng)過78M05穩(wěn)壓器降壓變成5V,其中D1是整流二極管,R1、R2和R3起分壓散熱的作用,5V電壓再經(jīng)過LM1117-3.3穩(wěn)壓器降成3.3V。
圖3 電源電路
CPU電路如圖4所示,采用STM32F030F4P6芯片作為主控芯片,以RC電路作為上電復位電路,時鐘電路采用8MHz晶振,引出SW接口作為調(diào)試借口,對CPU的BOOT0引腳采用跳線的方法,根據(jù)需要可接高電平或低電平,采用一個發(fā)光二極管LED1對3.3V電源進行指示。
485接口電路如圖5所示,采用SP3485實現(xiàn)串口到485的轉(zhuǎn)換,采用STM32F030F4P6芯片PA0腳控制傳輸方向,R22和R20分別起到上拉電阻和下拉電阻的作用,R21做為終端匹配電阻,只是在網(wǎng)絡(luò)的首末端才焊接。F1和F2為自恢復保險絲,和T1、T2一起對電路起保護作用。
輸出接口電路如圖6所示,采用三極管來驅(qū)動步進電機驅(qū)動器的輸入光耦,STM32F030F4P6芯片的I/O口通過控制三極管的基極實現(xiàn)對步進電機驅(qū)動器的輸入光耦的通斷控制,將電平信號和脈沖信號傳送給步進電機驅(qū)動器。
圖4 CPU電路
圖5 485接口電路
圖6 輸出接口電路
撥碼開關(guān)電路如圖7所示,采用上拉電阻的方法,當撥碼開關(guān)OFF時,程序中對相應輸入復位,撥碼開關(guān)ON時,程序中對相應輸入置位。1~5位撥碼開關(guān)用于地址輸入,分別對應1~32,當1~5位撥碼開關(guān)全OFF時,對應地址為32,其余地址直接對應其輸入二進制的組合。
圖7 撥碼開關(guān)電路
FreeModbus是一個針對嵌入式應用的通用Modbus協(xié)議。Modbus通信協(xié)議棧包括兩層:Modbus應用層和網(wǎng)絡(luò)層。FreeModbus提供了RTU/ASCII傳輸模式及TCP協(xié)議支持[3,4]。
移植FreeModbus協(xié)議時對硬件的需求包括,具有一個支持接收緩沖區(qū)滿中斷和發(fā)送緩存區(qū)空中斷的異步串行接口、有一些能夠容納Modbus數(shù)據(jù)幀的RAM空間和一個定時器。
中斷控制配置,在FreeModbus的標準移植接口文件port.h中,設(shè)置兩個臨界保護函數(shù)的宏定義,實現(xiàn)全局中斷的打開和關(guān)閉。相關(guān)程序如下:
#define ENTER_CRITICAL_SECTION( ) __disable_irq();
#de fi ne EXIT_CRITICAL_SECTION( ) __enable_irq();
在物理層,用戶只需完成串行口及超時定時器的配置即可。具體應修改接口文件portserial.c和porttimer.c。
1)eMBErrorCode eMBInit()完成物理層的初始化。主要包括:BOOL xMBPortSerialInit()串口初始化,設(shè)定I/O口功能、波特率、數(shù)據(jù)位數(shù)、校驗方式;BOOL xMBPortTimersInit定時器初始化,設(shè)定定時器,設(shè)定t3.5定時需要的定時常數(shù);
2)eMBErrorCode eMBEnable()使能協(xié)議棧。
3)void vMBPortTimersDisable()關(guān)閉超時定時器,在此函數(shù)中清零定時器計數(shù)值,關(guān)閉定時器中斷;
4)BOOL xMBPortSerialPutByte()發(fā)送一字節(jié)數(shù)據(jù),需要先使能485芯片的發(fā)送信號,調(diào)用USART_SendData()完成數(shù)據(jù)發(fā)送后,適當延時后使能485芯片的接收信號;BOOL xMBPortSerialGetByte()接收一字節(jié)數(shù)據(jù),調(diào)用USART_ReceiveData()完成數(shù)據(jù)接收;
5)void UART1_IRQ()通過調(diào)用USART_GetITStatus()實現(xiàn)對發(fā)送和接收狀態(tài)的判斷,進行相應的處理。
應用層配置,在執(zhí)行eMBEnable()使能協(xié)議棧后,不斷循環(huán)調(diào)用eMBErrorCode eMBPoll()檢測事件,通過四個接口函數(shù)eMBRegInputCB(),eMBRegHoldingCB(),eMBRegCoilsCB()和eMBRegDiscreteCB()實現(xiàn)對離散輸入、輸出線圈、輸入寄存器和保持寄存器的讀寫操作。
步進電機控制器的功能處理主要用eMBRegHold ingCB()完成,eMBRegHoldingCB()對應06功能嗎時用來處理設(shè)置輸出脈沖頻率、輸出脈沖個數(shù)、輸出脈沖方向和輸出脈沖終止,eMBRegHoldingCB()對應03功能嗎時用來處理查詢輸出脈沖頻率、已輸出脈沖個數(shù)、輸出脈沖方向、輸出脈沖終止標志,地址分別對應40001到40004。
完成軟硬件設(shè)計后,搭建的實驗系統(tǒng)如圖8所示,上位機采用USB轉(zhuǎn)485和兩臺步進電機控制器組網(wǎng),上位機上運行Modbus Poll軟件,設(shè)置相應參數(shù)后,步進電機能按期望的頻率,方向和脈沖個數(shù)工作。
圖8 步進電機控制器實驗系統(tǒng)
本文設(shè)計了一種基于STM32的步進電機控制器,將FreeModbus協(xié)議移植到STM32上,實現(xiàn)了通過Modbus對多臺步進電機的控制,實驗結(jié)果表明,設(shè)計的步進電機控制器是可行的。