樹莓派3通過PWM信號控制電機轉速
來自專欄 無人機飛控自動化開發技術
首先是硬體連接,將有刷電機與L298N模塊的管腳連接。我這裡用電機A介面做測試,所以有刷電機的M+和M-分別與In1和In2連接。
控制IN1和IN2的高低電壓用於控制電機A;IN2和IN3用於控制電機B;ENA和ENB稱為調速端。我們由樹莓派3產生PWM信號,通過其占空比來調節電機轉速。這個PWM信號占空比就是電機A當前速度與全速的比值。 全速是多少呢? 這個需要實際測試(占坑)。
在樹莓派上,可以通過對GPIO的編程來實現PWM。
創建一個 PWM 實例,:
1p =
GPIO.PWM(channel, frequency)
啟用 PWM:
1p.start(dc) # dc 代表占空比(範圍:0.0 <= dc >= 100.0)
更改頻率:
1p.ChangeFrequency(freq) # freq 為設置的新頻率,單位為 Hz
更改占空比:
1p.ChangeDutyCycle(dc) # 範圍:0.0 <= dc >= 100.0
停止 PWM:
1p.stop()
變數「p」超出範圍,會導致 PWM 停止。
參考小R科技提供的開源代碼,本次PWM調速的python代碼如下:
#coding:utf-8#Python中聲明文件編碼的注釋,編碼格式指定為utf-8from socket import *from time import ctimeimport binasciiimport RPi.GPIO as GPIOimport timeimport threadingGPIO.setmode(GPIO.BCM)GPIO.setwarnings(False)########電機驅動介面定義#################ENA = 13 #//L298使能AENB = 20 #//L298使能BIN1 = 19 #//電機介面1IN2 = 16 #//電機介面2IN3 = 21 #//電機介面3IN4 = 26 #//電機介面4#########電機初始化為LOW##########GPIO.setup(ENA,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(IN1,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(IN2,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(ENB,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(IN3,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(IN4,GPIO.OUT,initial=GPIO.LOW)####PWM初始化,並設置頻率為200HZ####GPIO.setup(ENA,GPIO.OUT) #初始化 p1 = GPIO.PWM(ENA,200) #200HZ p1.start(40) #產生占空比為0.4的PWM信號,取值範圍0-100#########定義電機正轉函數##########def gogo(): print motor gogo# GPIO.output(ENA,True) GPIO.output(IN1,True) GPIO.output(IN2,False)#########定義電機反轉函數##########def back(): print motor_back GPIO.output(ENA,True) GPIO.output(IN1,False) GPIO.output(IN2,True)#########定義電機停止函數##########def stop(): print motor_stop #GPIO.output(ENA,False) p1.stop # 停止PWM信號 GPIO.output(ENB,False) GPIO.output(IN1,False) GPIO.output(IN2,False) GPIO.output(IN3,False) GPIO.output(IN4,False) 整個實驗是正轉10.5s反轉10.5swhile True: gogo(); time.sleep(10.5) stop(); time.sleep(10.1) back(); time.sleep(10.5)
小車之前是個兩輪平衡車,現在改成差速三輪小車的內容還沒完成。 今天不對輪子轉速和pwm占空比之間的關係做測試了。
下次更新的時候,把碼盤數據讀進去,就能確定轉速大小了。
推薦閱讀:
※單相PWM整流器的實驗調試記錄
※樹莓派可以同時輸出多個PWM信號嗎?
※如何實現PI的PWM閉環控制?
TAG:樹莓派RaspberryPi | PWM | 機器人控制 |