舵機(jī)控制程序_第1頁(yè)
舵機(jī)控制程序_第2頁(yè)
舵機(jī)控制程序_第3頁(yè)
舵機(jī)控制程序_第4頁(yè)
舵機(jī)控制程序_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 在機(jī)器人機(jī)電控制系統(tǒng)中,舵機(jī)控制效果是性能的重要影響因素。舵機(jī)可以在微機(jī)電系統(tǒng)和航模中作為基本的輸出執(zhí)行機(jī)構(gòu),其簡(jiǎn)單的控制和輸出使得單片機(jī)系統(tǒng)非常容易與之接口。 舵機(jī)是一種位置伺服的驅(qū)動(dòng)器,適用于那些需要角度不斷變化并可以保持的控制系統(tǒng)。其工作原理是:控制信號(hào)由接收機(jī)的通道進(jìn)入信號(hào)調(diào)制芯片,獲得直流偏置電壓。它內(nèi)部有一個(gè)基準(zhǔn)電路,產(chǎn)生周期為20ms,寬度為1.5ms的基準(zhǔn)信號(hào),將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最后,電壓差的正負(fù)輸出到電機(jī)驅(qū)動(dòng)芯片決定電機(jī)的正反轉(zhuǎn)。當(dāng)電機(jī)轉(zhuǎn)速一定時(shí),通過(guò)級(jí)聯(lián)減速齒輪帶動(dòng)電位器旋轉(zhuǎn),使得電壓差為0,電機(jī)停止轉(zhuǎn)動(dòng)。舵機(jī)的控制信號(hào)是pwm信號(hào),

2、利用占空比的變化改變舵機(jī)的位置。一般舵機(jī)的控制要求如圖1所示。圖1 舵機(jī)的控制要求單片機(jī)實(shí)現(xiàn)舵機(jī)轉(zhuǎn)角控制 可以使用fpga、模擬電路、單片機(jī)來(lái)產(chǎn)生舵機(jī)的控制信號(hào),但fpga成本高且電路復(fù)雜。對(duì)于脈寬調(diào)制信號(hào)的脈寬變換,常用的一種方法是采用調(diào)制信號(hào)獲取有源濾波后的直流電壓,但是需要50hz(周期是20ms)的信號(hào),這對(duì)運(yùn)放器件的選擇有較高要求,從電路體積和功耗考慮也不易采用。5mv以上的控制電壓的變化就會(huì)引起舵機(jī)的抖動(dòng),對(duì)于機(jī)載的測(cè)控系統(tǒng)而言,電源和其他器件的信號(hào)噪聲都遠(yuǎn)大于5mv,所以濾波電路的精度難以達(dá)到舵機(jī)的控制精度要求。 也可以用單片機(jī)作為舵機(jī)的控制單元,使pwm信號(hào)的脈沖寬度實(shí)現(xiàn)微秒級(jí)

3、的變化,從而提高舵機(jī)的轉(zhuǎn)角精度。單片機(jī)完成控制算法,再將計(jì)算結(jié)果轉(zhuǎn)化為 pwm信號(hào)輸出到舵機(jī),由于單片機(jī)系統(tǒng)是一個(gè)數(shù)字系統(tǒng),其控制信號(hào)的變化完全依靠硬件計(jì)數(shù),所以受外界干擾較小,整個(gè)系統(tǒng)工作可靠。 單片機(jī)系統(tǒng)實(shí)現(xiàn)對(duì)舵機(jī)輸出轉(zhuǎn)角的控制,必須首先完成兩個(gè)任務(wù):首先是產(chǎn)生基本的pwm周期信號(hào),本設(shè)計(jì)是產(chǎn)生20ms的周期信號(hào);其次是脈寬的調(diào)整,即單片機(jī)模擬pwm信號(hào)的輸出,并且調(diào)整占空比。當(dāng)系統(tǒng)中只需要實(shí)現(xiàn)一個(gè)舵機(jī)的控制,采用的控制方式是改變單片機(jī)的一個(gè)定時(shí)器中斷的初值,將20ms分為兩次中斷執(zhí)行,一次短定時(shí)中斷和一次長(zhǎng)定時(shí)中斷。這樣既節(jié)省了硬件電路,也減少了軟件開(kāi)銷,控制系統(tǒng)工作效率和控制精度都很高

