在上一期的項(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)。