233138ieeswysqszym42m9.png.thumb.jpg (123.1 KB, 下載次數(shù): 169)
下載附件
2017-3-7 00:42 上傳
如圖這種模擬舵機(jī),在智能小車中是用來帶動(dòng)超聲波探頭旋轉(zhuǎn),剛接觸的朋友在使用的時(shí)候可能覺得有些棘手,故將這幾天的使用心得總結(jié)如下: 首 先,這個(gè)舵機(jī)是模擬舵機(jī),而非數(shù)字舵機(jī),這兩者的區(qū)別是這樣,數(shù)字舵機(jī)只要給一個(gè)PWM信號即可,這個(gè)信號是目的地的位置,舵機(jī)會(huì)自動(dòng)旋轉(zhuǎn)到這個(gè)位置,而 模擬舵機(jī)需要一直給予目的地的PWM信號。由于舵機(jī)需要的PWM信號實(shí)際就是一個(gè)方波,所以模擬舵機(jī)就是需要不斷的重復(fù)發(fā)一樣的方波,直到舵機(jī)旋轉(zhuǎn)到指定 的位置,并且如果需要鎖定在這個(gè)位置,那么還需繼續(xù)給予這個(gè)方波。
請看下面這個(gè)例子: - void main(void)
-
- {
-
- DUOJI=1;
-
- Delay500us();
-
- Delay500us();
-
- DUOJI=0;
-
- Delay500us();
-
- Delay500us();
-
- while(1)
-
- {
-
- DUOJI=1;
-
- Delay500us();
-
- Delay500us();
-
- DUOJI=0;
-
- Delay500us();
-
- Delay500us();
-
- }
-
- }
復(fù)制代碼 同樣的代碼一個(gè)在while外,一個(gè)在while內(nèi),如果將while內(nèi)的代碼都注釋起來,那么舵機(jī)并不會(huì)轉(zhuǎn)動(dòng),因?yàn)椴]有一直給予方波,就是這意思。 但 是這樣寫代碼不太好,因?yàn)槭褂玫氖茄舆t函數(shù),程序就會(huì)停在這里,不會(huì)去響應(yīng)其他的函數(shù),所以一般是使用定時(shí)器中斷,具體的代碼就不在這里寫了,附件里有。 需要注意的一點(diǎn)是,進(jìn)入中斷的頻率越高,數(shù)每+1,舵機(jī)轉(zhuǎn)過的角度就越小,也就是精度越好,我使用的是每0.02ms進(jìn)入一次中斷,那么數(shù)每+1,舵機(jī)大 概轉(zhuǎn)過0.02/2*185=1.85°。
再有就是這個(gè)方波與轉(zhuǎn)過角度的關(guān)系了,如下圖:
233150es4vvc5erek7cevv.png.thumb.jpg (32.98 KB, 下載次數(shù): 164)
下載附件
2017-3-7 00:42 上傳
重要的部分是0.5-2.5ms上升沿這段,時(shí)間越長舵機(jī)轉(zhuǎn)過角度越大,0.5ms舵機(jī)就轉(zhuǎn)過0°,2.5ms舵機(jī)就轉(zhuǎn)到最大角度(大概185°),根據(jù)自己需要設(shè)定即可。0.5-30ms下降沿這段,并不重要,只要保證大于0.5ms即可。
最后請看這段代碼:
- void timer0(void) interrupt 1
-
- {
-
- // TR0=0; //如果加上TR0,那么定時(shí)時(shí)間會(huì)受到影響,被延長
-
- TH0=255-TIME_CLOCK/TIME_PER_SEC/12/256;
-
- TL0=255-TIME_CLOCK/TIME_PER_SEC/12%256;
-
-
-
- uiPwmCountDuoJ++;
-
- if(uiPwmCountDuoJ>200)
-
- {
-
- uiPwmCountDuoJ=0;
-
- }
-
- PwmServomoto();
-
- // TR0=1;
-
- }
復(fù)制代碼
這個(gè)中斷函數(shù)里需要注意的是兩行注釋掉的TR0語句,如果不注釋這 兩條語句,那么每次進(jìn)入中斷會(huì)先關(guān)閉中斷計(jì)數(shù),等出中斷了再繼續(xù)計(jì)數(shù),這樣就相當(dāng)于延長了每次中斷的時(shí)間,那么舵機(jī)轉(zhuǎn)過的角度就會(huì)受到影響,如果后續(xù)再在 中斷中增加別的代碼,那么舵機(jī)就得每次都進(jìn)行調(diào)整,很麻煩,所以如果中斷中的代碼并不長,不建議加上TR0這兩條語句。
基本就是這些了,有什么問題就留言,看到會(huì)第一時(shí)間回復(fù)。
如圖這種模擬舵機(jī),在智能小車中是用來帶動(dòng)超聲波探頭旋轉(zhuǎn),剛接觸的朋友在使用的時(shí)候可能覺得有些棘手,故將這幾天的使用心得總結(jié)如下: 首先,這個(gè)舵機(jī)是模擬舵機(jī),而非數(shù)字舵機(jī),這兩者的區(qū)別是這樣,數(shù)字舵機(jī)只要給一個(gè)PWM信號即可,這個(gè)信號是目的地的位置,舵機(jī)會(huì)自動(dòng)旋轉(zhuǎn)到這個(gè)位置,而模擬舵機(jī)需要一直給予目的地的PWM信號。由于舵機(jī)需要的PWM信號實(shí)際就是一個(gè)方波,所以模擬舵機(jī)就是需要不斷的重復(fù)發(fā)一樣的方波,直到舵機(jī)旋轉(zhuǎn)到指定的位置,并且如果需要鎖定在這個(gè)位置,那么還需繼續(xù)給予這個(gè)方波。
請看下面這個(gè)例子: - void main(void)
- {
- DUOJI=1;
- Delay500us();
- Delay500us();
- DUOJI=0;
- Delay500us();
- Delay500us();
- while(1)
- {
- DUOJI=1;
- Delay500us();
- Delay500us();
- DUOJI=0;
- Delay500us();
- Delay500us();
- }
- }
復(fù)制代碼
同樣的代碼一個(gè)在while外,一個(gè)在while內(nèi),如果將while內(nèi)的代碼都注釋起來,那么舵機(jī)并不會(huì)轉(zhuǎn)動(dòng),因?yàn)椴]有一直給予方波,就是這意思。 但是這樣寫代碼不太好,因?yàn)槭褂玫氖茄舆t函數(shù),程序就會(huì)停在這里,不會(huì)去響應(yīng)其他的函數(shù),所以一般是使用定時(shí)器中斷,具體的代碼就不在這里寫了,附件里有。需要注意的一點(diǎn)是,進(jìn)入中斷的頻率越高,數(shù)每+1,舵機(jī)轉(zhuǎn)過的角度就越小,也就是精度越好,我使用的是每0.02ms進(jìn)入一次中斷,那么數(shù)每+1,舵機(jī)大概轉(zhuǎn)過0.02/2*185=1.85°。 再有就是這個(gè)方波與轉(zhuǎn)過角度的關(guān)系了,如下圖: 重要的部分是0.5-2.5ms上升沿這段,時(shí)間越長舵機(jī)轉(zhuǎn)過角度越大,0.5ms舵機(jī)就轉(zhuǎn)過0°,2.5ms舵機(jī)就轉(zhuǎn)到最大角度(大概185°),根據(jù)自己需要設(shè)定即可。0.5-30ms下降沿這段,并不重要,只要保證大于0.5ms即可。 最后請看這段代碼: - void timer0(void) interrupt 1
復(fù)制代碼
這個(gè)中斷函數(shù)里需要注意的是兩行注釋掉的TR0語句,如果不注釋這兩條語句,那么每次進(jìn)入中斷會(huì)先關(guān)閉中斷計(jì)數(shù),等出中斷了再繼續(xù)計(jì)數(shù),這樣就相當(dāng)于延長了每次中斷的時(shí)間,那么舵機(jī)轉(zhuǎn)過的角度就會(huì)受到影響,如果后續(xù)再在中斷中增加別的代碼,那么舵機(jī)就得每次都進(jìn)行調(diào)整,很麻煩,所以如果中斷中的代碼并不長,不建議加上TR0這兩條語句。 最后附上完整的51單片機(jī)控制舵機(jī)源碼:
舵機(jī)程序.zip
(22.69 KB, 下載次數(shù): 528)
2017-3-7 00:41 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|