4、。具體的設(shè)計(jì)過(guò)程: 例如想讓舵機(jī)轉(zhuǎn)向左極限的角度,它的正脈沖為2ms,則負(fù)脈沖為20ms-2ms=18ms,所以開(kāi)始時(shí)在控制口發(fā)送高電平,然后設(shè)置定時(shí)器在2ms后發(fā)生中斷,中斷發(fā)生后,在中斷程序里將控制口改為低電平,并將中斷時(shí)間改為18ms,再過(guò)18ms進(jìn)入下一次定時(shí)中斷,再將控制口改為高電平,并將定時(shí)器初值改為2ms,等待下次中斷到來(lái),如此往復(fù)實(shí)現(xiàn)pwm信號(hào)輸出到舵機(jī)。用修改定時(shí)器中斷初值的方法巧妙形成了脈沖信號(hào),調(diào)整時(shí)間段的寬度便可使伺服機(jī)靈活運(yùn)動(dòng)。 為保證軟件在定時(shí)中斷里采集其他信號(hào),并且使發(fā)生pwm信號(hào)的程序不影響中斷程序的運(yùn)行(如果這些程序所占用時(shí)間過(guò)長(zhǎng),有可能會(huì)發(fā)生中斷程序還未結(jié)束

5、,下次中斷又到來(lái)的后果),所以需要將采集信號(hào)的函數(shù)放在長(zhǎng)定時(shí)中斷過(guò)程中執(zhí)行,也就是說(shuō)每經(jīng)過(guò)兩次中斷執(zhí)行一次這些程序,執(zhí)行的周期還是20ms。軟件流程如圖2所示。圖2 產(chǎn)生pwm信號(hào)的軟件流程 如果系統(tǒng)中需要控制幾個(gè)舵機(jī)的準(zhǔn)確轉(zhuǎn)動(dòng),可以用單片機(jī)和計(jì)數(shù)器進(jìn)行脈沖計(jì)數(shù)產(chǎn)生pwm信號(hào)。 脈沖計(jì)數(shù)可以利用51單片機(jī)的內(nèi)部計(jì)數(shù)器來(lái)實(shí)現(xiàn),但是從軟件系統(tǒng)的穩(wěn)定性和程序結(jié)構(gòu)的合理性看,宜使用外部的計(jì)數(shù)器,還可以提高cpu的工作效率。實(shí)驗(yàn)后從精度上考慮,對(duì)于futaba系列的接收機(jī),當(dāng)采用1mhz的外部晶振時(shí),其控制電壓幅值的變化為0.6mv,而且不會(huì)出現(xiàn)誤差積累,可以滿足控制舵機(jī)的要求。最后考慮數(shù)字系統(tǒng)的離散誤

6、差,經(jīng)估算誤差的范圍在0.3%內(nèi),所以采用單片機(jī)和8253、8254這樣的計(jì)數(shù)器芯片的pwm信號(hào)產(chǎn)生電路是可靠的。圖3是硬件連接圖。圖3 pwa信號(hào)的計(jì)數(shù)和輸出電路(點(diǎn)擊放大)基于8253產(chǎn)生pwm信號(hào)的程序主要包括三方面內(nèi)容:一是定義8253寄存器的地址,二是控制字的寫入,三是數(shù)據(jù)的寫入。軟件流程如圖4所示,具體代碼如下。1. /關(guān)鍵程序及注釋: 2. /定時(shí)器t0中斷,向8253發(fā)送控制字和數(shù)據(jù) 3. voidt0int()interrupt1 4. 5. th0=0xb1; 6. tl0=0xe0;/20ms的時(shí)鐘基準(zhǔn) 7. /先寫入控制字,再寫入計(jì)數(shù)值 8. servo0=0x30;/

