前言:
舵機(jī)控制的另一個專業(yè)名字叫伺服控制。
經(jīng)過百度,伺服”—詞源于希臘語“奴隸”的意思。人們想把“伺服機(jī)構(gòu)”當(dāng)個得心應(yīng)手的馴服工具,服從控制信號的要求而動作。在訊號來到之前,轉(zhuǎn)子靜止不動;訊號來到之后,轉(zhuǎn)子立即轉(zhuǎn)動;當(dāng)訊號消失,轉(zhuǎn)子能即時自行停轉(zhuǎn)。由于它的“伺服”性能,因此而得名——伺服系統(tǒng)。
我們這次就是要控制舵機(jī)轉(zhuǎn)動任意角度。
舵機(jī)
一、外觀
接線方法:
紅-------------------------VCC
棕色----------------------GND
橙色----------------------信號線
二、相關(guān)參數(shù)
三、工作原理
舵機(jī)的控制信號為周期是20ms 的脈寬調(diào)制(PWM)信號,其中脈沖寬度從0.5ms-2.5ms,相對應(yīng)舵盤的位置為0—180度,呈線性變化。也就是說,給它提供一定的脈寬,它的輸出軸就會保持在一個相對應(yīng)的角度上,無論外界轉(zhuǎn)矩怎樣改變,直到給它提供一個另外寬度的脈沖信號,它才會改變輸出角度到新的對應(yīng)的位置上。舵機(jī)內(nèi)部有一個基準(zhǔn)電路,產(chǎn)生周期20ms,寬度1.5ms的基準(zhǔn)信號,有一個比較器,將外加信號與基準(zhǔn)信號相比較,判斷出方向和大小,從而產(chǎn)生電機(jī)的轉(zhuǎn)動信號。
控制電路板接受來自信號線相應(yīng)的PWM控制信號,進(jìn)而控制電機(jī)轉(zhuǎn)動,電機(jī)帶動一系列齒輪組,減速后傳動至輸出舵盤。舵機(jī)的輸出軸和位置反饋電位計是相連的,舵盤轉(zhuǎn)動的同時,帶動位置反饋電位計,電位計將輸出一個電壓信號到控制電路板,進(jìn)行反饋,然后控制電路板根據(jù)所在位置決定電機(jī)的轉(zhuǎn)動方向和速度,從而達(dá)到目標(biāo)停止。
舵機(jī)的控制需要MCU產(chǎn)生一個周期為20ms的脈沖信號,以0.5ms到2.5ms的高電平來控制舵機(jī)轉(zhuǎn)動的角度。
四、舵機(jī)購買注意事項
1、在購買時,需要分清楚你的舵機(jī)可以轉(zhuǎn)180度,還是360度。相關(guān)區(qū)別購買時可以了解。
2、舵機(jī)又分為數(shù)字舵機(jī)和模擬舵機(jī)。
模擬舵機(jī):需要不斷的發(fā)送相應(yīng)角度的PWM信號,才能旋轉(zhuǎn)到指定位置。例如:我現(xiàn)在讓它旋轉(zhuǎn)90度,我就需要在一個時間內(nèi)不斷的發(fā)送90度的PWM信號,舵機(jī)轉(zhuǎn)動到指定位置就會停止。
數(shù)字舵機(jī):只需給一個目的地PWM信號,即可旋轉(zhuǎn)到指定位置。例如:我現(xiàn)在讓它旋轉(zhuǎn)90度,我只需要發(fā)送一次90度的PWM信號,它就可以旋轉(zhuǎn)到90度。
SG90舵機(jī) 是模擬舵機(jī),SG90S舵機(jī) 我記得好像是數(shù)字舵機(jī),總之?dāng)?shù)字舵機(jī)比模擬舵機(jī)好些,無論實在程序控制方面還是在運(yùn)行情況方面都要好些
五、代碼編寫
舵機(jī)要用PWM來控制,PWM的產(chǎn)生可以用軟件延時和定時器的方法。這里為了體現(xiàn)精確性,采用定時器的方式。
首先還是看下這張圖片,這個是PWM控制SG90舵機(jī)的關(guān)鍵。我們只有按照給舵機(jī)輸入正確的PWM波形,舵機(jī)才會轉(zhuǎn)動到指定的角度。
上代碼:
1、PWM波形的周期我們用定時器產(chǎn)生,所以先對定時器做初始化:
void Timer_Init()
{
TMOD=0X01; //T0定時方式1
TH0=0Xfe;
TL0=0X33; //計數(shù)初值設(shè)置為0.5ms
ET0=1; //打開定時器0的中斷
TR0=1; //打開定時器0
EA=1; //開總中斷
}
2、然后就是編寫定時器中斷函數(shù),和輸出對應(yīng)的PWM波形了:
PWM波形這里是在定時器里產(chǎn)生的。
sbit PWM=P2^3; //對應(yīng)舵機(jī)的PWM引腳
int count=0; //全局變量count用于定時器計數(shù)
int c=0; //這個值為高低電平的臨界值,可以改變,
//這里初始化為0表示開始讓舵機(jī)復(fù)位到0度位置(輸出0.5ms的高電平)
void Timer() interrupt 1
{
TH0=0Xfe;
TL0=0X33; //重新賦計數(shù)初值為0.5ms
if(count<=c) //進(jìn)入定時器的時間和高低電平臨界值比較
{
PWM=1; //輸出PWM波形中的高電平
}
else
{
PWM=0;
}
count++;
if(count>=40) //計數(shù)40次,每次0.5ms,總共達(dá)到20ms周期后清零,為下一周期開始計數(shù)做準(zhǔn)備
{
count=0;
}
}
3、主函數(shù)代碼的書寫:
void main()
{
Timer_Init();
while(1);
}
嗯嗯,上面就是代碼全部了,沒有給出整體代碼,防止只復(fù)制粘貼,不動腦瓜子的童鞋
1、那。。。,博主博主,我把上面的代碼組裝到工程里去了,燒寫到單片機(jī)中去,開機(jī)舵機(jī)沒反應(yīng)呀?
答:看看舵機(jī)原本是不是在0度的位置,如果是,請手動把他轉(zhuǎn)到其它角度,在上電,看舵機(jī)轉(zhuǎn)到0度了沒有。
2、那。。。,博主博主,我想讓舵機(jī)上電就復(fù)位到90度的位置,咋辦?
答:認(rèn)真看下代碼里語句的注釋,我們將程序中的高低電平臨界值變量c,賦值為2,即c=2;上電后,舵機(jī)如果不在90度的位置,就會復(fù)位到90度了。
3、那。。。,博主博主,我想定義兩個按鍵,按下一個按鍵舵機(jī)轉(zhuǎn)到0度位置,按下另一個按鍵,舵機(jī)轉(zhuǎn)到180位置,咋辦?
答:先用sbit定義兩個按鍵引腳,然后在主函數(shù)中的while循環(huán)里,判斷哪個按鍵按下,然后改變臨界值C就行。如下
while(1)
{
if(key1==0)
{
delay_ms(5);
if(key1==0)
{
c=0; //對應(yīng)高電平輸出0.5ms,轉(zhuǎn)到0度
while(!key1);
}
}
else if(key2==0)
{
delay_ms(5);
if(key2==0)
{
c=4; //對應(yīng)高電平輸出2.5ms,轉(zhuǎn)到180度
while(!key2);
}
}
}
六、優(yōu)化后的代碼
嗯。。。,咋子優(yōu)化哦,上面不就可以讓舵機(jī)抓到指定位置了嗎?
SG90是模擬舵機(jī),需要在一個時間內(nèi)不斷的輸出一定的PWM波形給舵機(jī),它才會轉(zhuǎn)到到指定位置,上面的代碼中我是讓定時器不斷的工作,不斷的輸出PWM波形。
其實對于模擬舵機(jī),不需要一直讓定時器工作輸出PWM波形,只用在一段時間內(nèi)輸出一定的PWM波形就可以。那為什么這樣考慮呢?因為給一段時間的PWM波形后,舵機(jī)就可以轉(zhuǎn)動到位了,后面再給PWM波形就沒有意義了,舵機(jī)轉(zhuǎn)動到位后,就可以關(guān)閉定時器了(除非你的其它功能要用到定時器,就可以不用關(guān)),這樣可以避免后面不斷的觸發(fā)定時中斷,影響主函數(shù)while里其它功能的執(zhí)行效率,畢竟進(jìn)入定時中斷函數(shù)里時,主函數(shù)時不得執(zhí)行的。
上面講到的那個時間,可以通過實際調(diào)試多次測出來,博主這里測出來了。文章來源:http://www.zghlxwxcb.cn/news/detail-404651.html
**完整并優(yōu)化的項目代碼放到最后:
【51單片機(jī)控制SG90舵機(jī)】
**文章來源地址http://www.zghlxwxcb.cn/news/detail-404651.html
到了這里,關(guān)于單片機(jī)——SG90舵機(jī)工作原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!