国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

在HCS08系列MCU上用軟件實現(xiàn)儀表步進電機的驅(qū)動

發(fā)布時間:2010-11-30 18:01    發(fā)布者:designer
關(guān)鍵詞: HCS08 , MCU , 步進電機 , 軟件 , 儀表
步進電機由于具有角位移和輸入脈沖數(shù)成正比并且沒有累積誤差的特點,而被廣泛的用作汽車儀表的顯示部件,其中具有代表性的是偉力驅(qū)動技術(shù)(深圳)有限公司的VID29系列步進電機。在多數(shù)情況下,人們會使用專用的驅(qū)動芯片來驅(qū)動步進電機,主控制器只需要給出方向控制信號和控制轉(zhuǎn)動步數(shù)的脈沖就行了。另外,也有集成了步進電機驅(qū)動電路MCU,如Freescale的MC9S12HY系列,其使用方法也比較簡單。然而,在很多較低端的汽車儀表,如微型車、農(nóng)用車、三輪貨車和摩托車的儀表上,人們?yōu)榱私档统杀荆M軌虿挥脤S抿?qū)動芯片或相對較貴的帶驅(qū)動電路的MCU,而是用普通的MCU直接去驅(qū)動步進電機。本應(yīng)用筆記介紹了在Freescale的HCS08系列MCU上,如何用軟件來實現(xiàn)對VID29系列步進電機的直接驅(qū)動。本文所附帶的程序,已經(jīng)在Freescale的LG32 Cluster ReferenceDesign演示板上運行驗證過。

VID29系列步進電機的工作原理

VID29系列步進電機是兩相步進電機經(jīng)三級齒輪減速傳動輸出的。該步進電機的工作原理可以用下面的簡化的結(jié)構(gòu)圖(圖1~4)進行說明。在象VID29系列這樣的兩相步進電機中,轉(zhuǎn)子是一個永磁體,定子上安裝了兩組線圈。當(dāng)給定子線圈通上電流的時候,就在轉(zhuǎn)子周圍的氣隙中產(chǎn)生了一個磁場,轉(zhuǎn)子就會在磁力的作用下轉(zhuǎn)動到使它自身的磁場方向和線圈電流產(chǎn)生的氣隙磁場方向平行的位置(下文中把它叫做平衡位置)。要讓步進電機連續(xù)地旋轉(zhuǎn),可以按如下步驟進行:

1. 如圖1所示,在線圈A中通上電流,轉(zhuǎn)子就會轉(zhuǎn)過90度到圖2所示的位置;





2. 如圖2所示,斷開線圈A中的電流,給線圈B通上電流,轉(zhuǎn)子又會繼續(xù)旋轉(zhuǎn)90度到圖3
所示的位置;





3. 如圖3所示,斷開線圈B中的電流,給線圈A通上跟步驟1中方向相反的電流,轉(zhuǎn)子繼續(xù)旋轉(zhuǎn)90度到圖4所示的位置;





4. 如圖4所示,斷開線圈A中的電流,給線圈B通上跟步驟2中方向相反的電流,轉(zhuǎn)子繼續(xù)旋轉(zhuǎn)90度回到圖1所示的位置;





5. 重復(fù)步驟1~4,步進電機就會連續(xù)地旋轉(zhuǎn)起來了。

如果將步驟1~4的順序顛倒過來,那么步進電機就會以相反的方向旋轉(zhuǎn)。另外,如果將A和B兩個線圈同時通以大小相同的電流,那么產(chǎn)生的合成磁場的方向就和一個線圈單獨通電時的磁場方向成45度夾角,這樣轉(zhuǎn)子就將旋轉(zhuǎn)45度,而不是90度。

實際的步進電機由于轉(zhuǎn)子的形狀和定子線圈的安裝方位跟上述的簡化結(jié)構(gòu)不同,所以工作時驅(qū)動電流的時序和轉(zhuǎn)子每一步旋轉(zhuǎn)的角度也不完全一樣。對于VID29系列步進電機來說,它的驅(qū)動脈沖序列和轉(zhuǎn)子相應(yīng)的旋轉(zhuǎn)角度如圖5所示。





分步驅(qū)動和微步驅(qū)動