7、選擇計(jì)數(shù)器0,寫入控制字 9. pwm0=buf0l;/先寫低,后寫高 10. pwm0=buf0h; 11. servo1=0x70;/選擇計(jì)數(shù)器1,寫入控制字 12. pwm1=buf1l; 13. pwm1=buf1h; 14. servo2=0xb0;/選擇計(jì)數(shù)器2,寫入控制字 15. pwm2=buf2l; 16. pwm2=buf2h; 17. 圖4 基于8253產(chǎn)生pwa信號(hào)的軟件流程 當(dāng)系統(tǒng)的主要工作任務(wù)就是控制多舵機(jī)的工作,并且使用的舵機(jī)工作周期均為20ms時(shí),要求硬件產(chǎn)生的多路pwm波的周期也相同。使用51單片機(jī)的內(nèi)部定時(shí)器產(chǎn)生脈沖計(jì)數(shù),一般工作正脈沖寬度小于周期的1/8,

8、這樣可以在1個(gè)周期內(nèi)分時(shí)啟動(dòng)各路pwm波的上升沿,再利用定時(shí)器中斷t0確定各路pwm波的輸出寬度,定時(shí)器中斷t1控制20ms的基準(zhǔn)時(shí)間。 第1次定時(shí)器中斷t0按20ms的 1/8設(shè)置初值,并設(shè)置輸出i/o口,第1次t0定時(shí)中斷響應(yīng)后,將當(dāng)前輸出i/o口對(duì)應(yīng)的引腳輸出置高電平,設(shè)置該路輸出正脈沖寬度,并啟動(dòng)第2次定時(shí)器中斷,輸出i/o口指向下一個(gè)輸出口。第2次定時(shí)器定時(shí)時(shí)間結(jié)束后,將當(dāng)前輸出引腳置低電平,設(shè)置此中斷周期為20ms的1/8減去正脈沖的時(shí)間,此路 pwm信號(hào)在該周期中輸出完畢,往復(fù)輸出。在每次循環(huán)的第16次(28=16)中斷實(shí)行關(guān)定時(shí)中斷t0的操作,最后就可以實(shí)現(xiàn)8路舵機(jī)控制信號(hào)的輸

9、出。 也可以采用外部計(jì)數(shù)器進(jìn)行多路舵機(jī)的控制,但是因?yàn)槌R?jiàn)的8253、8254芯片都只有3個(gè)計(jì)數(shù)器,所以當(dāng)系統(tǒng)需要產(chǎn)生多路pwm信號(hào)時(shí),使用上述方法可以減少電路,降低成本,也可以達(dá)到較高的精度。調(diào)試時(shí)注意到由于程序中脈沖寬度的調(diào)整是靠調(diào)整定時(shí)器的初值,中斷程序也被分成了8個(gè)狀態(tài)周期,并且需要嚴(yán)格的周期循環(huán),而且運(yùn)行其他中斷程序代碼的時(shí)間需要嚴(yán)格把握。 在實(shí)際應(yīng)用中,采用51單片機(jī)簡(jiǎn)單方便地實(shí)現(xiàn)了舵機(jī)控制需要的pwm信號(hào)。對(duì)機(jī)器人舵機(jī)控制的測(cè)試表明,舵機(jī)控制系統(tǒng)工作穩(wěn)定,pwm占空比 (0.52.5ms 的正脈沖寬度)和舵機(jī)的轉(zhuǎn)角(-9090)線性度較好。如何使用at89s52編寫這樣一個(gè)程序。

10、 要求,單片機(jī)控制舵機(jī),讓舵機(jī)到中間位置后,左轉(zhuǎn)15度,延遲2ms,右轉(zhuǎn)15度。(度數(shù)不要求精確)。舵機(jī)為0.52.5ms。晶振12m#includeunsigned int pwm;unsigned char flag;sbit p10=p10;void timer0() interrupt 1 using 1 p10=!p10; pwm=20000-pwm; th0=pwm/256; tl0=pwm%256; flag+; if(flag10)flag+; if(flag=10&p10=0)pwm=1250;flag=11;/保證回到90度再左轉(zhuǎn)15; void timer1() inte

11、rrupt 3 using 1 et1=0;/2ms到關(guān)閉定時(shí)器1 et0=0; tr0=0; pwm=1750; th0=pwm/256; tl0=pwm%256; et0=1; tr0=1; void int0 (void) interrupt 0 using 1 /判斷左轉(zhuǎn)到15,通過(guò)傳感器判斷或者其他信號(hào)判斷 ,能正好保證剛左轉(zhuǎn)15度,開(kāi)始延時(shí)2ms tr1=1;/定時(shí)器1開(kāi)始計(jì)數(shù) void main(void) p10=1; tmod=0x11; pwm=1500;/回90度 th0=pwm/256; tl0=pwm%256; th1=2000/256; tl1=2000%256;

12、ea=1; et0=1; et1=1; tr0=1; while(1);舵機(jī)控制程序8路舵機(jī)控制器 芯片:at89s52晶振:12mhz=*/i nclude#define uint8 unsigned char#define uint16 unsigned intsbit key1=p14;sbit key2=p15;/pwm的輸出端口sbit pwm_out0=p00;sbit pwm_out1=p01;sbit pwm_out2=p02;sbit pwm_out3=p03;sbit pwm_out4=p04;sbit pwm_out5=p05;sbit pwm_out6=p06;sbit

13、 pwm_out7=p07;/pwm的數(shù)據(jù)值uint16 pwm_value8=1500,1000,1500,1000,1750,2000,2500,2000;uint8 order1; /定時(shí)器掃描序列/*= 定時(shí)器t0的中斷服務(wù)程序 一個(gè)循環(huán)20ms = 8*2.5ms=*/void timer0(void) interrupt 1 using 1switch(order1)case 1: pwm_out0=1; th0=-pwm_value0/256; tl0=-pwm_value0%256; break;case 2: pwm_out0=0; th0=-(2700-pwm_value0

14、)/256; tl0=-(2700-pwm_value0)%256; break;case 3: pwm_out1=1; th0=-pwm_value1/256; tl0=-pwm_value1%256; break;case 4: pwm_out1=0; th0=-(2700-pwm_value1)/256; tl0=-(2700-pwm_value1)%256; break;case 5: pwm_out2=1; th0=-pwm_value2/256; tl0=-pwm_value2%256; break;case 6: pwm_out2=0 ; th0=-(2700-pwm_value

15、2)/256; tl0=-(2700-pwm_value2)%256; break;case 7: pwm_out3=1; th0=-pwm_value3/256; tl0=-pwm_value3%256; break;case 8: pwm_out3=0; th0=-(2700-pwm_value3)/256; tl0=-(2700-pwm_value3)%256; break;case 9: pwm_out4=1; th0=-pwm_value4/256; tl0=-pwm_value4%256; break;case 10: pwm_out4=0; th0=-(2700-pwm_valu

16、e4)/256; tl0=-(2700-pwm_value4)%256; break;case 11: pwm_out5=1; th0=-pwm_value5/256; tl0=-pwm_value5%256; break;case 12: pwm_out5=0; th0=-(2700-pwm_value5)/256; tl0=-(2700-pwm_value5)%256; break;case 13: pwm_out6=1; th0=-pwm_value6/256; tl0=-pwm_value6%256; break;case 14: pwm_out6=0; th0=-(2700-pwm_

17、value6)/256; tl0=-(2700-pwm_value6)%256; break;case 15: pwm_out7=1; th0=-pwm_value7/256; tl0=-pwm_value7%256; break;case 16: pwm_out7=0; order1=0; th0=-(2700-pwm_value7)/256; tl0=-(2700-pwm_value7)%256; order1=0; break; default : order1=0; order1+;/*=初始化中斷=*/void initpwm(void) order1=1; tmod |=0x11;

18、 th0=-1500/256; tl0=-1500%256; ea=1; ex0=0; et0=1; tr0=1;pt0=1;px0=0;void delay(void) uint16 i=100; while(i-);void main(void)initpwm(); while(1) if(key1=0) if(pwm_value0500) pwm_value0-; delay(); 單片機(jī)舵機(jī)控制程序# include# define uchar unsigned char# define uint unsigned intuint a,b,c,d,n;sbit p12=p12;sbit

19、 p13=p13;sbit p37=p37;void timer0(void) interrupt 1 using 1p12=!p12;c=20000-c;th0=-(c/256);tl0=-(c%256);if(c=500&c=2500)c=a;else c=20000-a;void delay()uint i;for(i=0;i200;i+)void init_serialcomm(void) scon= 0x50; /scon: serail mode 1, 8-bit uart, enable ucvr tmod |= 0x21; /tmod: timer 1, mode 2, 8-b

