180度\360度sg90舵機的使用及代碼程序


    大部資料都是在網上找到網友大神所共享的,在網上找了幾種舵機的,剛接觸有點懵,之后找得多了就理解了,想要控制一個硬件就要先了解這個硬件。這里有介紹180度舵機和360度舵機的具體使用,有網上大神的程序,這個更多的是一個網上對舵機使用的一個整合。如果若有不到之處,希望大家積極指出,

模擬舵機:需要不斷的發送目的地PWM信號,才能旋轉到指定位置。例如:我現在讓它旋轉90度,我就需要不斷的發送90度的PWM信號直到到達指定位置才能停止。我們使用的SG90就是一個模擬舵機

 

數字舵機:只需給一個目的地PWM信號,即可旋轉到指定位置。例如:我現在讓它旋轉90度,我只需要發送一次90度的PWM信號,它就可以旋轉到90度。
PWM信號:PWM,英文名Pulse Width Modulation,是脈沖寬度調制縮寫,它是通過對一系列脈沖的寬度進行調制,等效出所需要的波形(包含形狀以及幅值),對模擬信號電平進行數字編碼,也就是說通過調節占空比的變化來調節信號、能量等的變化,占空比就是指在一個周期內,信號處於高電平的時間占據整個信號周期的百分比,例如方波的占空比就是50%.

 

占空比:高電平(或者低電平)占整個周期的時間就叫作占空比。

 

了解了上面的基本知識我們就可以來認識我們今天的主角:sg90舵機


 

上圖就是我們今天的主角,有三條線,接線方法:
       

棕色----------------------GND

紅-------------------------VCC

橙色----------------------信號線


原理:舵機內部有一個基准電壓,微處理器產生的PWM信號通過信號線進入舵機產生直流偏置電壓,與舵機內部的基准電壓作比較,獲得電壓差輸出。電壓差的正負輸出到電機驅動芯片上,從而決定正反轉。當舵機開始旋轉的時候,舵機內部通過級聯減速齒輪帶動電位器旋轉,使得電壓差為零,電機停止轉動。


那么我們如何獲取這個 舵機呢。 
首先我們上某寶能夠找到180°、360°SG90舵機。

我們先來講的是180度的舵機。
我們知道sg90舵機是一個模擬舵機,需要我們一直給指定的脈沖。那么這個指定的脈沖是什么?查資料可以知道180度舵機不同占空比與對應角度
關系:
高電平在一個周期(20ms)的持續時間對應的舵機角度,(在這20ms內每個周期高電平的占空比一致)

  高電平t占整個周期T(20ms)的時間
  
  舵機旋轉的角度
  
  0.5ms
  
  0度
  
  1ms
  
  45度
  
  1.5ms
  
  90度
  
  2ms
  
  135度
  
  2.5ms
  
  180度
  

           如圖可形象地表示脈沖與角度關系:

          
 
   
 
      知道了脈沖與角度關系,主要講解一下如何寫這個脈沖,這里所使用的是方法是定時器+中斷,定時器每0.1ms中斷一次,需要中斷200次才能達到20ms。我們此時需要一個全局變量來記錄中斷的次數,當中斷達到200次時,全局變量重新清零。當中斷次數小於n時,信號線輸出高電平,否則輸出低電平。此時n的值對應關系如下。
n=5>>0度   n=10>>45度   n=15>>90度   n=20>>135度   n=25>>180度

 

      某寶上可能還會有另一種90度sg90舵機,這個是一個另類的180度舵機,可以一樣使用上面的程序,他與180度舵機不同的是不同占空比對應的舵機角度如圖:
 

360 度舵機

顧名思義,360度舵機可以360度旋轉,因此與180度舵機有相當大的區別,首先360度舵機不能夠控制旋轉角度,一般的舵機是給一個特定的PWM,舵機會轉到相應的角度,而360度舵機是只能夠控制方向和旋轉轉速,所以360度舵機給定一個PWM,會以特定的速度和方向轉動。
PWM信號與360舵機轉速的關系:

0.5ms----------------正向最大轉速;
1.5ms----------------速度為0;
2.5ms----------------反向最大轉速;


總結:無論是180度90度還是360度舵機,只要我們知道了它脈沖與角度的對應關系我們就可以利用定時器加中斷的方法來產生這個相應的PWM信號,進而控制舵機旋轉指定角度。


 

 

 1 #include<reg52.h>
 2 #define uchar unsigned char
 3 #define uint unsigned int
 4 
 5 sbit pwm=P1^0;      //信號輸出
 6 sbit k1=P3^1;       //按鍵k1接P3^1,控制順時針旋轉
 7 sbit k2=P3^2;       //按鍵k2接P3^2,控制逆時針旋轉
 8 
 9 uchar count=0; 10 uchar n=5;       //初始位置-在0°附近 改變n值可以改變舵機的初始位置 11           //這個n值在不同的舵機可能存在一點誤差,可以改變他的值來試試具體位置
12 void delay5ms() //延時5ms 13 { 14     unsigned char a,b; 15     for(b=19;b>0;b--) 16         for(a=130;a>0;a--); 17 } 18 void key()  //按鍵處理 19 { 20     if(k1==0) 21  { 22  delay5ms(); 23         if(k1==0) 24  { 25             while(k1==0); //判斷當鍵盤松開時
26             if(n<=25) 27             n++;      //判斷是否旋轉到180°
28             else 
29             n=26; 30  } 31  } 32     if(k2==0) 33  { 34  delay5ms(); 35         if(k2==0) 36  { 37             while(k2==0); //判斷當鍵盤松開時
38             if(n>=6) n--; //判斷是否旋轉到0°
39             else n=3; 40  } 41  } 42 } 43 
44 void InitTimer()  // 定時器設置 0.1ms 11.0592Mhz
45 { 46     TMOD = 0x01; 47     TH0 = 0xFF; 48     TL0 = 0XA3; 49     EA = 1; 50     ET0 = 1; 51     TR0 = 1; 52 } 53 
54 void main() 55 { 56  InitTimer(); 57         while(1) 58  { 59  key(); 60  } 61 } 62 
63 void Timer() interrupt 1 //特別注意此處,0--外部中斷0,1--定時器中斷0,2--外部中斷1
64 {              //3--定時器中斷1,4--串口中斷1 65     TH0 = 0xFF; 66     TL0 = 0xA3; 67     count++; 68     if(count<=200) 69  { 70         if(count<=n) 71  { 72             pwm=1; 73  } 74         else
75  { 76             pwm=0; 77  } 78  } 79     else
80  { 81         count=0; 82         pwm=0; 83  } 84 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM