日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

单片机——SG90舵机工作原理

發布時間:2023/12/24 综合教程 90 生活家
生活随笔 收集整理的這篇文章主要介紹了 单片机——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舵机工作原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。