舵機是一種位置伺服的驅動器,主要是由外殼、電路板、無核心馬達、齒輪與位置檢測器所構成。其工作原理是由接收機或者單片機發出信號給舵機,其內部有一個基準電路,產生周期為 20ms,寬度為 1.5ms 的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。經由電路板上的 IC 判斷轉動方向,再驅動無核心馬達開始轉動,透過減速齒輪將動力傳至擺臂,同時由位置檢測器送回信號,判斷是否已經到達定位。適用于哪些需要角度不斷變化并可以保持的控制系統。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為 0,電機停止轉動。
一般舵機旋轉的角度范圍是 0 度到 180 度。舵機轉動的角度與脈寬在 0.5ms~2.5ms 的區間內呈線性關系。舵機有 90°、180°、270°、360° 最大轉角。
控制原理
通過向舵機的信號信號線發送 PWM 信號來控制舵機的輸出量;一般來說,PWM 的周期以及占空比,我們是可控的,所以 PWM 脈沖的占空比直接決定了輸出軸的位置。
當我們向舵機發送脈沖寬度為 1.5 毫秒的信號時,舵機的輸出軸將移至中間位置(90度);脈沖寬度為 1ms 時,舵機的輸出軸將移至最小的位置(0度);脈沖寬度為 2ms 時,舵機的輸出軸將移至最小的位置(180度)。
注意:不同類型和品牌的伺服電機之間最大位置和最小位置的角度可能會不同。許多伺服器僅旋轉約 170 度(或者只有 90 度),但寬度為 1.5ms 的伺服脈沖通常會將伺服設置為中間位置(通常是指定全范圍的一半)。
以 180 度角度伺服為例,對應的控制關系是這樣的:
0.5ms – 0 度;
1.0ms – 45 度;
1.5ms – 90 度;
2.0ms – 135 度;
2.5ms – 180 度;
既然是要控制輸出 PWM 的周期和占空比,需要明確定時器的周期、PWM 輸出占空比計算公式:
定義幾個相關量,系統運行時鐘(sys_clk)、定時器時鐘預分頻值(psc)、計數重裝載值(arr)、比較計數值(ccr)。
定時器頻率計算公式:f = sys_clk / [( arr + 1 ) * ( psc + 1 )];
占空比計算公式:duty = ccr/arr * 100%;
定時器設置與角度值換算
本示例使用的舵機為周期 20ms、轉角 180° 的模擬舵機。本示例編程推導思路如下:
1、任意角脈寬計算公式 :angle = 0.5ms + 角度值 *(2ms/180°)[角度值=[0,180]]
2、占空比計算公式 :duty = ccr/arr * 100%
3、定時器頻率計算公式:f = sys_clk / [( arr + 1 ) * ( psc + 1 )]
1. 設置 arr
公式 1 推導:從 0 位置轉到 180 位置,脈寬的最大增量 = (2.5ms – 0.5ms) = 2ms;此處將 arr 設置為 (2000-1)。
2. 設置 psc
公式 3 推導:psc = sys_clk/[ f * (arr + 1) ] – 1;本示例中 f=50hz,sys_clk=72Mhz,arr=(2000-1),即:psc = 72Mhz/(50hz * 2000) – 1; psc = 720。
3. 角度與 ccr 值換算:ccr = 500 + 角度值 *(2000/180°)
硬件接線
舵機具有三個接線:
棕色:GND,接 Pico 的 GND。
紅色:+4.5 ~ +6V 電源輸入,接 Pico 的 VSYS。
橙色:指令脈沖信號,接 Pico 的 GP28。
例程
以市面上常見的 9g 舵機為例,下面的代碼將舵機的角度在 -90、0、90 三個角度中間切換,并循環 3 次。
from machine import Pin,PWM import time pwm = PWM(Pin(28)) pwm.freq(50) for _ in range(3): pwm.duty_u16(1600) time.sleep(1) pwm.duty_u16(4815) time.sleep(1) pwm.duty_u16(7953) time.sleep(1) pwm.duty_u16(4815) time.sleep(1)
使用電位器控制舵機角度
這個例子讀取電位器的輸入,并轉為舵機的角度。使舵機的角度從 -90 度到 90 度之間變化。
電位器接線
電位器模塊的 VCC 接樹莓派 Pico 的 3V3 引腳。
電位器模塊的 GND 接樹莓派 Pico 的 GND 引腳。
電位器模塊的 OUT 引腳接樹莓派 Pico 的 GP27 引腳。
代碼如下:
from machine import Pin,PWM import time pwm = PWM(Pin(28)) pwm.freq(50) control = machine.ADC(27) while True: adc = control.read_u16() duty = int(adc * (7953-1600)/0xffff) + 1600 pwm.duty_u16(duty) time.sleep(0.1)
運行之后,轉動電位器,可以看到舵機的角度隨之變化。
審核編輯:劉清
-
驅動器
+關注
關注
53文章
8256瀏覽量
146593 -
檢測器
+關注
關注
1文章
866瀏覽量
47720 -
電位器
+關注
關注
14文章
1012瀏覽量
66861 -
舵機
+關注
關注
17文章
276瀏覽量
41086 -
樹莓派
+關注
關注
117文章
1709瀏覽量
105716
原文標題:在樹莓派 Pico 上編程使用舵機
文章出處:【微信號:趣無盡,微信公眾號:趣無盡】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論