舵機(jī):
舵機(jī)一般由舵盤、減速齒輪組、位置反饋電位器、直流電機(jī)、控制電路板等組成。一般情況下舵機(jī)的信號線為黃色或者白色,電源主要常見為4.2-7.4V,不同的供電將直接影響舵機(jī)的扭矩標(biāo)準(zhǔn)。
控制方法-PWM :
PWM通過占空比來控制舵機(jī),所謂PWM就是通過程序控制單片機(jī)IO口按照一定的時間規(guī)律輸出高電平或低電平,具體可以上網(wǎng)查閱資料了解一下。
以下為不同的占空比時間對應(yīng)的舵機(jī)角度:

對于t=0.5 - 2.5ms的產(chǎn)生,寫程序時我們可以采用全局變量。讓全局變量等于525之間,因為舵機(jī)的一個計數(shù)周期是0.1ms,這樣全局變量的525正好就是0.5~2.5ms
PWM波產(chǎn)生思路:將信號管腳線初始化為低電平,然后寫一個while循環(huán),在循環(huán)中將該管腳置為為高電平,延時,再拉低為低電平,如此循環(huán)產(chǎn)生PWM波,以高電平產(chǎn)生時間來控制舵機(jī)轉(zhuǎn)動角度。
注意:5mv以上的控制電壓的變化就會引起電機(jī)的抖動。
基于單片機(jī)的控制:
單片機(jī)系統(tǒng)實現(xiàn)對舵機(jī)輸出轉(zhuǎn)角的控制,必須先完成兩個任務(wù):
1、產(chǎn)生PWM周期信號,本設(shè)計產(chǎn)生一個20ms的周期信號;
2、脈寬的調(diào)整,即單片機(jī)模擬PWM信號的輸出,并調(diào)整占空比。
當(dāng)系統(tǒng)中只需要實現(xiàn)一個舵機(jī)的控制,采用的控制方式是改變單片機(jī)的一個定時器中斷的初值,將20ms分為兩次中斷執(zhí)行,一次短定時中斷和一次長定時中斷。這樣既節(jié)省了硬件電路,也減少了軟件開銷,控制系統(tǒng)工作效率和控制精度都很高。
具體的設(shè)計過程:例如想讓舵機(jī)轉(zhuǎn)向左極限的角度,它的正脈沖為2ms,則負(fù)脈沖為20ms-2ms=18ms,所以開始時在控制口發(fā)送高電平,然后設(shè)置定時器在2ms后發(fā)生中斷,中斷發(fā)生后,在中斷程序里將控制口改為低電平,并將中斷時間改為18ms,再過18ms進(jìn)入下一次定時中斷,再將控制口改為高電平,并將定時器初值改為2ms,等待下次中斷到來,如此往復(fù)實現(xiàn)PWM信號輸出到舵機(jī)。用修改定時器中斷初值的方法巧妙形成了脈沖信號,調(diào)整時間段的寬度便可使伺服機(jī)靈活運(yùn)動。
為保證軟件在定時中斷里采集其他信號,并且使發(fā)生PWM信號的程序不影響中斷程序的運(yùn)行(如果這些程序所占用時間過長,有可能會發(fā)生中斷程序還未結(jié)束,下次中斷又到來的后果),所以需要將采集信號的函數(shù)放在長定時中斷過程中執(zhí)行,也就是說每經(jīng)過兩次中斷執(zhí)行一次這些程序,執(zhí)行的周期還是20ms。
如果系統(tǒng)中需要控制幾個舵機(jī)的準(zhǔn)確轉(zhuǎn)動,可以用單片機(jī)和計數(shù)器進(jìn)行脈沖計數(shù)產(chǎn)生PWM信號。
脈沖計數(shù)可以利用51單片機(jī)的內(nèi)部計數(shù)器來實現(xiàn),但是從軟件系統(tǒng)的穩(wěn)定性和程序結(jié)構(gòu)的合理性看,宜使用外部的計數(shù)器,還可以提高CPU的工作效率。
下面列舉一個按鍵控制舵機(jī)轉(zhuǎn)動的程序代碼:
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit KEY1=P3^4;
//按鍵1
sbit KEY2=P3^5;
//按鍵2
sbit PWM_OUT=P2^7;
//PWM輸出口
uint PWM_Value;
//定義pwm值
uchar order=0;
void Delay(unsigned int s);
//延時函數(shù)聲明
uchar flag;
//舵機(jī)按鍵標(biāo)志
/ 延時函數(shù) /
void Delay(unsigned int s)
{
unsigned int i;
for(i=0; i
for(i=0; i
}
/ 定時器初始化 /
void Init_Timer0()
{
TMOD=0x11;
TH0=(65536-1500)/256;
TL0=(65536-1500)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
PT0=1;
}
/ 主函數(shù) /
void main(void)
{
Delay(6000);
PWM_Value = 1500;
//pwm初值為1500
Init_Timer0();
while(1)
{
if((KEY1 ==0 )|(KEY2 ==0 ))
//按鍵1或按鍵2被按下
{
if(KEY1 ==0 )
//確認(rèn)按鍵1被按下
{
flag = 1;
//標(biāo)志位賦值1
}
if(KEY2 ==0 )
//確認(rèn)按鍵2被按下
{
flag = 2;
//標(biāo)志位賦值2
}
}
else
{
flag = 0;
//否則標(biāo)志位為0
}
Delay(20);
//延時20ms
}
}
/ 中斷程序 **/
void timer0(void) interrupt 1
{
if(flag==1) PWM_Value += 1;
//如果標(biāo)志位1時,pwm的值加1
if(flag==2) PWM_Value -= 1;
//如果標(biāo)志位為2時,pwm減1
if(PWM_Value>=2500)
//如果pwm的值大于2500
PWM_Value = 2500;
//則保持在2500
if(PWM_Value<=500)
//如果pwm的值小于500
PWM_Value=500;
//則保持在500
switch(order)
{
case 1:PWM_OUT=1;
TH0=(65536-PWM_Value) > >8;
TL0=(uchar)(65536-PWM_Value);
break;
case 2:PWM_OUT=0;
TH0=(65536-(5000-PWM_Value)) > >8;
TL0=(uchar)(65536-(5000-PWM_Value));
break;
case 3:
TH0=60536 > >8;
TL0=(uchar)60536;
break;
case 4:
TH0=60536 > >8;
TL0=(uchar)60536;
order=0;
break;
default: order=0;
break;
}
order++;
}
-
電位器
+關(guān)注
關(guān)注
14文章
1029瀏覽量
69338 -
直流電機(jī)
+關(guān)注
關(guān)注
36文章
1781瀏覽量
73994 -
51單片機(jī)
+關(guān)注
關(guān)注
278文章
5716瀏覽量
134562 -
PWM控制
+關(guān)注
關(guān)注
7文章
208瀏覽量
27899 -
舵機(jī)
+關(guān)注
關(guān)注
17文章
376瀏覽量
43244
發(fā)布評論請先 登錄
51單片機(jī)舵機(jī)控制系統(tǒng)的相關(guān)資料分享
單片機(jī)實現(xiàn)舵機(jī)轉(zhuǎn)角控制
51單片機(jī)控制舵機(jī)程序
使用51單片機(jī)按鍵直接控制舵機(jī)旋轉(zhuǎn)的程序免費下載
如何使用51單片機(jī)按鍵控制舵機(jī)旋轉(zhuǎn)
基于51單片機(jī)的舵機(jī)控制器設(shè)計
51單片機(jī)舵機(jī)控制
51單片機(jī)控制舵機(jī)的教程 按鍵控制舵機(jī)轉(zhuǎn)動的程序代碼
評論