加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入

最簡(jiǎn)單DIY基于51單片機(jī)的舵機(jī)控制器

2020/10/28
1777
服務(wù)支持:
技術(shù)交流群

完成交易后在“購(gòu)買(mǎi)成功”頁(yè)面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長(zhǎng)和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購(gòu)買(mǎi)后不支持退換且無(wú)法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
方塊圖(2)
相關(guān)方案
  • 方案介紹
  • 相關(guān)文件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

       在上一期的項(xiàng)目:最簡(jiǎn)單DIY的51藍(lán)牙遙控小車(chē)設(shè)計(jì)方案 訪問(wèn)地址是:https://www.cirmall.com/circuit/20328 源碼里面有舵機(jī)控制部分的程序,但是被我注釋掉了,由于舵機(jī)控制還是比較復(fù)雜,這里還是開(kāi)一個(gè)專題來(lái)講解51單片機(jī)如何控制180度舵機(jī)。接線請(qǐng)看詳細(xì)的程序注解吧,學(xué)過(guò)51肯定啃得動(dòng)的。

 #include "reg52.h"

unsigned char count; //0.5ms 次數(shù)標(biāo)識(shí)

sbit pwm =P2^7 ; //PWM信號(hào)輸出,接舵機(jī)的數(shù)據(jù)線

sbit jia =P3^7; //角度增加按鈕

sbit jan =P3^6; //角度減少按鈕,低電平觸發(fā)

unsigned char jd; //角度標(biāo)識(shí) 1.0ms->45 1.5->90 2.0->135 2.5->180

void delay(unsigned char i)//普通延時(shí)函數(shù)

{

unsigned char j,k;

for(j=i;j>0;j--)

for(k=125;k>0;k--);

}

void Time0_Init() //定時(shí)器0初始化

{

TMOD = 0x01; //定時(shí)器0工作在方式1,16位增計(jì)數(shù)定時(shí)器,16位全是1,最大計(jì)數(shù)值是65535,就溢出了

IE = 0x82;//EA=1全局中斷允許,ET0=1,定時(shí)器中斷允許

TH0 = 0xfe;//(65536-N)/256=0xef=254推出N=512,N就是需要計(jì)數(shù)的個(gè)數(shù),機(jī)器周期是1.09us,所以

//512*1.09us=0.5ms,這時(shí)候舵機(jī)為0度,1ms是45度,2.5ms是180度,其他的類(lèi)推

TL0 = 0x33; //11.0592MHz晶振的單片機(jī),導(dǎo)致0.5ms計(jì)數(shù)器溢出一次,產(chǎn)生定時(shí)器中斷

TR0=1; //開(kāi)啟定時(shí)器

}

void Time0_Int() interrupt 1 //定時(shí)器0中斷服務(wù)程序

{

TH0 = 0xfe; //重新裝載初值

TL0 = 0x33;

if(count< jd) //判斷計(jì)數(shù)次數(shù)是否小于標(biāo)識(shí)

pwm=1; //輸出高電平PWM

else

pwm=0; //低電平PWM

count=(count+1); //計(jì)數(shù)次數(shù)繼續(xù)增加

count=count%40; //計(jì)數(shù)次數(shù)必須小于40,因?yàn)?.5ms*40=20ms,這是舵機(jī)PWM的固定周期

}

void keyscan() //按鍵掃描

{

if(jia==0) //按下增加按鈕

{

delay(10); //消除抖動(dòng)

if(jia==0) //按下增加按鈕

{

jd++; //標(biāo)識(shí)增加,一共有5檔,jd=1對(duì)應(yīng)0度,jd=2對(duì)應(yīng)0,45度,jd=3對(duì)應(yīng)90,4對(duì)應(yīng)135,5對(duì)應(yīng)180度

count=0; //計(jì)數(shù)清0,當(dāng)count加到2的時(shí)候,溢出兩次,時(shí)間是0.5*2=1ms,對(duì)應(yīng)舵機(jī)轉(zhuǎn)到45度

if(jd==6)

jd=5; //標(biāo)識(shí)清0

while(jia==0); //等待按鍵釋放

}

}

if(jan==0) //按下減少按鈕

{

delay(10);

if(jan==0)

{

jd--; //同理

count=0;

if(jd==0)

jd=1; //復(fù)位

while(jan==0);

}

}

}

void main()

{

jd=1;

count=0;

Time0_Init();

while(1)

{

keyscan(); //死循環(huán),按鍵檢測(cè)

}

}

程序分析結(jié)束了。

總結(jié):

根據(jù)工作原理,舵機(jī)的具體控制方法就是需要一個(gè)20ms左右的時(shí)基脈沖,

該脈沖的高電平部分一般為0.5ms~2.5ms范圍內(nèi)的角度控制脈沖部分。

脈沖寬度從0.5ms~2.5ms,相對(duì)應(yīng)舵盤(pán)的位置為0~180度,呈線性變化。

***************一般舵機(jī)脈沖寬度20ms,高電平寬度與角度對(duì)應(yīng)關(guān)系***********

0.5ms————0度;

1.0ms————45度;

1.5ms————90度;

2.0ms————135度;

2.5ms————180度;

       根據(jù)上面的原理,我們知道單片機(jī)只要產(chǎn)生20ms的脈沖信號(hào),通過(guò)改變高電平時(shí)間從0.5ms到2.5ms變化,就能使舵機(jī)轉(zhuǎn)動(dòng)到對(duì)應(yīng)的角度

最后程序的功能就是按下增加按鍵,舵機(jī)從0度到180 ,按5次;舵機(jī)從180到0也需要按5次減少按鈕。

     下個(gè)項(xiàng)目將會(huì)推出用手機(jī)app和串口藍(lán)牙模塊控制舵機(jī)翻轉(zhuǎn)。

  • HL-1原理圖.pdf
    描述:?jiǎn)纹瑱C(jī)原理圖
  • test_motor.zip
    描述:源碼MDK5編寫(xiě)
  • Servo.gif
    描述:舵機(jī)控制時(shí)序圖
  • 將要推出的app.jpg
    描述:下一期預(yù)告

相關(guān)推薦

電子產(chǎn)業(yè)圖譜