舵機概述
舵機最早出現在航模運動中。在航空模型中,飛行機的飛行姿態是通過調節發動機和各個控制舵面來實現的。舉個簡單的四通飛機來說,飛機上有以下幾個地方需要控制:
1.發動機進氣量,來控制發動機的拉力(或推力);
2.副翼舵面(安裝在飛機機翼后緣),用來控制飛機的橫滾運動;
3.水平尾舵面,用來控制飛機的俯仰角;
4.垂直尾舵面,用來控制飛機的偏航角;
遙控器有四個通道,分別對應四個舵機,而舵機又通過連桿等傳動元件帶動舵面的轉動,從而改變飛機的運動狀態。舵機因此得名:控制舵面的伺服電機。
不僅在航模飛機中,在其他的模型運動中都可以看到它的應用:船模上用來控制尾舵,車模中用來轉向等等。由此可見,凡是需要操作性動作時都可以用舵機來實現。
舵機工作原理
一般來講,舵機主要由以下幾個部分組成, 舵盤、減速齒輪組、位置反饋電位計5k、直流電機、控制電路板等。
工作原理:控制電路板接受來自信號線的控制信號(具體信號待會再講),控制電機轉動,電機帶動一系列齒輪組,減速后傳動至輸出舵盤。舵機的輸出軸和位置反饋電位計是相連的,舵盤轉動的同時,帶動位置反饋電位計,電位計將輸出一個電壓信號到控制電路板,進行反饋,然后控制電路板根據所在位置決定電機的轉動方向和速度,從而達到目標停止。
舵機的基本結構是這樣,但實現起來有很多種。例如電機就有有刷和無刷之分,齒輪有塑料和金屬之分,輸出軸有滑動和滾動之分,殼體有塑料和鋁合金之分,速度有快速和慢速之分,體積有大中小三種之分等等,組合不同,價格也千差萬別。例如,其中小舵機一般稱作微舵,同種材料的條件下是中型的一倍多,金屬齒輪是塑料齒輪的一倍多。需要根據需要選用不同類型。
舵機的PWM信號
1.PWM信號的定義
PWM信號為脈寬調制信號,其特點在于他的上升沿與下降沿之間的時間寬度。具體的時間寬窄協議參考下列講述。我們目前使用的舵機主要依賴于模型行業的標準協議,隨著機器人行業的漸漸獨立,有些廠商已經推出全新的舵機協議,這些舵機只能應用于機器人行業,已經不能夠應用于傳統的模型上面了。目前舵機可能是這個過渡時期的產物,它采用傳統的PWM協議,優缺點一目了然。優點是已經產業化,成本低,旋轉角度大(目前所生產的都可達到185度);缺點是控制比較復雜,畢竟采用PWM格式。但是它是一款數字型的舵機,其對PWM信號的要求較低:(1)不用隨時接收指令,減少CPU的疲勞程度;(2)可以位置自鎖、位置跟蹤,這方面超越了普通的步進電機。
其PWM格式注意的幾個要點:(1)上升沿最少為0.5mS,為0.5mS---2.5mS之間;(2)HG14-M數字舵機下降沿時間沒要求,目前采用0.5Ms就行;也就是說PWM波形可以是一個周期1mS的標準方波;(3)HG0680為塑料齒輪模擬舵機,其要求連續供給PWM信號;它也可以輸入一個周期為1mS的標準方波,這時表現出來的跟隨性能很好、很緊密。
2.PWM信號控制精度制定
如果采用的是8位單片機AT89C52CPU,其數據分辨率為256,那么經過舵機極限參數實驗,得到應該將其劃分為250份。那么0.5mS---2.5Ms的寬度為2mS=2000uS。2000uS÷250=8uS,則:PWM的控制精度為8us。我們可以以8uS為單位遞增控制舵機轉動與定位。舵機可以轉動185度,那么185度÷250=0.74度,則:舵機的控制精度為0.74度。
1DIV=8us;250DIV=2ms時基寄存器內的數值為:(#01H)01----(#0FAH)250。共185度,分為250個位置,每個位置叫1DIV。則:185÷250=0.74度/DIVPWM上升沿函數:0.5ms+N×DIV0us≤N×DIV≤2ms0.5ms≤0.5ms+N×DIV≤2.5ms
單片機控制舵機及程序
正是舵機的控制信號是一個脈寬調制信號,所以很方便和數字系統進行接口。只要能產生標準的控制信號的數字設備都可以用來控制舵機,比方PLC、單片機等。這里介紹利用51系列單片機產生舵機的控制信號來進行控制的方法,編程語言為C51。之所以介紹這種方法只是因為筆者用2051實現過,本著負責的態度,所以敢在這里寫出來。程序用的是我的四足步行機器人,有刪改。單片機并不是控制舵機的最好的方法,希望在此能起到拋磚引玉的作用。
2051有兩個16位的內部計數器,我們就用它來產生周期20ms的脈沖信號,根據需要,改變輸出脈寬。基本思路如下(請對照下面的程序):
我用的晶振頻率為12M,2051一個時鐘周期為12個晶振周期,正好是1/1000ms,計數器每隔1/1000ms計一次數。以計數器1為例,先設定脈寬的初始值,程序中初始為1.5ms,在for循環中可以隨時通過改變a值來改變,然后設定計數器計數初始值為a,并置輸出p12為高位。當計數結束時,觸發計數器溢出中斷函數,就是voidtimer0(void)interrupt1using1,在子函數中,改變輸出p12為反相(此時跳為低位),在用20000(代表20ms周期)減去高位用的時間a,就是本周期中低位的時間,c=20000-a,并設定此時的計數器初值為c,直到定時器再次產生溢出中斷,重復上一過程。
#include《reg51.h》
#defineucharunsignedchar
#defineuintunsignedint
uinta,b,c,d;
sbitp12=P1^2;
sbitp13=p1^3;
sbitp37=P3^7;
voidtimer0(void)interrupt1using1
{p12=!p12;
c=20000-c;
TH0=-(c/256);TL0=-(c%256);
if(c》=500&&c《=2500)c=a;
elsec=20000-a;
}
voidtimer1(void)interrupt3using1
{p13=!p13;
d=20000-d;
TH1=-(d/256);TL1=-(d%256);
if(d》=500&&d《=2500)d=b;
elsed=20000-b;
}
voidmain(void)
{TMOD=0x11;
p12=1;
p13=1;
a=1500;
b=1500;
c=a;d=b;
TH0=-(a/256);TL0=-(a%256);
TH1=-(b/256);TL1=-(b%256);
EA=1;
ET0=1;TR0=1;EX0=1;EX1=1;
ET1=1;TR1=1;
PX0=0;PX1=0;PT1=1;PT0=1;
for(;;)
{
}
}
因為在脈沖信號的輸出是靠定時器的溢出中斷函數來處理,時間很短,因此在精度要求不高的場合可以忽略。因此如果忽略中斷時間,從另一個角度來講就是主程序和脈沖輸出是并行的,因此,只需要在主程序中按你的要求改變a值,例如讓a從500變化到2500,就可以讓舵機從0度變化到180度。另外要記住一點,舵機的轉動需要時間的,因此,程序中a值的變化不能太快,不然舵機跟不上程序。根據需要,選擇合適的延時,用一個a遞增循環,可以讓舵機很流暢的轉動,而不會產生像步進電機一樣的脈動。這些還需要實踐中具體體會。
舵機的速度決定于你給它的信號脈寬的變化速度。舉個例子,t=0試,脈寬為0.5ms,t=1s時,脈寬為1.0ms,那么,舵機就會從0.5ms對應的位置轉到1.0ms對應的位置,那么轉動速度如何呢?一般來講,3003的最大轉動速度在4.8V時為0.23s/60度,也就是說,如果你要求的速度比這個快的話,舵機就反應不過來了;如果要求速度比這個慢,可以將脈寬變化值線性到你要求的時間內,做一個循環,一點一點的增加脈寬值,就可以控制舵機的速度了。當然,具體這一點一點到底是多少,就需要做試驗了,不然的話,不合適的話,舵機就會向步進電機一樣一跳一跳的轉動了,嘗試改變這“一點”,使你的舵機運動更平滑。還有一點很重要,就是舵機在每一次脈寬值改變的時候總會有一個轉速由零增加再減速為零的過程,這就是舵機會產生像步進電機一樣運動的原因。
評論
查看更多