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