步進電機的驅(qū)動通常有分步方式和微步方式兩種,圖5中的脈沖序列是分步方式下的驅(qū)動信號。分步方式的優(yōu)點是驅(qū)動信號的幅度只有0和電源電壓(5V)兩種,與數(shù)字信號的低電平和高電平完全一一對應(yīng),因此只要使用MCU的普通數(shù)字I/O口(GPIO)就可以產(chǎn)生驅(qū)動信號,驅(qū)動程序也比較簡單。但是由于分步方式下,定子線圈產(chǎn)生的氣隙磁場的方向在每走一步的過程中都發(fā)生一個較大的跳變——對于VID29系列步進電機而言是60度的跳變,定子磁場從原來的方向跳變到下一個平衡位置的方向,轉(zhuǎn)子則在磁力的作用下加速向下一個平衡位置轉(zhuǎn)動,當(dāng)它到達平衡位置的那個瞬間,速度達到最大值,而磁場力則變?yōu)榱悖ㄖ豢紤]切向力,不考慮徑向力,因為徑向力與轉(zhuǎn)動無關(guān)。下同);然后,如果驅(qū)動信號沒有變化的話,轉(zhuǎn)子就會在慣性的作用下繼續(xù)往前轉(zhuǎn)動偏離平衡位置,這時磁場力將會增大,而其方向卻變成跟剛才相反,于是就使轉(zhuǎn)子減速,當(dāng)轉(zhuǎn)子與平衡位置的偏離達到最大時,其速度減為零,然后在磁場力作用下往回加速轉(zhuǎn)動;當(dāng)轉(zhuǎn)子轉(zhuǎn)回平衡位置時,磁場力又變?yōu)榱悖俣炔粸榱悖谑窃趹T性的作用下繼續(xù)轉(zhuǎn)動偏離平衡位置……如此反復(fù),只要驅(qū)動信號還沒有再次改變,轉(zhuǎn)子就會象蕩秋千一樣在平衡位置附近來回振蕩,并在摩擦力的作用下幅度逐漸減小。這種振蕩還會產(chǎn)生一定的噪聲,所以用分步方式驅(qū)動時,步進電機的噪聲和抖動會比較大。

為了減小步進電機運行時的噪聲和抖動,人們設(shè)法讓定子線圈的磁場方向的跳變幅度變小,把一個分步一次的大跳變分成若干次較小的跳變來完成,于是就有了微步驅(qū)動方式,也叫細分驅(qū)動方式。

根據(jù)矢量合成的原理,當(dāng)步進電機中的兩個線圈各自產(chǎn)生的磁場的強度按照正/余弦規(guī)律變化的時候,它們的合成磁場的方向就會勻速旋轉(zhuǎn),而合成磁場的強度保持不變,如圖6所示。線圈產(chǎn)生的磁場強度與通過它的電流大小成正比,因此微步驅(qū)動方式就是讓通過線圈的驅(qū)動電流不是象分步方式那樣在0和最大值之間跳變,而是按照正/余弦規(guī)律分成幾個階梯逐步變化,如圖7所示。





那么如何來產(chǎn)生階梯變化的驅(qū)動電流呢?通常的做法是將一個PWM波形電壓信號施加到線圈上;同時串聯(lián)一個阻值較小的電阻作為電流傳感器,將電流信號轉(zhuǎn)換成電壓信號反饋回PWM控制器中;PWM控制器根據(jù)反饋信號調(diào)整輸出脈沖的占空比,從而使線圈上的平均電流等于所需的階梯電流。目前,常見的步進電機專用驅(qū)動芯片就是依據(jù)這個原理來工作的。在使用MCU直接驅(qū)動步進電機的時候,因為MCU內(nèi)部也集成了PWM模塊,所以我們也可以采用這個方法。但是,這種方法還需要使用ADC來測量反饋信號的大小,并且要實時地計算出所需的PWM脈沖的占空比,因此將會占用太多的MCU的資源,使MCU幾乎無法再處理其他的事情。