20、it reload pcon |= 0x80; /smod=1; th1 = 0xf4; /baud:4800fosc=11.0592mhz ie |= 0x93; /enable serial interrupt tr1 = 1; / timer 1 run / ti=1; void serial () interrupt 4 using 3 if(ri) ri = 0; b=sbuf; sbuf=0xff; while(ti=0); ti=0; void main(void)/tmod=0x21;init_serialcomm(); p12=1;a=1500;c=a;th0=-(a/256

21、);tl0=-(a%256);px0=0;pt0=1;tr0=1;while(1)a=b*10;舵機(jī)控制程序(改變a值可控制任意角度)#include#include#define uchar unsigned char#define uint unsigned intuint a,c;sbit p10=p10;sbit p11=p11;void timer0(void) interrupt 1 p10=!p10;p11=!p11; c=20000-c; th0=-(c/256); tl0=-(c%256); if(c=500&c0;j-);void main(void)tmod=0x01;

22、/16位定時(shí)器 工作方式1p10=1;p11=1;a=2500;/180/c=a;th0=-(a/256); tl0=-(a%256);ea=1;et0=1; tr0=1;for(a=2500;a=500;a-)a=a-10;c=a; delay(5000);基于at89c2051的多路舵機(jī)控制器設(shè)計(jì) ( 2007-11-10 11:37 )摘要 舵機(jī)是機(jī)器人、機(jī)電系統(tǒng)和航模的重要執(zhí)行機(jī)構(gòu)。舵機(jī)控制器為舵機(jī)提供必要的能源和控制信號(hào)。本文提出一種以外部中斷計(jì)數(shù)為基礎(chǔ)的pwm波形實(shí)現(xiàn)方法。該方法具有簡(jiǎn)單方便,成本低,可實(shí)現(xiàn)多路獨(dú)立pwm輸出的優(yōu)點(diǎn)。關(guān)鍵詞 at89(:205l 舵機(jī)控制器 外部中斷

23、pwm 舵機(jī)是一種位置伺服的驅(qū)動(dòng)器。它接收一定的控制信號(hào),輸出一定的角度,適用于那些需要角度不斷變化并可以保持的控制系統(tǒng)。在微機(jī)電系統(tǒng)和航模中,它是一個(gè)基本的輸出執(zhí)行機(jī)構(gòu)。1 舵機(jī)的工作原理以日本futaba-s3003型舵機(jī)為例,圖1是fufaba-s3003型舵機(jī)的內(nèi)部電路。舵機(jī)的工作原理是:pwm信號(hào)由接收通道進(jìn)入信號(hào)解調(diào)電路ba66881。的12腳進(jìn)行解調(diào),獲得一個(gè)直流偏置電壓。該直流偏置電壓與電位器的電壓比較,獲得電壓差由ba6688的3腳輸出。該輸出送人電機(jī)驅(qū)動(dòng)集成電路ba6686,以驅(qū)動(dòng)電機(jī)正反轉(zhuǎn)。當(dāng)電機(jī)轉(zhuǎn)速一定時(shí),通過(guò)級(jí)聯(lián)減速齒輪帶動(dòng)電位器r。,旋轉(zhuǎn),直到電壓差為o,電機(jī)停止轉(zhuǎn)

24、動(dòng)。舵機(jī)的控制信號(hào)是pwm信號(hào),利用占空比的變化改變舵機(jī)的位置。2 舵機(jī)的控制方法標(biāo)準(zhǔn)的舵機(jī)有3條導(dǎo)線,分別是:電源線、地線、控制線,如圖2所示。電源線和地線用于提供舵機(jī)內(nèi)部的直流電機(jī)和控制線路所需的能源電壓通常介于46v,一般取5v。注意,給舵機(jī)供電電源應(yīng)能提供足夠的功率??刂凭€的輸入是一個(gè)寬度可調(diào)的周期性方波脈沖信號(hào),方波脈沖信號(hào)的周期為20 ms(即頻率為50 hz)。當(dāng)方波的脈沖寬度改變時(shí),舵機(jī)轉(zhuǎn)軸的角度發(fā)生改變,角度變化與脈沖寬度的變化成正比。某型舵機(jī)的輸出軸轉(zhuǎn)角與輸入信號(hào)的脈沖寬度之間的關(guān)系可用圍3來(lái)表示。3 舵機(jī)控制器的設(shè)計(jì)(1)舵機(jī)控制器硬件電路設(shè)計(jì)從上述舵機(jī)轉(zhuǎn)角的控制方法可看

25、出,舵機(jī)的控制信號(hào)實(shí)質(zhì)是一個(gè)可嗣寬度的方波信號(hào)(pwm)。該方波信號(hào)可由fpga、模擬電路或單片機(jī)來(lái)產(chǎn)生。采用fpga成本較高,用模擬電路來(lái)實(shí)現(xiàn)則電路較復(fù)雜,不適合作多路輸出。一般采用單片機(jī)作舵機(jī)的控制器。目前采用單片機(jī)做舵機(jī)控制器的方案比較多,可以利用單片機(jī)的定時(shí)器中斷實(shí)現(xiàn)pwm。該方案將20ms的周期信號(hào)分為兩次定時(shí)中斷來(lái)完成:一次定時(shí)實(shí)現(xiàn)高電平定時(shí)th;一次定時(shí)實(shí)現(xiàn)低電平定時(shí)t1。th、t1的時(shí)間值隨脈沖寬度的變換而變化,但,th+t1=20ms。該方法的優(yōu)點(diǎn)是,pwm信號(hào)完全由單片機(jī)內(nèi)部定時(shí)器的中斷來(lái)實(shí)現(xiàn),不需要添加外圍硬件。缺點(diǎn)是一個(gè)周期中的pwm信號(hào)要分兩次中斷來(lái)完成,兩次中斷的定

26、時(shí)值計(jì)算較麻煩;為了滿足20ms的周期,單片機(jī)晶振的頻率要降低;不能實(shí)現(xiàn)多路輸出。也可以采用單片機(jī)+8253計(jì)數(shù)器的實(shí)現(xiàn)方案。該方案由單片機(jī)產(chǎn)生計(jì)數(shù)脈沖(或外部電路產(chǎn)生計(jì)數(shù)脈沖)提供給8253進(jìn)行計(jì)數(shù),由單片機(jī)給出8253的計(jì)數(shù)比較值來(lái)改變輸出脈寬。該方案的優(yōu)點(diǎn)是可以實(shí)現(xiàn)多路輸出,軟件設(shè)計(jì)較簡(jiǎn)單;缺點(diǎn)是要添加l片8253計(jì)數(shù)器,增加了硬件成本。本文在綜合上述兩個(gè)單片機(jī)舵機(jī)控制方案基礎(chǔ)上,提出了一個(gè)新的設(shè)計(jì)方案,如圖4所示。該方案的舵機(jī)控制器以at89c2051單片機(jī)為核心,555構(gòu)成的振蕩器作為定時(shí)基準(zhǔn),單片機(jī)通過(guò)對(duì)555振蕩器產(chǎn)生的脈沖信號(hào)進(jìn)行計(jì)數(shù)來(lái)產(chǎn)生pwm信號(hào)。該控制器中單片機(jī)可以產(chǎn)生8

27、個(gè)通道的pwm信號(hào),分別由at89c2051的p10pl.7(1219引腳)端口輸出。輸出的8路pwm信號(hào)通過(guò)光耦隔離傳送到下一級(jí)電路中。因?yàn)樾盘?hào)通過(guò)光耦傳送過(guò)程中進(jìn)行了反相,因此從光耦出來(lái)的信號(hào)必須再經(jīng)過(guò)反相器進(jìn)行反相。方波信號(hào)經(jīng)過(guò)光耦傳輸后,前沿和后沿會(huì)發(fā)生畸變,因此反相器采用cd40106施密特反相器對(duì)光耦傳輸過(guò)來(lái)的信號(hào)進(jìn)行整形,產(chǎn)生標(biāo)準(zhǔn)的pwm方波信號(hào)。筆者在實(shí)驗(yàn)過(guò)程中發(fā)現(xiàn),舵機(jī)在運(yùn)行過(guò)程中要從電源吸納較大的電流,若舵機(jī)與單片機(jī)控制器共用一個(gè)電源,則舵機(jī)會(huì)對(duì)單片機(jī)產(chǎn)生較大的干擾。因此,舵機(jī)與單片機(jī)控制器采用兩個(gè)電源供電,兩者不共地,通過(guò)光耦來(lái)隔離,并且給舵機(jī)供電的電源最好采用輸出功率較

