大部資料都是在網(wǎng)上找到網(wǎng)友大神所共享的,我只是在理解他們的資料上加上了自己的一些注解,在網(wǎng)上找了幾種舵機的,剛接觸有點懵,之后找得多了就理解了,想要控制一個硬件就要先了解這個硬件。這里有介紹180度舵機和360度舵機的具體使用,有網(wǎng)上大神的程序,這個更多的是一個網(wǎng)上對舵機使用的一個整合。如果若有不到之處,希望大家積極指出,
模擬舵機:需要不斷的發(fā)送目的地PWM信號,才能旋轉(zhuǎn)到指定位置。例如:我現(xiàn)在讓它旋轉(zhuǎn)90度,我就需要不斷的發(fā)送90度的PWM信號直到到達指定位置才能停止。我們使用的SG90就是一個模擬舵機
數(shù)字舵機:只需給一個目的地PWM信號,即可旋轉(zhuǎn)到指定位置。例如:我現(xiàn)在讓它旋轉(zhuǎn)90度,我只需要發(fā)送一次90度的PWM信號,它就可以旋轉(zhuǎn)到90度。 PWM信號:PWM,英文名Pulse Width Modulation,是脈沖寬度調(diào)制縮寫,它是通過對一系列脈沖的寬度進行調(diào)制,等效出所需要的波形(包含形狀以及幅值),對模擬信號電平進行數(shù)字編碼,也就是說通過調(diào)節(jié)占空比的變化來調(diào)節(jié)信號、能量等的變化,占空比就是指在一個周期內(nèi),信號處于高電平的時間占據(jù)整個信號周期的百分比,例如方波的占空比就是50%.
占空比:高電平(或者低電平)占整個周期的時間就叫作占空比。
HC]T`2GVI@AIF5{]5IQ_LP5.png (81.88 KB, 下載次數(shù): 40)
下載附件
2020-1-18 17:25 上傳
了解了上面的基本知識我們就可以來認識我們今天的主角:sg90舵機
B32E1FE5C21D13AC897240E4772956E9.jpg (10.57 MB, 下載次數(shù): 39)
下載附件
2020-1-18 17:20 上傳
上圖就是我們今天的主角,有三條線,接線方法:
棕色----------------------GND
紅-------------------------VCC
橙色----------------------信號線
原理:舵機內(nèi)部有一個基準電壓,微處理器產(chǎn)生的PWM信號通過信號線進入舵機產(chǎn)生直流偏置電壓,與舵機內(nèi)部的基準電壓作比較,獲得電壓差輸出。電壓差的正負輸出到電機驅(qū)動芯片上,從而決定正反轉(zhuǎn)。當舵機開始旋轉(zhuǎn)的時候,舵機內(nèi)部通過級聯(lián)減速齒輪帶動電位器旋轉(zhuǎn),使得電壓差為零,電機停止轉(zhuǎn)動。
那么我們?nèi)绾潍@取這個 舵機呢。
首先我們上某寶能夠找到180°、360°SG90舵機。
我們先來講的是180度的舵機。
我們知道sg90舵機是一個模擬舵機,需要我們一直給指定的脈沖。那么這個指定的脈沖是什么?查資料可以知道180度舵機不同占空比與對應(yīng)角度
關(guān)系:
高電平在一個周期(20ms)的持續(xù)時間對應(yīng)的舵機角度,
高電平t占整個周期T(20ms)的時間
| 舵機旋轉(zhuǎn)的角度
| 0.5ms
| 0度
| 1ms
| 45度
| 1.5ms
| 90度
| 2ms
| 135度
| 2.5ms
| 180度
| 如下圖可形象地表示脈沖與角度關(guān)系
20140419164038468.gif (114.39 KB, 下載次數(shù): 52)
下載附件
2020-1-18 17:11 上傳
知道了脈沖與角度關(guān)系,主要講解一下如何寫這個脈沖,這里所使用的是方法是定時器+中斷,定時器每0.1ms中斷一次,需要中斷200次才能達到20ms。我們此時需要一個全局變量來記錄中斷的次數(shù),當中斷達到200次時,全局變量重新清零。當中斷次數(shù)小于n時,信號線輸出高電平,否則輸出低電平。此時n的值對應(yīng)關(guān)系如下。 n=5>>0度 n=10>>45度 n=15>>90度 n=20>>135度 n=25>>180度
voidInitTimer() //這里設(shè)置0.1ms中斷一次 使用11.0592Mhz晶振
{
TMOD = 0x01;
TH0 = 0xFF;
TL0 = 0XA4;
EA = 1;
ET0 = 1;
TR0 = 1;
}
voidTimer() interrupt 1
{
TH0 = 0xFF;
TL0 = 0xA4; //重新賦值
count++;
if(count<=200)
{
if(count<=n)
{
pwm=1;
}
else
{
pwm=0;
}
}
else
{
count=0;
pwm=0;
}
}
單片機源程序如下:
#include<reg52.h>
#defineuchar unsigned char
#defineuint unsigned int
sbitpwm=P1^0; //信號輸出
sbitk1=P3^5; //按鍵k1接P3^5,控制順時針旋轉(zhuǎn)
sbitk2=P3^4; //按鍵k2接P3^4,控制逆時針旋轉(zhuǎn)
ucharcount=0;
uchar n=5; //初始位置-在0°附近 改變n值可以改變舵機的初始位置
//這個n值在不同的舵機可能存在一點誤差,可以改變他的值來試試具體位置 voiddelay5ms()
{
unsigned char a,b;
for(b=19;b>0;b--)
for(a=130;a>0;a--);
}
voidkey()
{
if(k1==0)
{
delay5ms();
if(k1==0)
{
while(k1==0); //判斷當鍵盤松開時
if(n<=25) n++;//判斷是否旋轉(zhuǎn)到180°
else n=26;
}
}
if(k2==0)
{
delay5ms();
if(k2==0)
{
while(k2==0); //判斷當鍵盤松開時
if(n>=6) n--; //判斷是否旋轉(zhuǎn)到0°
else n=5;
}
}
}
voidInitTimer() // 0.1ms 11.0592Mhz
{
TMOD = 0x01;
TH0 = 0xFF;
TL0 = 0XA4;
EA = 1;
ET0 = 1;
TR0 = 1;
}
voidmain()
{
InitTimer();
while(1)
{
key();
}
}
voidTimer() interrupt 1 //特別注意此處,0--外部中斷0,1--定時器中斷0,2--外部中斷1,3--定時器中斷1,4--串行口中斷1
{
TH0 = 0xFF;
TL0 = 0xA4;
count++;
if(count<=200)
{
if(count<=n)
{
pwm=1;
}
else
{
pwm=0;
}
}
else
{
count=0;
pwm=0;
}
}
Ps:某寶上可能還會有另一種90度sg90舵機,這個是一個另類的180度舵機,可以一樣使用上面的程序,他與180度舵機不同的是不同占空比對應(yīng)的舵機角度如圖:
1)5{K@96(1XBWGPY`KU]TTY.png (75.85 KB, 下載次數(shù): 54)
下載附件
2020-1-18 17:42 上傳
360度舵機 顧名思義,360度舵機可以360度旋轉(zhuǎn),因此與180度舵機有相當大的區(qū)別,首先360度舵機不能夠控制旋轉(zhuǎn)角度,一般的舵機是給一個特定的PWM,舵機會轉(zhuǎn)到相應(yīng)的角度,而360度舵機是只能夠控制方向和旋轉(zhuǎn)轉(zhuǎn)速,所以360度舵機給定一個PWM,會以特定的速度和方向轉(zhuǎn)動。
PWM信號與360舵機轉(zhuǎn)速的關(guān)系:
0.5ms----------------正向最大轉(zhuǎn)速;
1.5ms----------------速度為0;
2.5ms----------------反向最大轉(zhuǎn)速;
總結(jié):無論是180度90度還是360度舵機,只要我們知道了它脈沖與角度的對應(yīng)關(guān)系我們就可以利用定時器加中斷的方法來產(chǎn)生這個相應(yīng)的PWM信號,進而控制舵機旋轉(zhuǎn)指定角度。
}OQ]EY@S~7GHQ~PW7I6MV5R.png (48.55 KB, 下載次數(shù): 43)
下載附件
2020-1-18 17:46 上傳
以上程序51hei提供下載:
sg90程序.zip
(26.13 KB, 下載次數(shù): 93)
2020-1-18 17:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|