大家好,很高興又給大家寫博客了。平時工作比較繁忙,恰巧最近在學習和研究DSP,給大家帶來這篇文章。文章的第1部分和第2部分爲普中開發攻略摘抄的,因爲寫的比較詳細,我也就不過多解釋了,本文關注的點在於原理和程序,希望能給大家帶來些幫助。本文實現的效果就是通過三個按鍵去控制四相雙極性步進電機的正轉,反轉和停止。
本篇文章的目錄如下:
1.步進電機的介紹
2.步進電機的硬件電路設計
3.步進電機的驅動程序
1.步進電機的介紹(該部分來自普中開發板攻略摘抄,瞭解一下)
強烈推薦大家看這個文章 四相雙極性電機的驅動原理(點此進入),下面這些適當瞭解,如果大家從來沒有接觸過電機的話可能會花那麼一些時間,你需要去花上一兩個小時去了解下步進電機然後再回來看下面的內容,學習當循序漸進。
四相雙極性電機
我們先來看看這兩張圖,從圖中我們可以看到有4個線圈,我們把它稱做4相,一個線圈就是一個相,有幾個線圈就對應幾個相,比較好理解。我們看到它的一組線圈有兩個互相連接,那麼很明顯它有2個接線頭,我們把它稱做A+和A-,B+和B-。我們的電流從A+流到A-,通過我們的安培定理和右手定則,我們可以得到電流和磁場的關係,這個並不重要 ,我們只要知道,A+和A-是互相連接的,所以它們是先後流過電流的,這對於我們的程序來說,假如A+對應一個GPIO口,A-對應一個GPIO口,我們只要按照順序來給它一個高低電平,就會有電流流過,假如A+爲高,A-爲低電平,這時候,電流從A+流到A-,產生磁場,同樣我們的B+和B-也是一樣的。所以四相就對應四個GPIO口的高低電平。只要我們按照順序來開啓相序,我們的轉子就會轉起來了。後面的電機時序就是這樣來的。
(圖片來自網上,借用一下)
引用:步進電機是將電脈衝信號轉變爲角位移或線位移的開環控制元件。在非超載情況下,電機的轉速、停止的位置只取決於脈衝信號的頻率和脈衝數,而不受負載變化的影響,即給電機加一個脈衝信號,電機則轉過一個步距角。這一線性關係的存在,加上步進電機只有週期性的誤差而無累積誤差等特點,使得步進電機在速度、位置等控制領域的控制操作非常簡單。雖然步進電機應用廣泛,但它並不像普通的直流和交流電機那樣在常規狀態下使用, 它必須由雙環形脈衝信號、 功率驅動電路等組成控制系統方可使用。
步進電機主要分爲以下幾類:
(1)永磁式(PM)
(2)反應式(VR)
(3)混合式(HB)
步進電機主要技術指標如下:
(1)相數
(2)步距角
(3)拍數
(4)保持轉矩
步進電機有三線式、 四線式、 五線式和六線式, 但其控制方式均相同, 都要以脈衝信號電流來驅動。 假設每旋轉一圈需要 200 個脈衝信號來勵磁, 可以計算出每個勵磁信號能使步進電機前進 1.8° 。 其旋轉角度與脈衝的個數成正比。 步進電動機的正、 反轉由勵磁脈衝產生的順序來控制。 六線式四相步進電機是比較常見的, 它的控制等效電路如下圖所示:
勵磁方式
步進電機的勵磁方式分爲全步勵磁和半步勵磁兩種。其中全步勵磁又有一相勵磁和二相勵磁之分, 半步勵磁又稱一二相勵磁。 假設每旋轉一圈需要 200 個脈衝信號來勵磁, 可以計算出每個勵磁信號能使步進電動機前進 1.8°。簡要介紹如下:
①一相勵磁:在每一瞬間, 步進電機只有一個線圈導通.每送一個勵磁信號, 步進電機旋轉 1.8, 這是三種勵磁方式中最簡單的一種。
其特點是:精確度好、 消耗電力小,但輸出轉矩最小, 振動較大。 如果以該方式控制步進電機正轉
②二相勵磁:在每一瞬間,步進電動機有兩個線圈同時導通。每送一個勵磁信號, 步進電機旋轉 1.8。
其特點是: 輸出轉矩大, 振動小, 因而成爲目前使用最多的勵磁方式。 如果以該方式控制步進電機正轉, 對應的勵磁順序見下表。 若勵磁信號反向傳送, 則步進電機反轉。
③一二相勵磁:爲一相勵磁與二相勵磁交替導通的方式。 每送一個勵磁信號, 步進電機旋轉 0.9。
其特點是:分辨率高, 運轉平滑, 故應用也很廣泛。 如果以該方式控制步進電機正轉,對應的勵磁順序見下表。 若勵磁信號反向傳送, 則步進電機反轉。
2.步進電機的原理圖
其實這個電路很簡單,就是一個驅動芯片(TC15085)來驅動馬達,就是一個非門的達林頓管,大家知道它是非門就可以了,它有多個通道。適用於把多個電平進行翻轉,它的驅動電流也比較大,所以比較適合用於驅動馬達。爲什麼用到驅動IC呢?而不是直接用GPIO口去控制電機的各個相位,這裏的相指的是線圈。原因很簡單,因爲我們不能直接通過控制IC去控制電機,第一,耗電流,我們需要知道GPIO口能輸出多大的電流。第二,有危險因素,可能會燒掉主芯片。所以通過IC的GPIO口去作一個開關控制,類似於MOS管的柵極給它一個門限電壓導通一樣,常見的把控制芯片的GPIO口當做開關用的很多,比如繼電器,LED燈等等,都是把IO口作爲一個控制作用,而不是去直接去驅動它。下圖中我們用到了GPIO2,3,4,5這四個GPIO口。
這裏是我自己用EXCEL列出來的,後面程序用到,原理就是把時序依次送到數據寄存器裏。從而實現電機的運作。這裏有點難理解,看不懂就多思考幾次,或者給我留言。因爲我們是要把GPIO和電機的極性時序分別對應上,所以請看下面這張圖,右邊就是28335的GPIO和電機的電極對應關係。我們要保證把這4位數送進GPIO數據寄存器裏,而且又要保證GPIO數據寄存器的其他的位不受影響,所以這裏我們用到邏輯運算屏蔽其他位,邏輯運算不熟悉的同學可以去百度查詢下。
利用該算法去屏蔽其他位 ,用到了邏輯運算。這個比較難理解,希望大家不懂的多多看一下。
Uint32 STEP_MOTOR_ZTurn[] = {
(GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffff7,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffdf,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffffb,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffef
};
Uint32 STEP_MOTOR_FTurn[] = {
(GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffef,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffffb,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffdf,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffff7
};
3.步進電機的驅動程序
程序的話大家仔細看,其實不難,按鍵掃描程序的話,由於開發板是矩陣按鍵,驅動程序我這裏就不列出來了。等會我把源碼打包供大家下載。現在來給大家講解下程序
/*
* main.c
*
* Created on: 2020年5月31日
* Author: Administrator
*/
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "key.h"
#include "leds.h"
#include "beep.h"
#include "relay.h"
#include "dc_motor.h"
#include "step_motor.h"
void delay(void);
//
//#define 4LINE2
void main(){
InitSysCtrl();
LED_Init();
KEY_Init();
BEEP_Init();
StepMotorInit();
// the sequence of step_motor by working,1000,0100,0010,0001
//這裏定義正反轉的數組,根據上面給的圖片推導出來的
Uint32 STEP_MOTOR_ZTurn[] = {
(GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffff7,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffdf,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffffb,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffef
};
Uint32 STEP_MOTOR_FTurn[] = {
(GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffef,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffffb,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffdf,
(GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffff7
};
Uint16 i = 0;
static short flag_key1 = 0;//按鍵1按下標誌
static short flag_key2 = 0;//按鍵2按下標誌
static short flag_key4 = 0;//按鍵4按下標誌
while(1){
i++;
if(i%5000==0){LED2_TOGGLE;}//打開LED2
BEEP_ON;//打開蜂鳴器
DELAY_US(200);
char key_scan = Key_Scan();
//判斷按鍵按的是哪個,需要消抖,給個15ms的消抖時間
//如果確定按鍵按的是1,標誌爲1
if(key_scan==1){
DELAY_US(15000);
if(key_scan==1){
flag_key1 = 1;
flag_key2 = 0;
flag_key4 = 0;
}
}
//如果確定按鍵按的是2,標誌爲2
if(key_scan==2){
DELAY_US(15000);
if(key_scan==2){
flag_key2 = 1;
flag_key1 = 0;
flag_key4 = 0;
}
}
//如果確定按鍵按的是4,標誌爲4
if(key_scan==4){
DELAY_US(15000);
if(key_scan==4){
flag_key2 = 0;
flag_key1 = 0;
flag_key4 = 1;
}
}
//如果按鍵1按下
if(flag_key1==1){
int j;
for(j=0;j<4;j++){
GpioDataRegs.GPADAT.all = STEP_MOTOR_ZTurn[j];//把時序送到GPADAT寄存器裏,GPADAT是GpioDataRegs寄存器裏的一組,包含GPIO0-31共32個GPIO口
DELAY_US(5000); //delay 5ms
}
}
//如果按鍵2按下
if(flag_key2==1){
int j;
for(j=0;j<4;j++){
GpioDataRegs.GPADAT.all = STEP_MOTOR_FTurn[j];
DELAY_US(5000); //delay 5ms
}
}
}
}
文章用到源碼下載地址:程序下載