28、大的開(kāi)關(guān)電源。該舵機(jī)控制器占用單片機(jī)的個(gè)sci串口。串口用于接收上位機(jī)傳送過(guò)來(lái)的控制命令,以調(diào)節(jié)每一個(gè)通道輸出信號(hào)的脈沖寬度。max232為電平轉(zhuǎn)換器,將上位機(jī)的rs232電平轉(zhuǎn)換成ttl電平。(2)實(shí)現(xiàn)多路pwm信號(hào)的原理在模擬電路中,pwm脈沖信號(hào)可以通過(guò)直流電平與鋸齒波信號(hào)比較來(lái)得到。在單片機(jī)中,鋸齒波可以通過(guò)對(duì)整型變量加1操作來(lái)實(shí)現(xiàn),如圖5所示。假定單片機(jī)程序中設(shè)置一整型變量sawval,其值變化范圍為on。555振蕩電路產(chǎn)生的外部計(jì)數(shù)時(shí)鐘信號(hào)輸入到at89c2051的into腳。每當(dāng)在外部計(jì)數(shù)時(shí)鐘脈沖的下降沿,單片機(jī)產(chǎn)生外部中斷,執(zhí)行外部中斷int0的中斷服務(wù)程序。每產(chǎn)生一次外部中斷

29、,對(duì)sawval執(zhí)行一次加1操作,若sawval已達(dá)到最大值n,則對(duì)sawval清o。sawval值的變化規(guī)律相當(dāng)于鋸齒波,如圖5所示。若在單片機(jī)程序中設(shè)置另一整型變量dutyval,其值的變化范圍為on。每當(dāng)在sawval清0時(shí),dulyval從上位機(jī)發(fā)送的控制命令中讀入脈沖寬度系數(shù)值,例如為h(0hn)。若dutyvalsawval,則對(duì)應(yīng)端口輸出高電平;若dutyvalsawval,則對(duì)應(yīng)端口輸出低電平。從圖5中可看出,若改變dutyval的值,則對(duì)應(yīng)端口輸出脈沖的寬度發(fā)生變化,但輸出脈沖的頻率不變,此即為pwm波形。 設(shè)外部計(jì)數(shù)時(shí)鐘周期為tint0,鋸齒波周期(pwm脈沖周期)為tpw

