孟寶星,王成勤
(徐州工業(yè)職業(yè)技術(shù)學(xué)院,江蘇 徐州 221140)
步進(jìn)電機(jī)的轉(zhuǎn)動(dòng)是通過(guò)電機(jī)驅(qū)動(dòng)器產(chǎn)生控制脈沖信號(hào)實(shí)現(xiàn)的。電機(jī)驅(qū)動(dòng)器會(huì)產(chǎn)生不同頻率和數(shù)量的脈沖來(lái)控制步進(jìn)電機(jī)的速度和位移[1]。目前國(guó)內(nèi)外常用的電機(jī)控制器的加減速曲線有:梯形加減速曲線、分段線性加速曲線、指數(shù)加減速曲線以及S 型加減速曲線,其中梯形加減速曲線原理簡(jiǎn)單,速度為時(shí)間的一階導(dǎo)數(shù),實(shí)現(xiàn)容易,能滿足絕大應(yīng)用場(chǎng)景,具有較高的性價(jià)比,應(yīng)用廣泛。但是由于梯形加減速的加速度為常量,即加加速度為沖擊函數(shù),會(huì)對(duì)電機(jī)造成不必要的柔性沖擊,影響電機(jī)的使用壽命。一些高性能的電機(jī)控制器會(huì)采用S 型加減速來(lái)解決梯形加減速存在的問(wèn)題。S 型加減速模式雖然優(yōu)于梯形加減速模式,但其仍然存在加加速度突變,會(huì)對(duì)系統(tǒng)造成一定程度的振動(dòng),更重要的是S 型加減速模式在求解過(guò)程中存在多階函數(shù),其運(yùn)算量較高且復(fù)雜,而傳統(tǒng)的步進(jìn)電機(jī)控制需要高達(dá)上千赫茲的脈沖發(fā)生速度,這會(huì)消耗較大的運(yùn)算資源,這使得采用S 型加減速的驅(qū)動(dòng)器成本相對(duì)偏高[2]。
蔡娜等[3]設(shè)計(jì)了一種新的可實(shí)時(shí)實(shí)現(xiàn)的拋物線型速度給定算法。這種算法響應(yīng)速度更快,控制精度更高,減少了失步、過(guò)沖現(xiàn)象的發(fā)生率,避免了機(jī)械柔性沖擊,但對(duì)系統(tǒng)要求仍然較高。周黎等[4]提出了一種“正矢型”加減速曲線,實(shí)現(xiàn)了對(duì)步進(jìn)電機(jī)的精準(zhǔn)控制,減少了失步過(guò)沖現(xiàn)象的發(fā)生率,但動(dòng)態(tài)響應(yīng)速度較慢。
步進(jìn)電機(jī)常用于各種運(yùn)動(dòng)控制系統(tǒng)當(dāng)中,是一種常用的控制執(zhí)行部件,主要有反應(yīng)式、永磁式和混合式三種類型。從繞組數(shù)目分類來(lái)看主要有兩相、三相和五相步進(jìn)電機(jī)。目前市面上最常見(jiàn)的步進(jìn)電機(jī)為兩相混合式步進(jìn)電機(jī),大約占有97%以上的市場(chǎng)份額。主要針對(duì)兩相混合式步進(jìn)電機(jī)系統(tǒng)進(jìn)行討論。
步進(jìn)電機(jī)驅(qū)動(dòng)器,是一種將電脈沖信號(hào)轉(zhuǎn)換為電機(jī)角位移的驅(qū)動(dòng)執(zhí)行器。如圖1 所示。由于步進(jìn)電機(jī)本身是運(yùn)動(dòng)部件,在運(yùn)動(dòng)過(guò)程中會(huì)產(chǎn)生慣性。在步進(jìn)電機(jī)控制的過(guò)程中,速度不能發(fā)生突變,否則會(huì)對(duì)其機(jī)械結(jié)構(gòu)產(chǎn)生較大的沖擊,一般稱其為剛性沖擊。如果加加速度產(chǎn)生突變,也會(huì)造成電機(jī)磨損。最理想的情況是:電機(jī)運(yùn)動(dòng)的速度、加速度及加加速度皆連續(xù)且可導(dǎo),可以最大程度的避免電機(jī)運(yùn)行過(guò)程中造成電機(jī)的磨損。這也是在步進(jìn)電機(jī)驅(qū)動(dòng)過(guò)程中需要引入電機(jī)加減速的原因。
圖1 步進(jìn)電機(jī)驅(qū)動(dòng)器結(jié)構(gòu)框圖
分析了傳統(tǒng)S 型加減速的基本原理,并分析了它存在的局限性。為了解決上述問(wèn)題,引入了改進(jìn)型的S 型加減速算法,利用三角函數(shù)擬合S 型加減速的變加速階段,將三角函數(shù)的導(dǎo)數(shù)轉(zhuǎn)換為移位運(yùn)算,從而顯著降低算法的計(jì)算量,具有較高的適用性。
S 型加減速曲線名稱是由系統(tǒng)在加減速階段的速度曲線形狀呈S 形而得來(lái)的,采用降速與升速對(duì)稱的曲線來(lái)實(shí)現(xiàn)升降速控制。正常情況下的S 曲線運(yùn)行過(guò)程可分為加加速段、勻加速段、減加速段、勻速段、加減速段、勻減速段和減減速段7 段。在變加減速區(qū),加速度的導(dǎo)數(shù)為恒值;恒加減速區(qū),加速度為恒值;勻速段的速度為恒值,加速度為零。S 形加減速在任何一點(diǎn)的加速度都是連續(xù)變化的,從而避免了柔性沖擊,速度的平滑性很好,運(yùn)動(dòng)精度高[2]。
根據(jù)加減速階段的7 段模型,設(shè)S為行駛位移,J為加加速度,A為加速時(shí)加速度,DA為減速時(shí)加速度,Vmax為電機(jī)的最大速度,Vs為電機(jī)的起始速度,Ve為電機(jī)的終止速度,fa為加速度函數(shù),fj為加加速度,fv為速度函數(shù),fs為位移函數(shù)。在S 型加減速模型中A不是固定值,所以可以設(shè)置Amax為加速時(shí)最大加速度,Dmax為減速時(shí)最大加速度,同樣在設(shè)定Amax=Dmax,Vs=Ve的情況下進(jìn)行討論,其他方向上同理。
標(biāo)準(zhǔn)的S 型加減速是以加加速度為恒定值來(lái)進(jìn)行建模,所以fj的函數(shù)表示如下:
由此可以得到fa的函數(shù)表達(dá)為:
定義一組數(shù)值代入公式可以得到相應(yīng)的函數(shù)曲線,假設(shè)J= 200,Amax= 100,Vmax= 200,Vs= 30,S=0,便可以畫出fj和fa,以及fv和fs的函數(shù)圖形,如圖2、3 所示。
圖2 S 型加減速fj 和fa 函數(shù)圖形
圖3 S 型加減速fv 和fs 函數(shù)圖形
通過(guò)仿真得到了S 加減速的模型,但是同時(shí)也發(fā)現(xiàn)在計(jì)算fv的公式中出現(xiàn)了大量的4 次方的運(yùn)算,在執(zhí)行S 型加減速的計(jì)算過(guò)程中需要頻繁的進(jìn)行開四次根的計(jì)算,由于在實(shí)際應(yīng)用過(guò)程中電機(jī)控制的脈沖頻率一般可以達(dá)到200 K 左右,這需要強(qiáng)大的算力保障,且S 型加減速依然存在加加速度的突變,在一定程度上也會(huì)造成設(shè)備的振動(dòng)。故此一般傳統(tǒng)的低端步進(jìn)電機(jī)控制產(chǎn)品普遍采用梯形加減速算法,而沒(méi)有采用S 型加減速算法,這樣的確降低了控制器成本和研發(fā)難度,但是也導(dǎo)致了電機(jī)的性能和壽命的降低,穩(wěn)定性也受到了不小的影響[5]。
通過(guò)上文的分析,可以看到S 型加減速的基本原理及其存在局限性,S 型加減速的局限性主要在于其加加速度依然存在突變,這樣依然會(huì)在一定程度上導(dǎo)致設(shè)備的振動(dòng)和磨損,且S 型加減速算法的運(yùn)算過(guò)程中存在4 階函數(shù),其在工程應(yīng)用中對(duì)控制器的性能提出了較高的要求,這樣大大提高系統(tǒng)的復(fù)雜度和成本。
S 型加減速存在的問(wèn)題主要存在于7 段控制模型中的加加速模式和減加速模式,在S 型加減速算法中,引入了加加速度J的概念,且在加加速和減加速狀態(tài)下J為常量。如果把J從常量狀態(tài)定制為多階可導(dǎo)的三角函數(shù)模型,便從數(shù)學(xué)建模的角度解決了加加速度突變的問(wèn)題。
所以在改進(jìn)型的算法中,引入Jmax為最大加加速度,并在加加速度階段設(shè)定加加速度的曲線定義為:
其中定義:
上文中t3時(shí)間段為電機(jī)在保持Vmax勻速運(yùn)動(dòng)的階段,所以可以通過(guò)積分計(jì)算出加速和減速時(shí)間段的位移,假設(shè)加速階段的位移為Sa,減速階段的位移為Sd,則可以得到:
通過(guò)上述算式可以發(fā)現(xiàn),當(dāng)t = t1時(shí),J= 0。這樣便確保了加加速度的連續(xù)性,依次代入t=t1+ t2,t= 2t1+ t2,t=t1+ t2,t= 2t1+ t2+ t3,t=3t1+ t2+ t3,t= 3t1+2t2+ t3幾個(gè)時(shí)間點(diǎn),均可以得到J= 0。這樣確保了加加速度的連續(xù)性,根據(jù)fj的函數(shù)表達(dá),可以得出fa的函數(shù)表達(dá)為:
代入t在各個(gè)時(shí)刻的值,可以發(fā)現(xiàn)加速度A依然連續(xù)且可導(dǎo),然后根據(jù)加速度函數(shù)便可以得到速度的函數(shù)表示如下:
得到速度函數(shù)帶入求速度對(duì)時(shí)間的積分,得到位移。
定義一組數(shù)據(jù)Jmax= 200,Amax= 100,Vmax= 200,Vs=Ve= 30,S= 800,便可以畫出fj和fa,以及fv和fs的函數(shù)圖形,如圖4、5 所示。
圖5 改進(jìn)型S 型加減速fv 和fs 函數(shù)圖形
在實(shí)際的求解過(guò)程中可以發(fā)現(xiàn)整個(gè)函數(shù)本身還是遵循梯形加減速的加速、勻速及減速三個(gè)階段,S型加減速是指把加速階段又分為加加速階段,勻加速階段和減加速階段,減速階段為加速階段相反。且在三角函數(shù)擬合的S 型加減速中,是根據(jù)加速階段和減速階段的位移,得到勻速階段的位移情況,最終計(jì)算出勻速階段的時(shí)間。所以在求解的時(shí),可以把加速階段,勻速階段和減速階段分別求解。舉例說(shuō)明如下:
例如在2t1+t2+t3開始的減速階段,定義其實(shí)時(shí)間為2t1+t2+t3,定義該時(shí)間變量為tt,便可以得到:
該函數(shù)與加速階段的函數(shù)基本一致,支持改為負(fù)值。這樣便可以把整個(gè)三角函數(shù)分為3 段進(jìn)行分析的話,可以大大減小運(yùn)算量,如果在硬件計(jì)算中引入并行計(jì)算,便可以大大提升系統(tǒng)的運(yùn)行效率,滿足實(shí)時(shí)性、精度和資源占用等方面的要求[6]。
改進(jìn)型S 型加減速算法,其需要的計(jì)算均為三角函數(shù)計(jì)算,可以通過(guò)查表法將三角函數(shù)求導(dǎo)轉(zhuǎn)換為移位運(yùn)算。其思路如下:要計(jì)算一個(gè)角度θ的三角函數(shù)值。首先,選擇一個(gè)初始的量(x0,y0),通常設(shè)為(x0,0),表示初始角度為0 的向量,x0的值一般根據(jù)經(jīng)驗(yàn)選擇,特定的值可以在保證一定精度的前提下減少迭代的次數(shù);然后,將目標(biāo)角度θ分解成一系列旋轉(zhuǎn)操作,每次旋轉(zhuǎn)一個(gè)小的角度。在每次旋轉(zhuǎn)之后,通過(guò)縮放操作來(lái)逼近目標(biāo)角度的三角函數(shù)值。
因?yàn)閿?shù)據(jù)的右移n位相當(dāng)于乘以2(-n),于是可以將初始縮放因子設(shè)置為1,0,每次迭代減半,假設(shè)縮放因子為gain,便可以得到
其中,d表示旋轉(zhuǎn)方向(或者),矢量(x0,y0)逆時(shí)針旋轉(zhuǎn)角度得到的值的表達(dá)式為:
因把cosθ去掉不影響求值的結(jié)果,得到:
以tanθ作為縮放因子,建立一個(gè)縮放因子表格,建立從2(0),2(-1),2(-1)的表格,然后通過(guò)迭代查表,便可以計(jì)算出θ的角度值。
表1 為設(shè)置最高17 次迭代的縮放因子表格。
表1 縮放因子表格
表1 除了計(jì)算縮放因子對(duì)應(yīng)的值,還把求取角度之后放大1024 倍的取整值也給出,目的是考慮到在嵌入式環(huán)境中,對(duì)浮點(diǎn)數(shù)的運(yùn)算比較耗費(fèi)時(shí)間,且1024 也剛好是數(shù)據(jù)左移10 位的值。如便可以簡(jiǎn)單實(shí)現(xiàn)三角函數(shù)的快速實(shí)現(xiàn),
下面是該算法的核心部分C 語(yǔ)言代碼:
include #include #define M_PI 3.14159265358979f #define TABLE_SIZE 17 // 迭代次數(shù) //按照角度擴(kuò)大1024 倍運(yùn)算 static const int atanTable [TABLE_SIZE] = {46080,27203, 14373,7296,//83662,1833,917,458,//128229,115,57,29,//204814,7,4,2,//327681 }; // Cordic 算法計(jì)算正弦和余弦 //最小值:0.001,小于這個(gè)值為0 度,不需要判斷 void cordic(double angle,double*sinVal,double*cosVal) { int x = 35628; int y = 0; int z = 0; int nextX,nextY,nextZ; angle = angle*180 / M_PI; int unit =((int)angle))/ 90; angle =((int)angle))% 90; z =(int)round(angle*1024); for(int i = 0; i < TABLE_SIZE; i++) { if((abs(z)<= 1) { break; } else if(z >0) { nextX = x -(y >>i); nextY = y +(x >>i); nextZ = z - atanTable[i]; } else { nextX = x +(y >>i); nextY = y -(x >>i); nextZ = z + atanTable[i]; } x = nextX; y = nextY; z = nextZ; } double val = sqrt((double)x*x +(double)y*y); switch(unit) { case 0: *sinVal =((double)y)/ val; *cosVal =((double)x)/ val; break; case 1: *sinVal =((double)x)/ val; *cosVal = -((double)y)/ val; break; case 2: *sinVal = -((double)y)/ val; *cosVal = -((double)x)/ val; break; case 3: *sinVal = -((double)x)/ val; *cosVal =((double)y)/ val; break; } } int main(){ double angle = -20.0*M_PI/180; // 待計(jì)算的角度,以弧度為單位 double sinValue,cosValue; cordic(angle,&sinValue,&cosValue); // 使用Cordic 算法計(jì)算正弦和余弦 printf("Angle:%.2f
",angle); printf("Sin:%.4f
",sinValue); printf("Cos:%.4f
",cosValue); return 0; } 以下是一段基于cortex-M3 內(nèi)核的控制器執(zhí)行效率對(duì)比代碼,以0.01 弧度作為單位,對(duì)0-6.28 進(jìn)行正弦和余弦計(jì)算,如下: angle = 0; runtime_start(); for(i = 0; i < 628; i++) { angle += 0.01; cordic(angle,&sinValue,&cosValue); } runtime_stop(); printf("cordic time:%d.
",(time_cnt<<16)|runtime); angle = 0; runtime_start(); for(i = 0; i < 628; i++) { angle += 0.01; sinValue = sin(angle); cosValue = cos(angle); } runtime_stop(); printf("math time:%d.
",(time_cnt<<16)|runtime); 測(cè)試的結(jié)果如下: 三角函數(shù)轉(zhuǎn)化位移時(shí)間為:11971 個(gè)機(jī)器時(shí)間周期; 普通三角函數(shù)運(yùn)算時(shí)間為:58413 個(gè)機(jī)器時(shí)間周期。 可見(jiàn)在傳統(tǒng)的嵌入式系統(tǒng)當(dāng)中,采用三角函數(shù)轉(zhuǎn)換為移位運(yùn)算的執(zhí)行效率,為普通三角函數(shù)運(yùn)算性能的4.8 倍。 在步進(jìn)電機(jī)控制系統(tǒng)中為了解決電機(jī)在運(yùn)行過(guò)程中會(huì)產(chǎn)生剛性沖擊、柔性沖擊以及加加速度突變產(chǎn)生的設(shè)備振動(dòng)問(wèn)題,對(duì)傳統(tǒng)的加減速模型進(jìn)行改進(jìn),根據(jù)三角函數(shù)多階連續(xù)可導(dǎo)的性質(zhì),引入三角函數(shù)曲線擬合,提高系統(tǒng)的穩(wěn)定型,且在運(yùn)算性能有限的場(chǎng)景中,也可以快速的利用查表法進(jìn)行三角函數(shù)的求解,把三角函數(shù)運(yùn)算轉(zhuǎn)化加減和移位運(yùn)算。避免了不必要的快速浮點(diǎn)和求階運(yùn)算,大大提升了系統(tǒng)的運(yùn)行效率,降低系統(tǒng)的成本。5 結(jié)語(yǔ)