舵機(jī):
舵機(jī)一般由舵盤、減速齒輪組、位置反饋電位器、直流電機(jī)、控制電路板等組成。一般情況下舵機(jī)的信號(hào)線為黃色或者白色,電源主要常見為4.2-7.4V,不同的供電將直接影響舵機(jī)的扭矩標(biāo)準(zhǔn)。
控制方法-PWM :
PWM通過(guò)占空比來(lái)控制舵機(jī),所謂PWM就是通過(guò)程序控制單片機(jī)IO口按照一定的時(shí)間規(guī)律輸出高電平或低電平,具體可以上網(wǎng)查閱資料了解一下。
以下為不同的占空比時(shí)間對(duì)應(yīng)的舵機(jī)角度:
對(duì)于t=0.5 - 2.5ms的產(chǎn)生,寫程序時(shí)我們可以采用全局變量。讓全局變量等于525之間,因?yàn)槎鏅C(jī)的一個(gè)計(jì)數(shù)周期是0.1ms,這樣全局變量的525正好就是0.5~2.5ms
PWM波產(chǎn)生思路:將信號(hào)管腳線初始化為低電平,然后寫一個(gè)while循環(huán),在循環(huán)中將該管腳置為為高電平,延時(shí),再拉低為低電平,如此循環(huán)產(chǎn)生PWM波,以高電平產(chǎn)生時(shí)間來(lái)控制舵機(jī)轉(zhuǎn)動(dòng)角度。
注意:5mv以上的控制電壓的變化就會(huì)引起電機(jī)的抖動(dòng)。
基于單片機(jī)的控制:
單片機(jī)系統(tǒng)實(shí)現(xiàn)對(duì)舵機(jī)輸出轉(zhuǎn)角的控制,必須先完成兩個(gè)任務(wù):
1、產(chǎn)生PWM周期信號(hào),本設(shè)計(jì)產(chǎn)生一個(gè)20ms的周期信號(hào);
2、脈寬的調(diào)整,即單片機(jī)模擬PWM信號(hào)的輸出,并調(diào)整占空比。
當(dāng)系統(tǒng)中只需要實(shí)現(xiàn)一個(gè)舵機(jī)的控制,采用的控制方式是改變單片機(jī)的一個(gè)定時(shí)器中斷的初值,將20ms分為兩次中斷執(zhí)行,一次短定時(shí)中斷和一次長(zhǎng)定時(shí)中斷。這樣既節(jié)省了硬件電路,也減少了軟件開銷,控制系統(tǒng)工作效率和控制精度都很高。
具體的設(shè)計(jì)過(guò)程:例如想讓舵機(jī)轉(zhuǎn)向左極限的角度,它的正脈沖為2ms,則負(fù)脈沖為20ms-2ms=18ms,所以開始時(shí)在控制口發(fā)送高電平,然后設(shè)置定時(shí)器在2ms后發(fā)生中斷,中斷發(fā)生后,在中斷程序里將控制口改為低電平,并將中斷時(shí)間改為18ms,再過(guò)18ms進(jìn)入下一次定時(shí)中斷,再將控制口改為高電平,并將定時(shí)器初值改為2ms,等待下次中斷到來(lái),如此往復(fù)實(shí)現(xiàn)PWM信號(hào)輸出到舵機(jī)。用修改定時(shí)器中斷初值的方法巧妙形成了脈沖信號(hào),調(diào)整時(shí)間段的寬度便可使伺服機(jī)靈活運(yùn)動(dòng)。
為保證軟件在定時(shí)中斷里采集其他信號(hào),并且使發(fā)生PWM信號(hào)的程序不影響中斷程序的運(yùn)行(如果這些程序所占用時(shí)間過(guò)長(zhǎng),有可能會(huì)發(fā)生中斷程序還未結(jié)束,下次中斷又到來(lái)的后果),所以需要將采集信號(hào)的函數(shù)放在長(zhǎng)定時(shí)中斷過(guò)程中執(zhí)行,也就是說(shuō)每經(jīng)過(guò)兩次中斷執(zhí)行一次這些程序,執(zhí)行的周期還是20ms。
如果系統(tǒng)中需要控制幾個(gè)舵機(jī)的準(zhǔn)確轉(zhuǎn)動(dòng),可以用單片機(jī)和計(jì)數(shù)器進(jìn)行脈沖計(jì)數(shù)產(chǎn)生PWM信號(hào)。
脈沖計(jì)數(shù)可以利用51單片機(jī)的內(nèi)部計(jì)數(shù)器來(lái)實(shí)現(xiàn),但是從軟件系統(tǒng)的穩(wěn)定性和程序結(jié)構(gòu)的合理性看,宜使用外部的計(jì)數(shù)器,還可以提高CPU的工作效率。
下面列舉一個(gè)按鍵控制舵機(jī)轉(zhuǎn)動(dòng)的程序代碼:
#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í)函數(shù)聲明
uchar flag;
//舵機(jī)按鍵標(biāo)志
/ 延時(shí)函數(shù) /
void Delay(unsigned int s)
{
unsigned int i;
for(i=0; i
for(i=0; i
}
/ 定時(shí)器初始化 /
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);
//延時(shí)20ms
}
}
/ 中斷程序 **/
void timer0(void) interrupt 1
{
if(flag==1) PWM_Value += 1;
//如果標(biāo)志位1時(shí),pwm的值加1
if(flag==2) PWM_Value -= 1;
//如果標(biāo)志位為2時(shí),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文章
1012瀏覽量
66842 -
直流電機(jī)
+關(guān)注
關(guān)注
36文章
1710瀏覽量
70224 -
51單片機(jī)
+關(guān)注
關(guān)注
274文章
5704瀏覽量
123747 -
PWM控制
+關(guān)注
關(guān)注
7文章
194瀏覽量
26316 -
舵機(jī)
+關(guān)注
關(guān)注
17文章
270瀏覽量
41077
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論