树莓派+ L298N 控制二相四线步进电机
樹莓派+ L298N 控制二相四線步進電機
1 步進電機
步進電機是一種將電脈沖信號轉換成相應角位移或線位移的電動機。在非超載的情況下,電機的轉速、停止的位置只取決于脈沖信號的頻率和脈沖數,而不受負載變化的影響,即給電機加一個脈沖信號,電機則轉過一個步距角。這一線性關系的存在,加上步進電機只有周期性的誤差而無累積誤差等特點。使得在速度、位置等控制領域用步進電機來控制變的非常的簡單。
1.1 步進電機相關概念
相數:產生不同對極N、S磁場的激磁線圈對數,常用 m 表示。例如:二相四線電機,就有兩對極N、S磁場的激磁線圈,四個線圈。上圖可知,A+,A- 是連通的,B+ 和B- 是連通的,分別記為A組、B組。在不知道電機接線圖的情況下可以用萬用表測試,即相互連通的為一組。
拍數:完成一個磁場周期性變化所需脈沖數或導電狀態用n表示,或指電機轉過一個齒距角所需脈沖數,以四相電機為例,有四相四拍運行方式即AB-BC-CD-DA,四相八拍運行方式即 A-AB-B-BC-C-CD-D-DA。
步距角:對應一個脈沖信號,電機轉子轉過的角位移用θ表示。θ=360度(轉子齒數J運行拍數),以常規二、四相,轉子齒為50齒電機為例。四拍運行時步距角為θ=360度/(50×450\times 450×4)=1.8度(俗稱整步),八拍運行時步距角為θ=360度/(50×850\times 850×8)=0.9度(俗稱半步)。
定位轉矩:電機在不通電狀態下,電機轉子自身的鎖定力矩(由磁場齒形的諧波以及機械誤差造成的)。
靜轉矩:電機在額定靜態電作用下,電機不作旋轉運動時,電機轉軸的鎖定力矩。此力矩是衡量電機體積(幾何尺寸)的標準,與驅動電壓及驅動電源等無關。
1.2 二相四線步進電機工作原理
首先電機有4個電極,一共有4個線圈,兩兩串聯,A+與A-是一組線圈, B+與B-是一組線圈。
1、A+加正極,A-加負極,B+加負極,B-加負極,(電機狀態,N極朝上,如圖(a)所示)。
2、B+加正極,B-加負極,A+加負極,A-加負極,(電機狀態,N極朝右,電機順時針旋轉90°,如圖(b)所示)。
3、A-加正極,A+ 、B+ 、B- 皆加負極,(電機狀態,N極朝下,電機順時針再次旋轉90°,如圖?所示)。
4、B-加正極,A+ 、 A- 、B+ 皆加負極, (電機狀態,N極朝下,電機順時針再次旋轉90°,如圖(d)所示)。
只要依次給相應引腳相應的電平就可以使得電機轉動,轉動的最小角度為90度,正極順時針旋轉電機正轉,正極逆時針旋轉電機反轉。
1.3 二相四線步進電機通電方式
單四拍控制通電方式
| 1 | 0 | 0 | 0 |
| 0 | 1 | 0 | 0 |
| 0 | 0 | 1 | 0 |
| 0 | 0 | 0 | 1 |
雙四拍控制通電方式
| 1 | 1 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 0 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 |
單八拍控制通電方式
| 1 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 |
| 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 0 | 0 | 1 | 0 |
| 0 | 0 | 1 | 1 |
| 0 | 0 | 0 | 1 |
| 1 | 0 | 0 | 1 |
2 驅動器
2.1 L298N電機驅動模塊
L298N就是L298的立式封裝,源自意法半導體集團旗下品牌產品,是一款可接受高電壓、大電流雙路全橋式電機驅動芯片,工作電壓可達46V,輸出電流最高可至4A,具有兩個使能控制端,在不受輸入信號影響的情況下通過板載跳帽插拔的方式,動態調整電路運作方式。有一個邏輯電源輸入端,使內部邏輯電路部分在低電壓下工作,也可以對外輸出邏輯電壓5V,為了避免穩壓芯片損壞,當使用大于12V驅動電壓時,務必使用外置的5V接口獨立供電。
L298N通過控制主控芯片上的I/O輸入端,直接通過電源來調節輸出電壓,即可實現電機的正轉、反轉、停止,由于電路簡單,使用方便,通常情況下L298N可直接驅動繼電器(四路)、螺線管、電磁閥、兩臺直流電機以及一臺步進電機(兩相或者四相)。
2.2 L298N 電機驅動版規格參數
驅動電機芯片:L298N雙H橋直流電機驅動芯片
驅動供電范圍:5V~35V ;如需板內取電,則供電范圍7V~35V
驅動峰值電流:2A
邏輯部分端子供電范圍:5V~7V(可板內取電5V)
邏輯部分工作電流范圍: 0~36mA
控制信號輸入電壓范圍:
低電平:-0.3V≤Vin≤1.5V
高電平: 2.3V≤Vin≤Vss
使能信號輸入電壓范圍:
低電平:-0.3≤Vin≤1.5V(控制信號無效)
高電平:2.3V≤Vin≤Vss(控制信號有效)
最大功耗:20W(溫度T=75℃時)、
ps:
VCC:C =circuit 表示電路的意思, 即接入電路的電壓
VSS :S =series 表示公共連接的意思,通常指電路公共接地端電壓
VDD:D=device 表示器件的意思, 即器件內部的工作電壓
GND:Ground,電源的負極
VBAT:當使用電池或其他電源連接到VBAT腳上時,當VDD 斷電時,可以保存備份寄存器的內容和維持RTC的功能。如果應用中沒有使用外部電池,VBAT引腳應接到VDD引腳上
2.3 L298N 電機驅動板引腳
L298N驅動模塊的引腳可以簡單分為電源、控制和輸出等三大類。
電壓類引腳
+12 V輸入:L298N芯片的電源正極,模塊兒上標定為 12 V,實際取電范圍5 V~35 V ;如需板內取電,則供電范圍7 V~35 V
GND: L298N芯片的電源地,使用的時候應該把樹莓派的GND接到這里,即兩者需要共地。
+5V輸出:L298N芯片輸出的5V電源,可以給外部設備供電,使用的時候需要用跳線把5V輸出使能端短接起來。
控制類引腳
ENA、ENB:A、B通道的使能端,高電平有效,可以用PWM來實現調速。使用時,可以接到樹莓派的GPIO上,實現用程序進行控制。
IN1、IN2、IN3、IN4:IN1、IN2為A通道的控制輸入,IN3、IN4為B通道的控制輸入。
輸出類引腳
OUT1、OUT2、OUT3、OUT4:OUT1、OUT2由A通道輸出,OUT3、OUT4由B通道輸出,可以用于連接直流電機、步進電機等設備。
3 樹莓派(3B)
樹莓派GPIO編號方式有三種,分別是:功能物理引腳(physical)、BCM以及wiring Pi.
功能物理引腳(Board):從左到右,從上到下。左邊為奇數,右邊為偶數。共計40個引腳,計數為1-40。
BCM:編號側重于CPU寄存器,根據BCM2835的GPIO寄存器編號。具體編號參照上圖中BCM一欄。
wiring Pi: 編號側重實現邏輯,把擴展GPIO端口從0開始編號,這種編號方便編程。(本文沒有提及)
編號方式不影響使用,操作時明確使用一種就行。
4 硬件連接部分
電機為FDK的二相四線步進電機,黃、橙、棕、黑四種顏色的線分別為A+, A-, B+ , B-, 分別連接在L298N驅動板的OUT1 , OUT3 , OUT2, OUT4(也可以改順序,對應改代碼就行)。外接電源給L298N提供穩定的5V電壓,并使L298N與樹莓派共地(兩者的ground接通)。驅動板的IN1, IN2, IN3, IN4分別與樹莓派的功能物理引腳編號38、40、15、16相連接,ENA, ENB 可以不操作(板載跳帽是默認連通的,即為高電平),本文ENA, ENB與物理引腳18、20連接,并定義為高電平。
5 代碼部分
5.1 單四拍控制通電方式
# -*- coding: utf-8 -*- #通過聲明可以在程序中書寫中文 import RPi.GPIO as GPIO #引入RPi.GPIO庫函數命名為GPIO import time #引入計時time函數GPIO.setmode(GPIO.BOARD) #將GPIO編程方式設置為BOARD模式#接口定義 IN1 = 22 #將L298 IN1口連接到樹莓派Pin22 IN2 = 18 #將L298 IN1口連接到樹莓派Pin18 IN3 = 38 #將L298 IN1口連接到樹莓派Pin38 IN4 = 40 #將L298 IN2口連接到樹莓派Pin40 IN5 = 15 #將L298 IN3口連接到樹莓派Pin15 IN6 = 16 #將L298 IN4口連接到樹莓派Pin16def setStep(w1, w2, w3, w4, w5, w6):GPIO.output(IN1, w1)GPIO.output(IN2, w2)GPIO.output(IN3, w3)GPIO.output(IN4, w4)GPIO.output(IN5, w5)GPIO.output(IN6, w6)def stop():setStep(0, 0, 0, 0, 0, 0)def forward(delay, steps): for i in range(0, steps):setStep(1, 1, 1, 0, 0, 0)time.sleep(delay)setStep(1, 1, 0, 1, 0, 0)time.sleep(delay)setStep(1, 1, 0, 0, 1, 0)time.sleep(delay)setStep(1, 1, 0, 0, 0, 1)time.sleep(delay)def backward(delay, steps): for i in range(0, steps):setStep(1, 1, 0, 0, 0, 1)time.sleep(delay)setStep(1, 1, 0, 0, 1, 0)time.sleep(delay)setStep(1, 1, 0, 1, 0, 0)time.sleep(delay)setStep(1, 1, 1, 0, 0, 0)time.sleep(delay)def setup():GPIO.setwarnings(False)GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical locationGPIO.setup(IN1, GPIO.OUT) # Set pin's mode is outputGPIO.setup(IN2, GPIO.OUT)GPIO.setup(IN3, GPIO.OUT)GPIO.setup(IN4, GPIO.OUT)GPIO.setup(IN5, GPIO.OUT)GPIO.setup(IN6, GPIO.OUT)def loop():while True:print ("backward...")backward(0.01, 200) # 發射脈沖時間間隔0.01(單位秒) 脈沖個數200print ("stop...")stop() # stoptime.sleep(2) # sleep 2sprint ("forward...")forward(0.01, 200)print ("stop...")stop()time.sleep(2)def destroy():GPIO.cleanup() # 釋放數據if __name__ == '__main__': # Program start from heresetup()try:loop()except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child function destroy() will be executed.destroy()5.2 單八拍控制通電方式
# -*- coding: utf-8 -*- #通過聲明可以在程序中書寫中文 import RPi.GPIO as GPIO #引入RPi.GPIO庫函數命名為GPIO import time #引入計時time函數# BOARD編號方式,基于插座引腳編號 GPIO.setmode(GPIO.BOARD) #將GPIO編程方式設置為BOARD模式#接口定義 IN1 = 22 #將L298 IN1口連接到樹莓派Pin22 IN4 = 18 #將L298 IN2口連接到樹莓派Pin18 IN3 = 38 #將L298 IN1口連接到樹莓派Pin38 IN4 = 40 #將L298 IN2口連接到樹莓派Pin40 IN5 = 15 #將L298 IN3口連接到樹莓派Pin15 IN6 = 16 #將L298 IN4口連接到樹莓派Pin16def setStep(w1, w2, w3, w4, w5, w6):GPIO.output(IN1, w1)GPIO.output(IN2, w2)GPIO.output(IN3, w3)GPIO.output(IN4, w4)GPIO.output(IN5, w5)GPIO.output(IN6, w6)def stop():setStep(0, 0, 0, 0, 0, 0)def forward(delay, steps): for i in range(0, steps):setStep(1, 1, 1, 0, 0, 0)time.sleep(delay)setStep(1, 1, 1, 1, 0, 0)time.sleep(delay)setStep(1, 1, 0, 1, 0, 0)time.sleep(delay)setStep(1, 1, 0, 1, 1, 0)time.sleep(delay)setStep(1, 1, 0, 0, 1, 0)time.sleep(delay)setStep(1, 1, 0, 0, 1, 1)time.sleep(delay)setStep(1, 1, 0, 0, 0, 1)time.sleep(delay)setStep(1, 1, 1, 0, 0, 1)time.sleep(delay)def backward(delay, steps): for i in range(0, steps):setStep(1, 1, 1, 0, 0, 1)time.sleep(delay)setStep(1, 1, 0, 0, 0, 1)time.sleep(delay)setStep(1, 1, 0, 0, 1, 1)time.sleep(delay)setStep(1, 1, 0, 0, 1, 0)time.sleep(delay)setStep(1, 1, 0, 1, 1, 0)time.sleep(delay)setStep(1, 1, 0, 1, 0, 0)time.sleep(delay)setStep(1, 1, 1, 1, 0, 0)time.sleep(delay)setStep(1, 1, 1, 0, 0, 0)time.sleep(delay)def setup():GPIO.setwarnings(False)GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical locationGPIO.setup(IN1, GPIO.OUT) # Set pin's mode is outputGPIO.setup(IN2, GPIO.OUT)GPIO.setup(IN3, GPIO.OUT)GPIO.setup(IN4, GPIO.OUT)GPIO.setup(IN5, GPIO.OUT)GPIO.setup(IN6, GPIO.OUT)def loop():while True:print ("backward...")backward(0.01, 200) # 發射脈沖時間間隔0.01(單位秒) 脈沖個數200print ("stop...")stop() # stoptime.sleep(2) # sleep 2sprint ("forward...")forward(0.01, 200)print ("stop...")stop()time.sleep(2)def destroy():GPIO.cleanup() # 釋放數據if __name__ == '__main__': # Program start from heresetup()try:loop()except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child function destroy() will be executed.destroy()參考文獻
51單片機教程:二相四線步進電機驅動
零基礎玩轉樹莓派(五)—控制直流電機
樹莓派控制直流電機
L298N 電機驅動板 - 詳細介紹.datazhen
總結
以上是生活随笔為你收集整理的树莓派+ L298N 控制二相四线步进电机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [vue] vue组件之间的通信都有哪些
- 下一篇: [vue] 分别说说vue能监听到数组或