28BYJ 48步進電機驅動程式

2021-10-11 09:21:20 字數 3407 閱讀 7171

這兩天開始學調 28byj-48步進電機,但是**賣家給的資料和網上搜到的都是51的程式,用的驅動板都是uln2003。

以下是我自己寫的stm32的程式。我用的板子是f103zet6,驅動板是l298n。

電機驅動原理簡述:電機內有四組線圈,每給乙個電機供電,轉子就會轉動乙個角度,按順序輪流迴圈轉動給四個線圈供電,就能讓轉子一直轉起來。跟詳細的說明網上有很多,這裡就不重複了。

接線:紅線接5v電源,其餘四根按順序接驅動板上,其餘四根的顏色是橙黃藍粉,不同廠家做的順序可能不一樣,但都是按順序排的,比如我的順序就是橙黃藍粉,或者說粉藍黃橙也對,反正就是按這個顏色的先後順序接就對了。

時序說明:電機內部四個線圈的一端都接到5v上,所以我們需要先給線圈的另一端供5v的電,然後按一定的順序拉低電壓,使線圈通電,電機就能動了。我們是通過驅動板控制的,也就是說,io口預設輸出高電平,然後按時序給低電平。

↓↓↓四相八拍時序圖↓↓↓

↓↓↓四相單四拍時序圖↓↓↓

↓↓↓四相雙四拍時序圖↓↓↓↓

以下是原始碼:首先是io口的初始化,這裡我設pd1為1號,pd4為2號,pd6為3號,pg9為4號。

#include

"motor.h"

#include

"sys.h"

#include

"delay.h"

void

my_motor_init

(void

)

然後是標頭檔案

這裡用了正點原子的 sys.h標頭檔案進行了一些巨集定義

裡面宣告了四個函式,第乙個是上面的初始化,後面三個是三種不同的驅動寫法

#include

"sys.h"

#define pd1 pdout(1)

#define pd4 pdout(4)

#define pd6 pdout(6)

#define pg9 pgout(9)

#define in1 pdout(1)

#define in2 pdout(4)

#define in3 pdout(6)

#define in4 pgout(9)

#ifndef my_motor_h

#define my_motor_h

void

my_motor_init

(void);

void

my_motor_working_0

(int time_us)

;//low b寫法

void

my_motor_working_1

(u16 arr,

int m_us)

;void

my_motor_working_2

(u16 arr,

int m_us)

;#endif

第一種

這是最直觀的控制方法,直接一步一種情況的控制,每一步中間要有乙個延遲,控制我們輸出的低電平寬度,這裡我用微秒us控制。據電機說明書,脈衝頻率不能太高,我這裡試了下,似乎至少要大於一點多個公釐ms,就是1000多微妙us,因此我在主函式里設脈衝頻率為1100us。這段是四相八拍的程式,這樣寫的話不夠靈活,換成其他方式就很麻煩。

void

my_motor_working_0

(int time_us)

//low b寫法

第二種

將每一步的io口狀態都變成乙個二進位制數某一位,如上面的第一步,按pd1,pd4,pd6,pg9的順序,就可以得到乙個二進位制數0111,第二步就是0011,不知道是不是md5的原因還是什麼原因,程式無法識別二進位制字首0b,所以我這裡寫成16進製制,並按順序寫到乙個陣列中,那麼我們就可以得到乙個這樣的陣列(我在主函式裡定義)

time_48_0=

;

在這段函式裡,for進行0~7的迴圈,四個if分別判斷陣列元素的一二三四位,符合條件就進行相應的操作。要注意的是,符合條件和不符合條件的操作都要有,保持四根訊號線預設是高電平的狀態,或者說for每次運算完,四個io口的結果都是要符合上面我給出的時序表。拿這段程式舉例,如果我不寫else,io口就是上一步的狀態,顯然這樣是有問題的。

void

my_motor_working_1

(u16 arr,

int m_us)

}

第三種

用陣列裡的數進行位運算。要注意的是,通過巨集定義對io狀態進行控制的數值,似乎只能是0和1,如5、7、8之類的數輸入,雖然也有電,電機也會轉,但轉起來很奇怪,這裡我統一只用0和1控制。

這段函式拿in2距離,與0x4(即0100)進行與運算,這樣就得到了第二位的結果(位3,位2,位1,位0),不管是0還是1,都右移最低位(位0),這樣得出的結果就是前面三位都是0 ,只有最低位的數是有效資料,然後賦給巨集定義符。

void

my_motor_working_2

(u16 arr,

int m_us)

}

然後就沒了。最後再貼出我主函式。

#include

"sys.h"

#include

"motor.h"

#include

"delay.h"

intmain

(void);

//四相八拍 順轉

u16 time_48_1=

;//四相八拍 逆轉

u16 time_414_0=

;//四相單四拍 順轉

u16 time_414_1=

;//四相單四拍 逆轉

u16 time_424_0=

;//四相雙拍 順轉

u16 time_424_1=

;//四相雙拍 逆轉

int us=0;

my_motor_init()

;delay_init()

; us=

1200

;while(1

)}

這裡的順轉和逆轉,跟線序有關,等你開始調的時候你就懂了。

28BYJ 48步進電機

今天練習了一下步進電機,看過資料後開始進行程式設計測試,程式設計後能順利讓電機轉動起來,並且數度可調,但是當我想讓電機只轉一圈時問題來了。這款步進電機的減速比為1 64,步進角為5.625 64度。那麼要轉一圈需要的脈衝多少呢,我自己算了算。乙個脈衝轉5.625 64 0.087890625度,所以...

28BYJ 48步進電機原理

28byj 48 是 4 相永磁式減速步進電機,其外觀如圖 9 3 所示 圖 9 3 步進電機外觀 我們先來解釋 4 相永磁式 的概念,28byj 48 的內部結構示意圖 9 4 所示。先看裡圈,它上面有 6 個齒,分別標註為 0 5,這個叫做轉子,顧名思義,它是要轉動的,轉子的每個齒上都帶有永久的...

28BYJ 48步進電機介紹

步進電機28byj 48名稱含義 28 表示步進電機的有效最大外徑為28公釐 b 表示步進電機 步 字漢語拼音首字母 y 表示永磁式 永 字漢語拼音首字母 j 表示減速型 減 字漢語拼音首字母 byj 組合即為永磁式減速步進電機 48 表示四相八拍 5v 表示額定電壓為5v,且為直流電壓 步進角 5...