為了減少對MCU資源的占用,我們可以將其中的反饋環(huán)節(jié)刪掉,從閉環(huán)控制變?yōu)殚_環(huán)控制。對每個階梯電流,我們事先計算出所需的PWM脈沖的占空比,并做成查找表存放在FLASH中。在驅(qū)動步進電機轉(zhuǎn)動的時候,每走一個微步就從表中取出相應(yīng)的占空比來對PWM模塊進行設(shè)置,然后在當(dāng)前的這一步結(jié)束之前不再改變PWM脈沖的占空比。這樣一來就極大的減少了計算量,使MCU有足夠的資源去處理其他的事情。然而,由于定子線圈具有一定的電感,所以通過線圈的平均電流和PWM脈沖的占空比并不是線性關(guān)系,要想精確的計算出每個階梯電流對應(yīng)的占空比是相當(dāng)困難的;另外,當(dāng)轉(zhuǎn)子旋轉(zhuǎn)的時候,還會在定子線圈中產(chǎn)生感生電動勢,這個感生電動勢會使通過線圈的電流發(fā)生改變,而它的大小又與轉(zhuǎn)子永磁體的磁場強度和旋轉(zhuǎn)速度相關(guān)。因此,事實上在開環(huán)控制中不管你使用多么復(fù)雜的數(shù)學(xué)公式來計算占空比,都無法使通過線圈的平均電流總是等于預(yù)期的階梯電流。不過,所幸的是:在低端的汽車儀表中,并不要求對步進電機的轉(zhuǎn)動控制到那么精確的程度,我們可以姑且認為通過線圈的平均電流是和PWM脈沖的占空比成正比的,反正只要減小了每一步跳變的角度(相對于分步方式而言),就可以讓步進電機轉(zhuǎn)動得更平穩(wěn)一些了,噪聲也能減小一些。

電機轉(zhuǎn)動的加減速

步進電機在轉(zhuǎn)動時,因為轉(zhuǎn)子、傳動齒輪和負載的轉(zhuǎn)動慣量,使它從一個位置轉(zhuǎn)動到下一個位置(一個分步或微步)需要一定的時間。如果在轉(zhuǎn)子轉(zhuǎn)動到下一個位置之前,驅(qū)動信號就又往前走了一步的話,那么轉(zhuǎn)子的磁場方向和定子線圈產(chǎn)生的氣隙磁場方向的夾角就會超過一個分步或微步所對應(yīng)的角度。只要轉(zhuǎn)子的旋轉(zhuǎn)速度跟不上驅(qū)動信號的變化速度,這個夾角就會越來越大,當(dāng)夾角超過180度的時候,磁場對轉(zhuǎn)子的作用力的方向就會變得跟原來的方向相反,如圖8所示。這時,轉(zhuǎn)子的旋轉(zhuǎn)速度就會減慢,直到變成以相反的方向旋轉(zhuǎn)。最終的結(jié)果就是轉(zhuǎn)子所轉(zhuǎn)過的角度和氣隙磁場所轉(zhuǎn)過的角度不相等了,也就是轉(zhuǎn)子所轉(zhuǎn)過的步數(shù)和驅(qū)動信號走過的步數(shù)不相等了,人們常把這種現(xiàn)象叫做“失步”。同樣的,當(dāng)要使步進電機從高速的旋轉(zhuǎn)中停下來的時候,如果驅(qū)動信號的變化過快,轉(zhuǎn)子就有可能在慣性的作用下繼續(xù)旋轉(zhuǎn)超過180度,從而也產(chǎn)生失步。另外,由于轉(zhuǎn)子軸承、傳動齒輪和負載上都有一定的摩擦阻力,因此電機在連續(xù)轉(zhuǎn)動時的速度也是有限的,如果驅(qū)動信號的變化速度超過了電機能達到的最大轉(zhuǎn)速的話,電機也會失步。





那么,如果讓驅(qū)動信號一直保持較慢的變化速度,是不是就沒有問題了呢?答案當(dāng)然是否定的。這是因為步進電機作為儀表的顯示部件,我們要求它能夠?qū)⒈粶y信號的變化實時地顯示出來;而電機轉(zhuǎn)動如果比較慢,那么儀表的顯示就無法跟上被測信號的變化。

為了讓步進電機既不會失步,又能轉(zhuǎn)得盡可能的快,那么就要讓驅(qū)動信號的變化速度和轉(zhuǎn)子轉(zhuǎn)動的速度保持基本一致。當(dāng)電機啟動的時候,轉(zhuǎn)子做加速轉(zhuǎn)動,這時第一步的持續(xù)時間要比較長,然后每一步的持續(xù)時間逐漸變短,對應(yīng)的轉(zhuǎn)動速度變化如圖9所示。電機停止的過程則與之相反。在VID29系列步進電機的數(shù)據(jù)手冊上給出了電機啟動/停止時允許的驅(qū)動信號的變化速度(啟動頻率,Start-stop Frequency)和電機連續(xù)轉(zhuǎn)動時允許的驅(qū)動信號的變化速度(最大驅(qū)動頻率,Max Driving Frequency),我們可以根據(jù)它們計算出第一步的持續(xù)時間和加速過程結(jié)束后的每一步的持續(xù)時間。






