符濤濤, 王法明
(中國電子科技集團第四十一研究所, 安徽 蚌埠 233010)
某機器人控制項目中要求高精度控制步進電機運行,以此搭建實驗平臺,采用STM32F407作為控制器[1][2],通過自行設計電機運動軌跡,研究對電機運動軌跡細分后的誤差時間進而確保高精度控制步進電機運行。眾所周知,設計成型的步進電機,其結(jié)構(gòu)本身就決定了其運行距離精度高低,因此,在此基礎上軟件的設計好壞就進一步?jīng)Q定了其是否能運行在較高的精度上,對步進電機的控制中,頻率決定了其運行的速度,與在該速度下的運行時間共同決定了其運行的距離或轉(zhuǎn)動的步數(shù),在對步進電機運行距離要求達到較高精度的情況下,某一頻率下步進電機的運行時間就具有非常重要的意義,這里假定設計的頻率是理想的,因此,每個設計的頻率對應的運行時間間隔與理想時間間隔之間的誤差越小,步進電機運行距離精度越高。
STM32F407作為控制器,內(nèi)部資源豐富,本設計中負責構(gòu)造步進電機運動軌跡曲線,并將其離散化,得到一系列離散頻率,最終以PWM(Pulse Width Modulation,脈寬調(diào)制)脈沖的形式輸出控制步進電機按照設計的運動軌跡運行。
PWM脈沖輸出主要使用到STM32F407內(nèi)部功能模塊DMA(Direct Memory Access,直接內(nèi)存存?。┖?TIM (定時器)[3][4],其中 DMA包含 DMA1和DMA2,本設計使用的是DMA1,TIM使用的是TIM2和TIM3,采用閉環(huán)控制 TIM2和 TIM3,TIM2對TIM3輸出的PWM脈沖信號計數(shù),當TIM2內(nèi)部計數(shù)器計數(shù)到和TIM2的周期數(shù)一樣時產(chǎn)生更新事件,觸發(fā)DMA1實時更改TIM3的頻率和TIM2的周期,最終輸出可變周期和可變頻率的PWM脈沖信號。圖1為控制原理框圖。
圖1 控制原理圖
TIM3_Prescaler Table和TIM2_Period Table是在軟件中預定義的兩數(shù)組,容量均為n,分別存放著TIM2的周期和TIM3的預分頻,TIM2的周期和TIM3的預分頻是由步進電機運動軌跡曲線f(n)計算推導得到,該數(shù)組為可變數(shù)組,因此可以根據(jù)所設計運動軌跡曲線f(n)實時更改這兩個數(shù)組的內(nèi)容。
TIM3為16位定時器,TIM2為32位定時器,TIM2和TIM3設置互為主從模式,在內(nèi)部進行觸發(fā)連接,具體的連接方式見表1。
表1 TIM2和TIM3內(nèi)部級聯(lián)配置
當TIM3設置為主模式,TIM2設置為從模式時,TIM2通過內(nèi)部ITR2連接到TIM3,TIM3的主模式的功能是將更新事件作為輸出觸發(fā)(TRGO),即TIM3每產(chǎn)生一個周期的PWM脈沖都對應產(chǎn)生一次更新事件,對于TIM3來說每次更新事件都會產(chǎn)生一次觸發(fā)信號(TRGO)通過ITR2輸出到TIM2,TIM2的從模式使用的是外部時鐘1模式(SlaveMode_External1),將TIM3的觸發(fā)輸出(TRGO)作為TIM2的時鐘輸入,即TIM3每發(fā)出一個周期的PWM脈沖,TIM3就會伴隨著產(chǎn)生一次更新事件,TIM2內(nèi)部計數(shù)器便會計數(shù)一次,因此只要實時更改TIM2的周期就可以達到對TIM3發(fā)出的PWM脈沖進行精確計數(shù)。在此過程中,TIM3會頻繁的產(chǎn)生更新事件,該更新事件未設置產(chǎn)生DMA請求,因此更新事件不會觸發(fā)DMA1。
當TIM2設置為主模式,TIM3設置為從模式時,TIM3通過內(nèi)部ITR1連接到TIM2,TIM2主模式使用的功能類似與TIM3主模式的功能,都是采用更新事件作為觸發(fā)輸出(TRGO),TIM2的時鐘源來源于TIM3,周期可變,TIM2內(nèi)部計數(shù)器采用的是遞增計數(shù),當計數(shù)器發(fā)生上溢時產(chǎn)生一次相對于TIM2的更新事件,對應產(chǎn)生一次觸發(fā)輸出(TRGO),通過ITR1連接到TIM3,對于TIM3來說發(fā)生了一次觸發(fā)輸入(TRGI),TIM3從模式使用的是復位模式,即當TIM3檢測到有效觸發(fā)輸入(TRGI)上升沿時,TIM3重新初始化內(nèi)部計數(shù)器并產(chǎn)生一次更新事件,TIM2和TIM3均產(chǎn)生了一次更新事件,分別向各自的DMA1發(fā)出DMA請求,此時,DMA1按照預設的方式將數(shù)組TIM2_Period Table中存放的TIM2周期數(shù)據(jù)傳送到TIM2內(nèi)部的自動重載寄存器中,將數(shù)組TIM3_Prescaler Table中存放的TIM3預分頻數(shù)據(jù)傳送到TIM3內(nèi)部的預分頻器中,設置兩個定時器在發(fā)生更新事件時立即更新寄存器,這樣每次更新事件發(fā)生時都會實時更改TIM2的周期和TIM3的預分頻,當將兩數(shù)組TIM3_Prescaler Table和TIM2_Period Table中的數(shù)據(jù)都傳送完成后,系統(tǒng)進入TIM2的更新中斷中關閉TIM2和TIM3,由此實現(xiàn)可變周期和可變頻率PWM脈沖的輸出。在此過程中,TIM2和TIM3均產(chǎn)生了更新事件,并設置了由更新事件觸發(fā)DMA,以此實時更新TIM2的周期和TIM3的預分頻。
脈沖/方向的控制方式控制步進電機運行,這種控制方式包含兩個信息,一是脈沖的頻率,二是脈沖的個數(shù)。脈沖的頻率是通過改變STM32F407內(nèi)部定時器預分頻間接得到的。本文擬構(gòu)造步進電機運動軌跡曲線為正弦[5][6]函數(shù)頻率曲線f(n)并進行細分n等份,得到了n個離散的頻率點,離散化的每個頻率點(簡稱理想頻率)為浮點型數(shù)據(jù),但STM32F407內(nèi)部寄存器為整數(shù)型,因此將其整型化后反向計算出預分頻(簡稱理想預分頻),再次整型化后才能裝載到STM32F407預分頻器中,時鐘頻率與裝載到預分頻器中的預分頻的比值就是最終輸出的頻率(簡稱輸出頻率)如圖2,在這個過程中兩次進行了非整數(shù)型到整數(shù)型的變換,因此輸出頻率與理想頻率之間產(chǎn)生了誤差1。理想脈沖個數(shù)是理想頻率與該頻率下步進電機運動的有效時間間隔△t的乘積,然而理想頻率為離散的浮點型數(shù)據(jù),因此實際脈沖個數(shù)是對理想脈沖個數(shù)整型化后得到的,此刻產(chǎn)生了誤差2,然后將得到的實際脈沖個數(shù)裝載到定時器的自動重載寄存器中,與頻率共同作用于步進電機。
圖2 理想頻率與輸出頻率、理想脈沖個數(shù)與實際脈沖個數(shù)的計算
設置細分數(shù)n=100,構(gòu)造正弦曲線作為步進電機運動軌跡曲線,當輸出頻率范圍增大時,頻率越高,曲線平滑度降低,即精度降低,如圖3和圖4比較了100-10KHz頻率段和100-200KHz頻率段曲線平滑度。
分析每組輸出頻率與理想頻率,比較兩者之間的差值變化,當頻率范圍較小時,兩者之間差值較小,隨著頻率范圍的增加,差值也隨之增加,主要集中在高頻區(qū)。圖5-10比較了100-10kHz、100-20kHz、100-30kHz、100-50kHz、100-100kHz 和100-200kHz六個頻率范圍的輸出頻率與理想頻率差值關系。
圖3 100-10KHz頻率段細分100等份
圖4 100-200KHz頻率段細分100等份
圖5 100-10kHz輸出頻率與理想頻率差值
圖6 100-20kHz輸出頻率與理想頻率差值
圖7 100-30kHz輸出頻率與理想頻率差值
圖8 100-50kHz輸出頻率與理想頻率差值
圖9 100-100kHz輸出頻率與理想頻率差值
圖10 100-200kHz輸出頻率與理想頻率差值
當選擇細分數(shù)n=100時,設定電機運行總持續(xù)時間為2s,細分后的每個頻率點作用的理想時間等于0.02s,由于實際脈沖個數(shù)不可能小于0,故為保證脈沖個數(shù)大于0,選擇最小頻率為100,由此計算出最少脈沖個數(shù)為2個,使用STM32F407內(nèi)部TIM2和TIM3來產(chǎn)生可調(diào)頻率可調(diào)脈沖數(shù)的PWM脈沖信號,其中TIM3輸出PWM脈沖信號,TIM2用于對脈沖信號進行計數(shù)。因此TIM2決定了PWM的脈沖個數(shù),由于TIM2內(nèi)部自動重載寄存器為32bit,所以PWM的脈沖數(shù)可以設置足夠大,TIM3內(nèi)部預分頻器和內(nèi)部自動重載寄存器同為16bit,共同決定了最終PWM的工作頻率,當輸出PWM脈沖最小頻率為100時,為保證TIM3的預分頻足夠大,最大只能設置65535,這里選擇52500。對應TIM3內(nèi)部重載寄存器固定設置為16,當PWM頻率由低變高時,對應的預分頻之間的跨度會越來越小,如圖11所示,這是造成上述實際頻率與理想頻率誤差增大的根源。假設定時器的預分頻可以設置足夠大最大為時鐘頻率84000000,定時器的自動重載寄存器便可以設置盡量小,最小為1,以此可以提高PWM頻率變換的精度,預分頻之間的跨度會增大,同樣最大輸出頻率也會提高。然而STM32F407內(nèi)部所有定時器,預分頻都是16bit,因此硬件本身決定了預分頻無法被設置足夠大,但是可以通過增加細分數(shù)的方法縮小這種輸出頻率和理想頻率之間的差值。這種方法同樣帶來了新的問題,細分數(shù)增加,每個離散頻率點對應的有效作用時間間隔也同比例縮小,受到最小脈沖個數(shù)要大于1的限制,最小輸出頻率也會同比例增加,如果最小輸出頻率過大,對于電機則啟動速度會很大。因此細分數(shù)目很重要,細分過多或過少都會對最終效果造成極大影響。
圖11 六頻率段計算的預分頻值
電機運行總持續(xù)時間為2s,細分100等份后,實際脈沖個數(shù)與輸出頻率的比值實際上是單個頻率作用的有效時間,理想狀態(tài)下每個頻率作用的有效時間均為2/100=0.02s,但是實際脈沖個數(shù)與理想脈沖個數(shù)之間存在誤差,輸出頻率與理想頻率之間也存在誤差,故不同的頻率與各自的脈沖個數(shù)作用的有效時間便不可能都是0.02s,均在0.02s附近波動,具體差異見圖12,頻率范圍越大,差異越明顯。
圖12 每個頻率段對應的有效時間
理想情況下電機運行總持續(xù)時間為2s,由于實際輸出頻率和理想頻率之間差值會隨著選用頻率范圍的增大而增大,脈沖個數(shù)也同樣存在著誤差,因此電機實際運行總持續(xù)時間必定存在一定的誤差,如圖13所示,采用STM32F407作為主控制器,依次對頻 率 100-10KHz、100-20KHz、100-30KHz、100-50KHz、100-100KHz和 100-200KHz細分 100 等份后控制電機運行,實驗得到的實際總持續(xù)時間與理想總持續(xù)時間比較,誤差在0.003s范圍內(nèi),因此可以通過選用性能更加強勁的處理器來減小這種誤差時間,進一步提高電機運動距離精度。
圖13 六頻率段直線電機實際運行總持續(xù)時間