30、m,pwm脈沖寬度占空比為d,由圖5可得出如下關(guān)系: 由式(3)可知,pwm波形的周期tpwm一旦確定下來(lái),只須選定計(jì)數(shù)最大值n,就可以確定外部時(shí)鐘脈沖所需周期(頻率)。外部時(shí)鐘脈沖周期tint0顯然是pwm脈沖寬度變換的最小步距,即調(diào)節(jié)精度。由式(4)可知,n越大,步距所占pwm周期的百分比越小,精度越高。例如,若采用8位整型變量,最大值n=28-1=255,則精度為1(255+1)=1255;若采用16位整型變量,最大值n=216-1=65535,則精度為165536。文中計(jì)數(shù)變量sawval采用8位整型變量,因此n=255。對(duì)于一般應(yīng)用,其精度已足夠。就舵機(jī)而言,要求tpwm=20ms,則可算得外部時(shí)鐘周期為: 因此,設(shè)計(jì)555振蕩電路時(shí),其輸出脈沖的頻率應(yīng)為: 當(dāng)有多個(gè)變量與sawval比較,將比較結(jié)果輸出到多個(gè)端口時(shí)。就形成了多路pwm波形。各個(gè)變量的值可以獨(dú)立變化,因此各路pwm波形的占空比

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論