步進電機和MCU的硬件連接

在LG32 Cluster Reference Design中,MCU和步進電機之間的連接如圖10所示。其中使用了一片74ACT125作為電流放大驅(qū)動,這是因為MC9S08LG32的I/O口輸出的電流最大只10mA,而VID29步進電機需要的驅(qū)動電流最大可達20mA。使用TPM模塊的兩個PWM輸出通道驅(qū)動步進電機兩個線圈的正極,兩個普通I/O口驅(qū)動兩個線圈的負極。TPM模塊的兩個通道也可以設(shè)置成普通I/O口,這樣就可以根據(jù)需要使用微步方式驅(qū)動或者分步方式驅(qū)動。

在MC9S08LG32中集成了兩個TPM模塊,其中TPM1有2個通道,TPM2有6個通道。在這里選擇TPM1來驅(qū)動步進電機,是因為當(dāng)把一個TPM模塊的某一個通道設(shè)置為PWM輸出時,此TPM模塊公用的模數(shù)(MOD)寄存器將被設(shè)成一個比較特殊的值,這樣就會給它的其它通道的功能使用造成很多限制。所以為了更加充分地利用MCU的資源,這里選擇了通道較少的TPM1,而把通道較多的TPM2留作他用。






步進電機驅(qū)動程序

本驅(qū)動程序為應(yīng)用程序提供的接口函數(shù)有三個:

1. InitStepper:初始化函數(shù),對驅(qū)動所用到的I/O口和定時器進行設(shè)置,并讓步進電機轉(zhuǎn)到初始位置——使儀表的指針指到零點的位置。

函數(shù)原型:void InitStepper(void);

參數(shù):無

返回值:無

2. SetStepperTarget:設(shè)定步進電機的目標位置,也就是要讓儀表的指針轉(zhuǎn)到哪個位置(以相對于零點的角度來表示),整個轉(zhuǎn)動的過程(如需要轉(zhuǎn)多少步,往哪個方向轉(zhuǎn)等)應(yīng)用程序無需知道,而且應(yīng)用程序可以指定任意目標位置。

函數(shù)原型:void SetStepperTarget(word wTargetDegree);

參數(shù):word wTargetDegree,目標位置相對于零點的角度,其值是以(1/12)度(等
于微步方式下的步距)為單位的;

返回值:無

3. GetStepperCurrent:得到步進電機的當(dāng)前位置。

函數(shù)原型:word GetStepperCurrent(void);

參數(shù):無

返回值:返回儀表的指針當(dāng)前所指的位置(以相對于零點的角度來表示),其值也以(1/12)度(等于微步方式下的步距)為單位。

另外,在頭文件Stepper.h中定義了選擇驅(qū)動方式的宏,使用者修改宏定義就可以選擇分步驅(qū)動方式或微步驅(qū)動方式,如下:

#define STEPPER_PARTIAL_MODE 0

#define STEPPER_MICRO_MODE !STEPPER_PARTIAL_MODE

如前所述,驅(qū)動信號的變化速度不能太快,每次變化后都必須保持一段時間不變,為了讓驅(qū)動程序占用的CPU的處理時間更少,就需要用到一個定時器。除了上面的三個接口函數(shù)外,驅(qū)動程序的其余部分都在定時器的中斷服務(wù)程序中運行。

在驅(qū)動程序中,用兩個靜態(tài)變量來保存步進電機的目標位置和當(dāng)前位置,其值是到零點的步數(shù)。定時器中斷由SetStepperTarget函數(shù)使能,在中斷服務(wù)程序中根據(jù)目標位置和當(dāng)前位置的差值來決定步進電機轉(zhuǎn)動的方向和步數(shù),然后根據(jù)選擇的驅(qū)動方式執(zhí)行相應(yīng)的轉(zhuǎn)動程序。

分步方式程序

從前面的圖5中,可以看到分步方式下的驅(qū)動信號是周期性變化的,每個周期對應(yīng)轉(zhuǎn)子旋轉(zhuǎn)一圈(輸出軸旋轉(zhuǎn)2度),其中包含6個分步,分別對應(yīng)轉(zhuǎn)子的6個平衡位置,我們也可以把它們叫做6個相位。因此,分步驅(qū)動方式下MCU的4個I/O口輸出的電平也有6種組合,分別對應(yīng)這6個相位。

在程序中,使用一個靜態(tài)局部變量bPhase來保存步進電機當(dāng)前所處的相位,步進電機每走一個分步,相位就加1(逆時針轉(zhuǎn))或者減1(順時針轉(zhuǎn)),然后在一個switch…case結(jié)構(gòu)中按新的相位設(shè)置I/O口的輸出狀態(tài),如下:

switch(bPhase)
{
case 0:
STEPPER_LP = 1;
STEPPER_LN = 0;
STEPPER_RP = 1;
STEPPER_RN = 0;
break;
case 1:
STEPPER_LP = 0;
STEPPER_LN = 0;
STEPPER_RP = 1;
STEPPER_RN = 0;
break;
case 2:
STEPPER_LP = 0;
STEPPER_LN = 1;
STEPPER_RP = 0;
STEPPER_RN = 0;
break;
case 3:
STEPPER_LP = 0;
STEPPER_LN = 1;
STEPPER_RP = 0;
STEPPER_RN = 1;
break;
case 4:
STEPPER_LP = 0;
STEPPER_LN = 0;
STEPPER_RP = 0;
STEPPER_RN = 1;
break;
case 5:
STEPPER_LP = 1;
STEPPER_LN = 0;
STEPPER_RP = 0;
STEPPER_RN = 0;
break;
default:
;
}

微步方式程序

從前面的圖7中,可以看到微步方式下的驅(qū)動信號是近似于正弦波的階梯電流信號,每個周期對應(yīng)轉(zhuǎn)子旋轉(zhuǎn)一圈(輸出軸旋轉(zhuǎn)2度),當(dāng)把每個分步細分成4個微步的時候,一個正弦波周期里就有24個階梯。本文利用PWM來產(chǎn)生這些階梯電流,并且近似地認為PWM的占空比與平均電流大小成正比。

首先,把TPM1的通道0和1初始化成邊沿對齊的PWM工作模式,設(shè)置TPM1的工作時鐘為總線時鐘,預(yù)分頻系數(shù)為1,設(shè)置TPM1MOD的值為255,這樣當(dāng)總線時鐘頻率為16MHz時,所產(chǎn)生的PWM信號的頻率是64KHz。在對TPM進行設(shè)置的時候需要考慮兩個方面:

其一,因為PWM的占空比與平均電流大小成正比,所以要使產(chǎn)生的平均電流盡量接近理想的正弦波分成24個階梯時的值,就要求PWM占空比的精度比較高。TPM1MOD的值決定了每個PWM周期里有多少個時鐘周期,脈沖寬度則由各個通道的Value寄存器的值決定,最小為0(對應(yīng)占空比為0),最大為(TPM1MOD+1)(對應(yīng)占空比為100%),設(shè)置Value寄存器的值大于(TPM1MOD+1)的效果和設(shè)為等于(TPM1MOD+1)是一樣的。PWM的占空比其實就是Value寄存器的值(TPM1MOD+1)的比值,由于寄存器里的值只能是整數(shù),所以占空比的精度只能達到1/(TPM1MOD+1)。因此,要使占空比的精度較高,就要給TPM1MOD設(shè)置比較大的值。

其二,因為電機的線圈是個感性負載,所以用PWM驅(qū)動的時候,線圈上的電流是波浪式變化的,如圖11所示。電流的變化導(dǎo)致磁場強度的變化,兩個線圈各自產(chǎn)生的磁場強度變化則導(dǎo)致合成磁場的強度和方向都發(fā)生變化,這種波浪式的變化將使電機產(chǎn)生振動和噪聲。顯然,電流波紋的幅度是PWM信號的周期的單調(diào)增函數(shù),即PWM的周期越長則電流波紋的幅度越大。因此,PWM的周期應(yīng)當(dāng)盡量短,而PWM的周期等于(TPM1MOD+1)乘以TPM1的工作時鐘的周期,所以應(yīng)當(dāng)使TPM1的工作時鐘的頻率盡量高,而且TPM1MOD的值不宜設(shè)得太大。





設(shè)置完P(guān)WM的工作時鐘頻率和模值(TPM1MOD)后,還要計算出各個階梯電流所對應(yīng)的占空比,即Value寄存器的值,計算公式如下:





把算出的數(shù)值做成查找表放在FLASH存儲器中。兩個線圈的電流相位相差60度


,而

,因此把由上式計算得到的一組數(shù)字的順序循環(huán)移動4個位置就得到另一個線圈的電流對應(yīng)的查找表。由于PWM的占空比只能控制平均電流的大小,而電流的方向由其他設(shè)置決定,所以程序中這兩個表的數(shù)字都取絕對值,它們的定義如下:

