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

下載本文檔

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

文檔簡介

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

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

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

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

5、,下次中斷又到來的后果),所以需要將采集信號的函數(shù)放在長定時(shí)中斷過程中執(zhí)行,也就是說每經(jīng)過兩次中斷執(zhí)行一次這些程序,執(zhí)行的周期還是20ms。軟件流程如圖2所示。圖2 產(chǎn)生PWM信號的軟件流程 如果系統(tǒng)中需要控制幾個(gè)舵機(jī)的準(zhǔn)確轉(zhuǎn)動(dòng),可以用單片機(jī)和計(jì)數(shù)器進(jìn)行脈沖計(jì)數(shù)產(chǎn)生PWM信號。 脈沖計(jì)數(shù)可以利用51單片機(jī)的內(nèi)部計(jì)數(shù)器來實(shí)現(xiàn),但是從軟件系統(tǒng)的穩(wěn)定性和程序結(jié)構(gòu)的合理性看,宜使用外部的計(jì)數(shù)器,還可以提高CPU的工作效率。實(shí)驗(yàn)后從精度上考慮,對于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信號產(chǎn)生電路是可靠的。圖3是硬件連接圖。圖3 PWA信號的計(jì)數(shù)和輸出電路(點(diǎn)擊放大)基于8253產(chǎn)生PWM信號的程序主要包括三方面內(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信號的軟件流程 當(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口對應(yīng)的引腳輸出置高電平,設(shè)置該路輸出正脈沖寬度,并啟動(dòng)第2次定時(shí)器中斷,輸出I/O口指向下一個(gè)輸出口。第2次定時(shí)器定時(shí)時(shí)間結(jié)束后,將當(dāng)前輸出引腳置低電平,設(shè)置此中斷周期為20ms的1/8減去正脈沖的時(shí)間,此路 PWM信號在該周期中輸出完畢,往復(fù)輸出。在每次循環(huán)的第16次(28=16)中斷實(shí)行關(guān)定時(shí)中斷T0的操作,最后就可以實(shí)現(xiàn)8路舵機(jī)控制信號的輸

9、出。 也可以采用外部計(jì)數(shù)器進(jìn)行多路舵機(jī)的控制,但是因?yàn)槌R姷?253、8254芯片都只有3個(gè)計(jì)數(shù)器,所以當(dāng)系統(tǒng)需要產(chǎn)生多路PWM信號時(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ī)簡單方便地實(shí)現(xiàn)了舵機(jī)控制需要的PWM信號。對機(jī)器人舵機(jī)控制的測試表明,舵機(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,通過傳感器判斷或者其他信號判斷 ,能正好保證剛左轉(zhuǎn)15度,開始延時(shí)2ms TR1=1;/定時(shí)器1開始計(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ī)提供必要的能源和控制信號。本文提出一種以外部中斷計(jì)數(shù)為基礎(chǔ)的PWM波形實(shí)現(xiàn)方法。該方法具有簡單方便,成本低,可實(shí)現(xiàn)多路獨(dú)立PWM輸出的優(yōu)點(diǎn)。關(guān)鍵詞 AT89(:205l 舵機(jī)控制器 外部中斷

23、PWM 舵機(jī)是一種位置伺服的驅(qū)動(dòng)器。它接收一定的控制信號,輸出一定的角度,適用于那些需要角度不斷變化并可以保持的控制系統(tǒng)。在微機(jī)電系統(tǒng)和航模中,它是一個(gè)基本的輸出執(zhí)行機(jī)構(gòu)。1 舵機(jī)的工作原理以日本FUTABA-S3003型舵機(jī)為例,圖1是FUFABA-S3003型舵機(jī)的內(nèi)部電路。舵機(jī)的工作原理是:PWM信號由接收通道進(jìn)入信號解調(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í),通過級聯(lián)減速齒輪帶動(dòng)電位器R。,旋轉(zhuǎn),直到電壓差為O,電機(jī)停止轉(zhuǎn)

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

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

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ù)比較值來改變輸出脈寬。該方案的優(yōu)點(diǎn)是可以實(shí)現(xiàn)多路輸出,軟件設(shè)計(jì)較簡單;缺點(diǎn)是要添加l片8253計(jì)數(shù)器,增加了硬件成本。本文在綜合上述兩個(gè)單片機(jī)舵機(jī)控制方案基礎(chǔ)上,提出了一個(gè)新的設(shè)計(jì)方案,如圖4所示。該方案的舵機(jī)控制器以AT89C2051單片機(jī)為核心,555構(gòu)成的振蕩器作為定時(shí)基準(zhǔn),單片機(jī)通過對555振蕩器產(chǎn)生的脈沖信號進(jìn)行計(jì)數(shù)來產(chǎn)生PWM信號。該控制器中單片機(jī)可以產(chǎn)生8

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

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

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

30、M,PWM脈沖寬度占空比為D,由圖5可得出如下關(guān)系: 由式(3)可知,PWM波形的周期TPWM一旦確定下來,只須選定計(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。對于一般應(yīng)用,其精度已足夠。就舵機(jī)而言,要求TPWM=20ms,則可算得外部時(shí)鐘周期為: 因此,設(shè)計(jì)555振蕩電路時(shí),其輸出脈沖的頻率應(yīng)為: 當(dāng)有多個(gè)變量與SawVal比較,將比較結(jié)果輸出到多個(gè)端口時(shí)。就形成了多路PWM波形。各個(gè)變量的值可以獨(dú)立變化,因此各路PWM波形的占空比也

溫馨提示

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

評論

0/150

提交評論