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

上圖就是我們今天的主角,有三條線,接線方法:
紅-------------------------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度 |
如圖可形象地表示脈沖與角度關系:

某寶上可能還會有另一種90度sg90舵機,這個是一個另類的180度舵機,可以一樣使用上面的程序,他與180度舵機不同的是不同占空比對應的舵機角度如圖:
顧名思義,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 }