static const word waCosineTable[] =
{
256, 246, 221, 180, 127, 65, 0, 65, 127, 180, 221, 246,
256, 246, 221, 180, 127, 65, 0, 65, 127, 180, 221, 246
};
static const word waShiftCosTable[] =
{
127, 180, 221, 246, 256, 246, 221, 180, 127, 65, 0, 65,
127, 180, 221, 246, 256, 246, 221, 180, 127, 65, 0, 65
};

與分步方式程序相似地,本文把這24個階梯叫做24個相位,用一個靜態(tài)局部變量bPhase來保存步進電機當(dāng)前所處的相位,步進電機每走一個微步,相位就加1(逆時針轉(zhuǎn))或者減1(順時針轉(zhuǎn)),然后在兩個查找表中取出相應(yīng)的數(shù)值寫到TPM1的兩個通道的Value寄存器中。為了實現(xiàn)電流的方向變化,需要在電流過零對應(yīng)的相位時改變PWM輸出的極性和連接線圈另一極的GPIO口輸出的電平,在程序中用switch…case結(jié)構(gòu)來完成這個任務(wù),代碼如下:

void MoveStepper1Micro(void)
{
static byte bPhase;
if(bDirection == 1)
{
if(bPhase == 0)
bPhase = 23;
else
bPhase--;
switch(bPhase)
{
case 17:
V
I
t
STEPPER_LN = 1; //設(shè)置左線圈負極GPIO口輸出高電平,并
TPM1C0SC = 0x24; //設(shè)置PWM極性為低有效,使電流方向為負
break;
case 21:
STEPPER_RN = 1; //設(shè)置右線圈負極GPIO口輸出高電平,并
TPM1C1SC = 0x24; //設(shè)置PWM極性為低有效,使電流方向為負
break;
case 5:
STEPPER_LN = 0; //設(shè)置左線圈負極GPIO口輸出低電平,并
TPM1C0SC = 0x28; //設(shè)置PWM極性為高有效,使電流方向為正
break;
case 9:
STEPPER_RN = 0; //設(shè)置右線圈負極GPIO口輸出低電平,并
TPM1C1SC = 0x28; //設(shè)置PWM極性為高有效,使電流方向為正
break;
default:
;
}
wCurrentPosition++;
}
else if(bDirection == 0xFF)
{
if(bPhase == 23)
bPhase = 0;
else
bPhase++;
switch(bPhase)
{
case 6:
STEPPER_LN = 1; //設(shè)置左線圈負極GPIO口輸出高電平,并
TPM1C0SC = 0x24; //設(shè)置PWM極性為低有效,使電流方向為負
break;
case 10:
STEPPER_RN = 1; //設(shè)置右線圈負極GPIO口輸出高電平,并
TPM1C1SC = 0x24; //設(shè)置PWM極性為低有效,使電流方向為負
break;
case 18:
STEPPER_LN = 0; //設(shè)置左線圈負極GPIO口輸出低電平,并
TPM1C0SC = 0x28; //設(shè)置PWM極性為高有效,使電流方向為正
break;
case 22:
STEPPER_RN = 0; //設(shè)置右線圈負極GPIO口輸出低電平,并
TPM1C1SC = 0x28; //設(shè)置PWM極性為高有效,使電流方向為正
break;
default:
;
}
wCurrentPosition--;
}
TPM1C0V = waCosineTable[bPhase];
TPM1C1V = waShiftCosTable[bPhase];
}

轉(zhuǎn)動速度控制

由于被測量的輸入信號的變化是隨機的,有時快有時慢,為了讓儀表實時、直觀地顯示出輸入信號的變化,驅(qū)動程序就必須對步進電機的轉(zhuǎn)動速度進行適當(dāng)?shù)目刂啤?梢哉f,一個汽車儀表做得好不好,很大程度上就看它對步進電機的轉(zhuǎn)動控制得好不好。

通常,儀表對輸入信號進行周期性的定時測量,因此對步進電機目標位置(指針位置)的設(shè)定也是每隔一段時間進行一次的。在程序中給這個間隔時間定義了一個宏,放在Stepper.h頭文件中,以便根據(jù)應(yīng)用程序的需要作修改,宏定義如下:

#define STEPPER_UPDATE_INTERVAL 256 //單位:毫秒,必須在(8,512)內(nèi)
這里把指針位置的更新間隔時間限定在8到512毫秒之間是因為:

1. 儀表是用來給人看的,而人眼并不能看清變化非常快的東西,所以對指針位置更新得太快就沒有實際意義,徒然增加CPU的處理負擔(dān)而已。

2. 如下文將要提到的,本程序使用的定時器所能達到的最大中斷間隔時間為512毫秒,為了簡化定時器的中斷服務(wù)程序,減小CPU的負荷,所以限定指針位置的更新間隔時間不要超過512毫秒。

為了讓儀表的指針擺動得更加平穩(wěn)、自然,最好能讓電機在下一次設(shè)定目標位置前的那一刻剛好轉(zhuǎn)動到本次設(shè)定的目標位置。為此就要計算出電機在這一段時間里的平均旋轉(zhuǎn)速度,也就是每個分步或微步的平均間隔時間。當(dāng)所需的平均速度較大時,如前所述,還需要對電機進行加減速的控制。

為了實現(xiàn)步進電機的轉(zhuǎn)動速度控制,在定時器的每次中斷里只讓電機轉(zhuǎn)動一個分步/微步,然后用一定的算法計算出這一步到下一步之間應(yīng)當(dāng)間隔的時間,以重新設(shè)置定時器的溢出時間。在本驅(qū)動程序中,定時器選用的是TPM2模塊的通道0,對其相關(guān)的寄存器的設(shè)置說明如下:

初始化:

SCGC1_TPM2 = 1; //使能TPM2模塊的時鐘
TPM2MOD = 0; //設(shè)置TPM2的計數(shù)器為自由運行模式
TPM2SC = 0x0F; //選擇總線時鐘為時鐘源,預(yù)分頻系數(shù)為128

把預(yù)分頻系數(shù)設(shè)置為128是為了讓定時器的溢出時間能夠盡可能大,減少中斷對CPU造
成的負擔(dān)。當(dāng)總線時鐘頻率為16MHz時,此定時器能達到的最大中斷間隔時間是512毫秒。

啟動定時器:

TPM2C0V = TPM2CNT + 2;
TPM2C0SC = 0x50;

設(shè)置通道0為輸出比較模式,比較一致時產(chǎn)生中斷,但比較結(jié)果不輸出到管腳上(相關(guān)管腳仍然由GPIO控制)。因為啟動定時器時步進電機還沒有開始轉(zhuǎn)動,所以給比較值寄存器(TPM2C0V)設(shè)置的值是計數(shù)器(TPM2CNT)當(dāng)前的值加2,即讓它盡快地產(chǎn)生一次中斷。然后在每次中斷產(chǎn)生后,在中斷服務(wù)程序里讓步進電機轉(zhuǎn)動一步,并給TPM2C0V設(shè)置一個新的值,即根據(jù)所需的間隔時間給TPM2C0V增加一定的數(shù)值。

為了對步進電機進行加減速控制,我們需要知道它啟動時第一步所需的間隔時間和最大轉(zhuǎn)速時每一步所需的間隔時間。步進電機啟動時第一步所需的間隔時間的最小值(Tss)可以由下面的公式計算得到:





式中,d是步距,即每走一步輸出軸轉(zhuǎn)過的角度;fss是啟動頻率,即啟動時允許的輸出軸的最大轉(zhuǎn)速,單位是(度/秒)。

從VID29系列步進電機的數(shù)據(jù)手冊上可以查到,fss等于125(度/秒),在分步方式下d等于(1/3)度。代入上式,可以算出Tss等于(1/375)秒,約等于2667微秒。

在程序中定義MAX_PARTIAL_STEP_TIME為400,當(dāng)在中斷服務(wù)程序里把TPM2C0V的值增加400后,下一次比較中斷產(chǎn)生的時間和本次中斷之間的間隔就為3200微秒,大于Tss且還有一定的裕量。

步進電機達到最大轉(zhuǎn)速時每一步所需的間隔時間(Tmm),計算公式如下:





式中,d仍是步距,fmm是最大驅(qū)動頻率,即連續(xù)旋轉(zhuǎn)時輸出軸的最大轉(zhuǎn)速,單位是(度/秒)。

從VID29系列步進電機的數(shù)據(jù)手冊上查到fmm等于600(度/秒),算出Tmm約等于556微秒。在程序中定義MIN_PARTIAL_STEP_TIME為80,對應(yīng)的間隔時間為640微秒,同樣是大于Tmm且有一定的裕量。

對于微步方式,由于我們把每個分步細分成4個微步,所以相應(yīng)的Tss和Tmm都是分步方式時的四分之一。

