這兩天開始學調 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...