陳祖霖, 黃 峰, 吳 靖, 沈 英
(福州大學(xué)機械及自動化學(xué)院, 福建 福州 350108)
步進(jìn)電機是將電脈沖信號轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移的開環(huán)控制電機, 是現(xiàn)代數(shù)字程序控制系統(tǒng)中的主要執(zhí)行元件, 應(yīng)用極為廣泛[1]. 隨著計算機和微機技術(shù)的不斷發(fā)展, 步進(jìn)電機在工業(yè)生產(chǎn)中隨處可見, 應(yīng)用單片機對電機實現(xiàn)自動控制已經(jīng)成為了必然趨勢, 能更好地挖掘出步進(jìn)電機的潛力, 對服務(wù)實際生活與工業(yè)生產(chǎn)有重要意義.
步進(jìn)電機角位移或線位移與其接收電脈沖數(shù)成正比, 轉(zhuǎn)速或線速度與脈沖頻率成正比[2]. 步進(jìn)電機為開環(huán)控制, 工業(yè)用途中可增加編碼器來進(jìn)行閉環(huán)控制, 但這會增加控制成本. 一般通過采集控制器輸出的脈沖信號作為反饋信號, 進(jìn)行無傳感器的“偽”閉環(huán)控制. 通常, 如果在步進(jìn)電機啟動或加速時脈沖頻率過高, 轉(zhuǎn)子由于慣性而跟隨不上電信號的變化, 這將會導(dǎo)致堵轉(zhuǎn)或失步; 由于同樣的原因, 在停止或減速期間可能發(fā)生過沖, 導(dǎo)致步進(jìn)電機的控制精度降低. 為防止丟步和過沖, 在啟動時采用加速過程, 在停止時則采用減速過程[3]. 因此, 可采取S形加速/減速曲線進(jìn)行控制. 步進(jìn)電機有多種加減速算法, 近年來國外主要流行SPTA算法對步進(jìn)電機加減速曲線進(jìn)行控制, 國內(nèi)研究以S形算法為主. S形算法的核心在于防止加速度產(chǎn)生突變, 減小沖擊, 并使步進(jìn)電機運動具有快速平穩(wěn)的特性, 常被應(yīng)用于精確控制中,如數(shù)控系統(tǒng)、 醫(yī)療器械和機器人系統(tǒng)等[4].
本研究以三段式S形曲線為例展開. S曲線涉及階段較多, 實現(xiàn)較為復(fù)雜, 因此在實際項目中需要對控制曲線進(jìn)行一定的離散擬合優(yōu)化, 把加速/減速的脈沖頻率首先存儲在陣列中, 從而更好地實現(xiàn)控制要求. 步進(jìn)電機一個脈沖運行一步, 在加速/減速時期, 單位時間內(nèi)的位移會變化, 因此每個頻段都要給它相應(yīng)的位移. 采用高級定時器的重復(fù)計數(shù)寄存器(repeat count register, RCR), 可減少定時器的中斷次數(shù), 從而降低CPU的消耗, 并為研究步進(jìn)電機S形加減速的學(xué)者提供一定的理論幫助.
Logistic函數(shù)的圖形是一個連續(xù)光滑的S形, 同時是一個嚴(yán)格的遞增函數(shù), 在線性和非線性之間顯示出很好的平衡[5]. 它的值域為(0~1), 關(guān)于(0, 0.5)中心對稱, 其公式定義為
(1)
將f(x)曲線用在步進(jìn)電機調(diào)速控制中, 需要對其進(jìn)行變換,
(2)
式中:C、D為y方向的平移和縮放;c、d為x方向的平移和縮放. 對應(yīng)的步進(jìn)電機加速曲線方程定義為
(3)
其中: ΔF=Fmax-Fmin,Fmax為最大脈沖頻率,F(xiàn)min為步進(jìn)電機的起動頻率;n為length/2(length為離散化點數(shù)), 這樣可以使得S曲線對稱; 選擇加速區(qū)間為[-1, 1], (i-n)/n是為了保證加速點落在加速區(qū)間內(nèi);a為函數(shù)的斜率即加速區(qū)間,a越大, 中間x坐標(biāo)0點周圍的加速度也越大, 通常a合適的取值范圍在4~6. 步進(jìn)電機加速過程是由基礎(chǔ)頻率和跳躍頻率(步進(jìn)電機在基礎(chǔ)頻率上逐漸提高的頻率)組成加速曲線[6].
對應(yīng)的步進(jìn)電機減速段, 可以和加速段共用一個表, 或定義步進(jìn)電機減速曲線方程為
(4)
可計算出每個減速點對應(yīng)的脈沖頻率, 為了減少MCU(micro control unit)計算量, 將計算得出的f值換算成定時器的自動重裝載值A(chǔ)RR, 做成數(shù)組保存在MCU內(nèi)存中, 這樣控制器只需要按順序在數(shù)組里讀取值進(jìn)行定時器計數(shù)值重裝載就行了.
STM32的定時器功能十分強大, 有TIME1和TIME8等高級定時器, 也有TIME2~TIME5等通用定時器, 還有TIME6和TIME7等基本定時器. 本研究采用16位的高級定時器TIME1中斷輸出來控制步進(jìn)電機的運轉(zhuǎn). STM32的時鐘頻率可以達(dá)到72 MHz, 定時器時鐘經(jīng)過PSC(Prescaler)預(yù)分頻器之后, 即CK_CNT, 用來驅(qū)動計數(shù)器計數(shù).
圖1 定時器1中斷配置步驟流程圖Fig.1 Flow chart of timer 1 interrupt configuration steps
PSC是一個16位的預(yù)分頻器, 可以對定時器時鐘TIMxCLK的1~65 535之間任何一個數(shù)進(jìn)行分頻. 其計算方式為CK_CNT=TIMxCLK/(PSC+1). 計數(shù)器CNT是一個16位的計數(shù)器, 只能往上計數(shù), 最大計數(shù)值為65 535. 當(dāng)計數(shù)達(dá)到自動重裝載寄存器的時候產(chǎn)生更新中斷, 并清零從頭開始計數(shù). 在設(shè)計程序過程中, 對定時器TIME1進(jìn)行相關(guān)配置, 配置步驟如圖1所示.
設(shè)置定時器輸出比較模式為PWM1. 同時開啟重復(fù)計數(shù)寄存器TIMx_RCR, 通過設(shè)置寄存器的值, 減少CPU的消耗. 一般通用定時器設(shè)置為單脈沖模式, 開啟定時器后, 中斷一次只產(chǎn)生一個脈沖, 然后關(guān)閉定時器. 而高級定時器有一個重復(fù)計數(shù)寄存器TIMx_RCR, 開啟這個寄存器, 就能大大降低中斷的頻率.
設(shè)置重復(fù)計數(shù)器的值為RCR_VAL=X(X取0~255), 那么每中斷一次, 控制器就會輸出X+1個脈沖. 因此使用了重復(fù)計數(shù)器功能, 在向上計數(shù)到達(dá)設(shè)置的重復(fù)計數(shù)次數(shù)(TIMx_RCR)時, 才產(chǎn)生更新事件(UEV); 否則每次計數(shù)器溢出時都產(chǎn)生更新事件.
根據(jù)已知的步距角, 設(shè)定的目標(biāo)轉(zhuǎn)速, 計算出步進(jìn)電機運轉(zhuǎn)所需要的總脈沖數(shù)Step_num. 把S形加減速曲線離散化成n個點, 則加速脈沖數(shù)定義為:
Accel_num=n×(X+1)
(5)
勻速脈沖數(shù)為:
Uni_num=Step_num-2×Accel_num
(6)
在使用定時器重復(fù)計數(shù)功能時, 對于勻速階段的脈沖, 設(shè)置脈沖的整數(shù)部分為rcr_integer, 脈沖的余數(shù)部分為rcr_remainder, 其定義為:
rcr_integer=Uni_num/(1+RCR_VAL)
(7)
rcr_remainder=Uni_num%(1+RCR_VAL)
(8)
定時器輸出PWM頻率公式
(9)
式中: CLK為72 MHz; ARR取值范圍為0~65 535; PSC為預(yù)分頻數(shù).
設(shè)置定時器的計數(shù)頻率為1 MHz, PSC=71; 則計算出的定時器自動重裝載寄存器值公式為
(10)
把計算出的temp_arr存進(jìn)數(shù)組TIMx_table[n], 這樣就得到了步進(jìn)電機運行各階段的自動重裝載寄存器的值.
此外, 步進(jìn)電機的運行一般要經(jīng)過加速、 勻速、 減速3個階段, 要求加減速過程時間盡量短, 恒速時間盡量長[7]. 步進(jìn)電機從低速到最高速加速時間最好為100~300 ms, 最大不超過1.5 s, 由公式(10)計算得最大脈沖周期Tmax, 最小脈沖周期Tmin, 因此步進(jìn)電機運行的平均脈沖周期定義為
(11)
加速段的時間定義為
(12)
以32位的STM32為控制器, 對步進(jìn)電機進(jìn)行S曲線調(diào)速控制. 軟件實現(xiàn)部分包含初始化模塊和函數(shù)模塊, 編寫程序時對各模塊進(jìn)行相應(yīng)的配置.
2.3.1初始化模塊
初始化模塊包括串口usart、 GPIO口以及高級定時器的初始化, 其中定時器的初始化設(shè)置是最為關(guān)鍵的一步, 主要有設(shè)置中斷類型、 優(yōu)先級分組、 比較輸出模式等. 記得使能ARR的預(yù)裝載功能即ARPE=1, 保證直到發(fā)生更新事件后, ARR預(yù)裝載寄存器的值才被拷貝到影子寄存器中.
2.3.2函數(shù)模塊
函數(shù)模塊可以分為中斷服務(wù)函數(shù)和位置函數(shù). 在位置函數(shù)里, 根據(jù)實際條件需要, 確認(rèn)步進(jìn)電機的啟動頻率和最高頻率, 設(shè)置步進(jìn)電機的脈沖總數(shù)Step_num與重復(fù)計數(shù)寄存器的值X. 可由公式(6)計算得出勻速段脈沖數(shù), 并求得其整數(shù)部分和余數(shù)部分.
中斷服務(wù)函數(shù)里面包含加速段、 勻速段、 減速段的相關(guān)程序. 在向上計數(shù)達(dá)到重復(fù)計數(shù)器設(shè)置的次數(shù)X時, 定時器產(chǎn)生中斷, 進(jìn)入中斷處理服務(wù)函數(shù), CNT清零; 此時脈沖頻率從TIMx_table[0]開始. 根據(jù)
TIMx_table[0]選出的第一個脈沖頻率f1, 通過式(10)計算得出自動重裝載值temp_arr, 定時器開啟并以脈沖頻率f1連續(xù)發(fā)出(X+1)個脈沖; 以后定時器每中斷一次, 脈沖頻率按照順序, 依次從數(shù)組中對應(yīng)選出, 直到TIMx_table[n-1], 然后分別計算出每個脈沖頻率下的自動重裝載值temp_arr; 即在加速段, 發(fā)送相同的脈沖數(shù)時間越來越短; 在減速段, 發(fā)送相同數(shù)目的脈沖數(shù), 時間越來越長. 步進(jìn)電機以最高頻率進(jìn)入勻速段, 程序中先判斷脈沖整數(shù)部分rcr_integer是否為0; 當(dāng)rcr_integer>0時, 執(zhí)行相應(yīng)設(shè)計好的程序; 當(dāng)rcr_integer=0時, 則執(zhí)行余數(shù)部分的相關(guān)程序.
步進(jìn)電機的減速部分可以和加速段共用一張表TIMx_table[n], 當(dāng)減速階段發(fā)送完最后一個脈沖時, 步進(jìn)電機運行結(jié)束. 這時會通過printf把相關(guān)數(shù)據(jù)打印到串口接收區(qū). 軟件運行的流程圖如圖2所示.
圖2 軟件流程圖Fig.2 Software flow chart
在對S形曲線調(diào)速及軟件實現(xiàn)進(jìn)行深入的研究后, 對其理論部分進(jìn)行驗證, 應(yīng)用串口調(diào)試助手顯示出電機運行時各階段參數(shù)的數(shù)據(jù), 以確認(rèn)該方法的可行性, 以ALIENTEK戰(zhàn)艦版微處理器STM32f103為控制器, 步進(jìn)電機選型為42BYGH40-1704A, 驅(qū)動器選型為TB6600, 硬件連接如圖3所示.
步進(jìn)電機加減速曲線離散化點數(shù)n一般大于300, 設(shè)置S曲線離散化點數(shù)n=500, 設(shè)置步進(jìn)電機啟動頻率為3.316 kHz, 最高頻率為127.690 kHz, 由式(3)計算得出每個離散點對應(yīng)的脈沖頻率f, 應(yīng)用Origin將數(shù)據(jù)生成對應(yīng)的曲線, 呈現(xiàn)S形, 如圖4所示. 當(dāng)開啟定時器后, 步進(jìn)電機加減速將按此軌跡運行.
圖3 硬件連接圖Fig.3 Hardware connection diagram
圖4 離散化點數(shù)生成的S曲線Fig.4 S-curve generated by discretized points
3.2.1試驗與脈沖數(shù)據(jù)分析
為降低步進(jìn)電機的低頻振動及噪音, 設(shè)置驅(qū)動器的細(xì)分?jǐn)?shù)為64, 即步進(jìn)電機轉(zhuǎn)動一圈需要12 800個脈沖, 采用共陰極接法. 設(shè)置定時器以1 MHz的頻率計數(shù). 當(dāng)發(fā)送的脈沖總數(shù)不同時, 通過串口接收區(qū)顯示的步進(jìn)電機運行數(shù)據(jù)如表1所示.
表1 脈沖總數(shù)不同, 電機運行時各參數(shù)的數(shù)據(jù)
從表1可以得出, 當(dāng)RCR_VAL的值一定時, 發(fā)送任意的脈沖總數(shù), 步進(jìn)電機加速段與減速段脈沖是固定不變的, 但勻速段的脈沖發(fā)生變化. 對于電機勻速運行階段, 因開啟重復(fù)計數(shù)寄存器(TIMx_ARR)的功能, 故設(shè)置了整數(shù)部分(integer_num)和余數(shù)部分(remainder_num); 試驗結(jié)果顯示出步進(jìn)電機在任意脈沖總數(shù)下, 都能達(dá)到平穩(wěn)精確的運行, 不發(fā)生失步或過沖等現(xiàn)象.
可以根據(jù)實際條件的需要, 在已知脈沖總數(shù)的情況下, 通過修改重復(fù)計數(shù)寄存器的值RCR_VAL, 來調(diào)整加速段、 勻速段、 減速段分配的脈沖數(shù), 其試驗的串口接收區(qū)顯示數(shù)據(jù)如表2所示.
表2 不同RCR_VAL值, 電機運行時各參數(shù)的數(shù)據(jù)
從表2可以得出, 當(dāng)重復(fù)計數(shù)寄存器值不同, 而發(fā)送給電機的脈沖總數(shù)一定時, 可以通過軟件的設(shè)置, 自動計算出步進(jìn)電機3個階段的脈沖分配數(shù), 即各階段的脈沖數(shù)之和與發(fā)送的脈沖總數(shù)相等, 因此在程序的設(shè)計中, 無論是在加減速段還是勻速段, 都保證了步進(jìn)電機能準(zhǔn)確地運行完設(shè)定的步數(shù), 達(dá)到了精準(zhǔn)控制的目標(biāo). 當(dāng)RCR_VAL的值增大時, 電機的加速脈沖也隨著增大, 從而導(dǎo)致加速時間隨之增加. 由式(12)計算出步進(jìn)電機加速時間t, 當(dāng)RCR_VAL=9、 19、 26、 38時, 其加速時間t分別為0.765、 1.53、 2.065 5、 2.983 5 s. 因此隨著重復(fù)計數(shù)寄存器值的增大, 加速時間也明顯的變長; 但在實際應(yīng)用中步進(jìn)電機的加速時間不能超過1.5 s; 步進(jìn)電機的加速時間與脈沖頻率, RCR_VAL以及離散化的點數(shù)n等有關(guān); 在離散化點數(shù)n及Logistic曲線的a值確定時, 若加速時間過長, 只能采用減少RCR_VAL值的方法, 通過每次值減N(N為整數(shù)), 獲得較短的加速時間; 若離散化點數(shù)n及RCR_VAL值確定, 可增大a值, 每次加1進(jìn)行調(diào)試, 達(dá)到減短加速時間的目的.
3.2.2試驗與CPU狀況分析
定時器中斷后, CPU進(jìn)入定時器的中斷服務(wù)函數(shù)執(zhí)行代碼. 若單位時間內(nèi), 定時器中斷m次, 則CPU執(zhí)行m次代碼. CPU的消耗與定時器的中斷次數(shù)有關(guān), CPU的消耗隨定時器中斷次數(shù)的減少而下降, 因此在已知脈沖總數(shù)下, 通過定時器中斷次數(shù)來反應(yīng)CPU的消耗情況. 在未開啟重復(fù)計數(shù)寄存器時, 定時器每中斷一次, 向步進(jìn)電機發(fā)送一個脈沖. 若設(shè)定發(fā)送的脈沖總數(shù)為240 000個, 即步進(jìn)電機運行37.5圈, 則定時器中斷次數(shù)為240 000次; 使用重復(fù)計數(shù)寄存器時, 設(shè)置不同RCR_VAL的值, 當(dāng)發(fā)送脈沖總數(shù)為240 000個, 試驗得出的定時器中斷次數(shù)如表3所示.
從表3中得出, 重復(fù)計數(shù)寄存器的值設(shè)置越高, 定時器的中斷次數(shù)就越少, 降低了CPU的消耗. 但RCR_VAL的值與加速時間有關(guān), RCR_VAL越大, 加速時間越長; 采用減少離散化點數(shù)n的方法, 可以縮短加速時間. 在設(shè)計S曲線加減速時, 應(yīng)對各變量進(jìn)行分析和取值調(diào)試, 才能達(dá)到在降低CPU消耗的同時, 保證步進(jìn)電機有較短的加速時間, 得到響應(yīng)快且穩(wěn)定的加速曲線.
表3 不同RCR_VAL值, 定時器中斷次數(shù)表
3.2.3與類似調(diào)速控制的比較
不同的場合需要不同的加減速控制方式, 應(yīng)視情況而定. 本研究在加減速部分, 通過程序設(shè)計了S形加減速算法, 因此步進(jìn)電機加、 減速曲線呈現(xiàn)S形. 傳統(tǒng)的T形加減速, 其加速比S形來得快, 但曲線在加速與勻速部分不平滑, 過渡時容易產(chǎn)生加速度突變, 適用于精度要求不高的場合. 與T形加減速曲線相比, S曲線的優(yōu)勢在于啟動時比較平穩(wěn), S曲線連續(xù)光滑, 在加速和勻速部分可以很好地平滑過渡, 適合靜摩擦力比較大的負(fù)載; 從表1、 表2得出, 步進(jìn)電機采用S曲線有效降低了失步和過沖等現(xiàn)象, 達(dá)到精確的控制要求, 適用于大多數(shù)的場合.
詳細(xì)研究了S曲線調(diào)速的理論以及STM32軟件部分的實施. S曲線調(diào)速是一種比較新的算法, 通過合理設(shè)計脈沖的升、 降頻率, 有效防止電機的失步、 過沖等現(xiàn)象. 文中最后對理論部分進(jìn)行了試驗, 試驗結(jié)果顯示出可以通過S曲線調(diào)速, 達(dá)到對步進(jìn)電機進(jìn)行精確控制的目的. 研究中使用了重復(fù)計數(shù)器的功能, 雖然可以減少MCU的中斷次數(shù), 降低CPU消耗, 但在一定程度上會對電機的加速時間有影響. 可以通過對脈沖頻率以及重復(fù)計數(shù)寄存器適宜的取值, 來實現(xiàn)對步進(jìn)電機調(diào)速進(jìn)行優(yōu)化控制. 為減少CPU消耗以及步進(jìn)電機精確控制, 提供了一種有效方法.