在程序中,設(shè)定步進電機的目標位置SetStepperTarget函數(shù)里根據(jù)目標位置與當(dāng)前位置的差(wDiff) 計算出需要的平均轉(zhuǎn)速, 也就是每一步的平均間隔時間(wAverageStepTime),根據(jù)平均間隔時間設(shè)置TPM2C0V的增量(wTimerIncrement),并啟動定時器。在定時器的中斷服務(wù)程序中驅(qū)動電機一步一步地向目標位置轉(zhuǎn)動,當(dāng)步進電機轉(zhuǎn)動到目標位置后,讓定時器停止工作。

另外,考慮到輸入信號變化很快時,電機的轉(zhuǎn)動速度可能跟不上信號的變化,從而在下一次測量完輸入信號,對步進電機的目標位置再次進行設(shè)定時,電機還正在轉(zhuǎn)動之中。這時,電機的轉(zhuǎn)動速度有可能很快,在這種情況下如果重新啟動定時器則有可能造成失步,因此SetStepperTarget程序根據(jù)電機當(dāng)前的狀態(tài)進行了分別的處理,其流程如圖12所示。






在定時器的中斷服務(wù)程序中,首先判斷bBrakeFlag標志,如果不是0,則表示當(dāng)前轉(zhuǎn)動方向跟目標位置不一致,需要先減速到停止,然后再反向轉(zhuǎn)動。當(dāng)bBrakeFlag為0時,根據(jù)平均間隔時間決定何時讓電機轉(zhuǎn)動一個分步/微步,以及是否需要進行加減速。當(dāng)平均間隔時間大于Tss時,電機每隔一個平均間隔時間轉(zhuǎn)動一步,作勻速轉(zhuǎn)動。而當(dāng)平均間隔時間小于Tss時,則讓電機第一步的間隔時間為Tss,然后逐漸減小,即做加速轉(zhuǎn)動,直到達到需要的平均轉(zhuǎn)速或電機允許的最高轉(zhuǎn)速;到接近目標位置時,則讓每一步的間隔時間逐漸加長,電機減速轉(zhuǎn)動,并且使最后一步的間隔時間不小于Tss,以保證不會失步。

定時器中斷服務(wù)程序的流程如圖13所示。





總結(jié)

使用本文給出的驅(qū)動程序,用戶的應(yīng)用程序和驅(qū)動程序之間的接口非常簡單,所有的控制步進電機的邏輯都封裝在驅(qū)動程序中,而且驅(qū)動程序占用CPU的處理時間非常少。另外,本程序根據(jù)汽車儀表應(yīng)用的特點對步進電機的轉(zhuǎn)動速度進行了相應(yīng)的控制,所以不管輸入信號變化快慢,電機輸出帶動的指針都能快速、平穩(wěn)地轉(zhuǎn)動,以讓人感覺很自然的方式將輸入的物理量顯示出來。
本文地址:http://www.qingdxww.cn/thread-43097-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節(jié)省時間和空間
  • Dev Tool Bits——使用DVRT協(xié)議查看項目中的數(shù)據(jù)
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監(jiān)視
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲女人国产香蕉久久精品 | 成人精品视频在线观看播放 | 亚洲高清在线观看 | 免费亚洲成人 | 久久综合免费 | 落跑甜心电视剧全集在线观看 | 国产精品1024在线永久免费 | 可以免费看黄的网址 | 国产日韩欧美在线一二三四 | 日韩欧美亚洲乱码中文字幕 | 在线观看免费日本 | 向日葵视频免费下载 | 人人模人人 | 日韩亚洲人成在线综合日本 | 日本精品久久久久中文字幕8 | 久久www免费人成看片入口 | 91短视频在线观看2019 | 性生活网站| 欧美三级一区 | 91网站视频在线观看 | 亚洲 欧美 91 | 日本黄色网页 | 91麻豆国产在线观看 | 成人在线影视 | 久久99精品久久久久久三级 | 欧美韩日在线 | 久久国产精品系列 | 国产亚洲一区在线 | 中文字幕在线精品视频入口一区 | 久久国产免费福利永久 | 国产后式a一视频 | 国产91区| 亚洲资源在线视频 | h成人口工动漫在线看网站 h成人动漫 | 国产成人香蕉在线视频网站 | 色婷婷六月 | 国产中日韩一区二区三区 | 亚欧一区 | 欧美性色xo影院永久禁欲 | 日韩亚洲 | www.不卡视频 |