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