單片機控制路舵機_第1頁
單片機控制路舵機_第2頁
單片機控制路舵機_第3頁
單片機控制路舵機_第4頁
單片機控制路舵機_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 單片機控制舵機附:單片機控制8路舵機程序,串口通訊上位機程序(C#)一、 設計內容綜述機械臂主要由手部和運動機構組成。手部是用來抓持工件的部件,運動機構使手部完成各種轉動、移動或復合運動來實現(xiàn)規(guī)定的動作。為了抓取空間中任意位置和方位的物體,需有6個自由度,用六個舵機來控制。由單片機產(chǎn)生六路占空比可調的PWM信號來控制機械手的運動。利用上位機與單片機通信,改變占空比從而控制機械臂。為了使機械手運動時保持一定的連貫性,同時刻到達指定位置,機械手不同部位運動的速度應該不同,轉一個小角度時舵機的速度應該慢一些,從而達到柔性控制。 二、所使用的關鍵器件和基本參數(shù)舵機TR213:1.速度:0.15秒/6

2、0度(4.8V);0.12秒/60度(6.0V) 2.扭矩:13kgcm 3.范圍:180 4.控制精度:0.5 5.精度:精度高,步進角度很小 MAX232: 1.符合所有的RS-232C技術標準 2.只需要單一 +5V電源供電,片載電荷泵具有升壓、電壓極性反轉能力,能夠產(chǎn)生+10V和-10V電壓V+、V-3.功耗低,典型供電電流5mA 4.內部集成兩個RS-232C驅動器,兩個RS-232C接收器三、工作原理說明及計算1、PC機與單片機通信在工業(yè)控制系統(tǒng)中,各種數(shù)據(jù)的采集和執(zhí)行機構的控制都是由下位機來完成。由于單片機具有體積小、價格低廉、可應用于惡劣工業(yè)環(huán)境的特點,在分布式控制系統(tǒng)中大多采

3、用單片機作為下位機來進行數(shù)據(jù)采集和現(xiàn)場控制。在這些應用中,單片機只是直接面向被控對象底層。而對采集到的數(shù)據(jù)進行進一步分析和處理的工作是由功能強大的主控PC機來完成的。因此,PC機和單片機之間就有著大量的數(shù)據(jù)交換。 通常PC機和單片機之間的通信是通過串行總線RS-232實現(xiàn)的。因此采用一種以MAX232為核心的通信接口電路。該接口電路適用于由一臺PC機與多個單片機串行通信的設計,其原理和方法同樣適用于PC機與其它單片機之間的串行數(shù)據(jù)通信。 RS-232C該框圖中,起著重要作用的是RS-232C通信接口電路。它是上位機和下位機之間信息傳遞的樞紐,一切數(shù)據(jù)的傳輸必需由它完成,上位機利用它的RS-23

4、2串行口,為此,采用了RS-232串行通信來接收或上傳數(shù)據(jù)和指令。但RS-232信號的電平和單片機串口信號的電平不一致,必須進行二者之間的電平轉換。在此電路中,采用MAX232實現(xiàn)TTL邏輯電平和RS-232電平之間的相互轉換。 MAX232由單一的+5V電源供電,只需配接5個高精度10F/50V的鉭電容即可完成電平轉換。轉換后的串行信號TXD、RXD直接與PC機的串行口連接。如此設計,既可發(fā)揮出PC強大的計算和顯示功能,又可以體現(xiàn)出單片機靈活的控制功能,有利于對現(xiàn)場信號的實時采集、處理和監(jiān)控。串口通訊軟件2、舵機的結構舵機簡單的說就是集成了直流電機、電機控制器和減速器等,并封裝在一個便于安裝

5、的外殼里的伺服單元。能夠利用簡單的輸入信號比較精確的轉動給定角度的電機系統(tǒng)。舵機安裝了一個電位器(或其它角度傳感器)檢測輸出軸轉動角度,控制板根據(jù)電位器的信息能比較精確的控制和保持輸出軸的角度。這樣的直流電機控制方式叫閉環(huán)控制,所以舵機更準確的說是伺服馬達,英文servo。舵機的主體結構有五個部分:外殼、減速齒輪組、電機、電位器、控制電路。工作原理:控制電路接受來自信號線的控制信號,控制電機轉動,電機帶動一系列齒輪組,減速后傳動至輸出舵盤。舵機的輸出軸和位置反饋電位計是相連的,舵盤轉動的同時,帶動位置反饋電位計,電位計將輸出一個電壓信號到控制電路板,進行反饋,然后控制電路板,根據(jù)所在位置決定電

6、機的轉動方向和速度,從而達到目標停止。舵機的輸入線共有三條,紅色中間,是電源線,一邊黑色的是地線,這輛根線給舵機提供最基本的能源保證,主要是電機的轉動消耗。電源有兩種規(guī)格,一是4.8V,一是6.0V,分別對應不同的轉矩標準,即輸出力矩不同,6.0V 對應的要大一些;另外一根線是控制信號線,一般為桔黃色。舵機的控制信號為周期是20ms 的脈寬調制(PWM)信號,其中脈沖寬度從,相對應舵盤的位置為0180 度,呈線性變化。也就是說,給它提供一定的脈寬,它的輸出軸就會保持在一個相對應的角度上,無論外界轉矩怎樣改變,直到給它提供一個另外寬度的脈沖信號,它才會改變輸出角度到新的對應的位置上。舵機內部有一

7、個基準電路,產(chǎn)生周期20ms,寬度1.5ms 的基準信號,有一個比較器,將外加信號與基準信號相比較,判斷出方向和大小,從而產(chǎn)生電機的轉動信號。由此可見,舵機是一種位置伺服的驅動器,轉動范圍不能超過180 度,適用于那些需要角度不斷變化并可以保持的驅動當中。舵機的外殼一般是塑料的,特殊的舵機可能會有金屬鋁合金外殼。金屬外殼能夠提供更好的散熱,可以讓舵機內的電機運行在更高功率下,以提供更高的扭矩輸出。金屬外殼也可以提供更牢固的固定位置。FUTABA-S3003 型舵機的內部電路 標準舵機示意圖 舵機輸出轉角與輸入信號脈沖寬度的關系正是因為舵機有很多優(yōu)點,所以應用已經(jīng)擴展到各種機電產(chǎn)品中來,在機器人

8、控制中應用也越來越廣泛。3、用單片機來控制舵機舵機的控制信號是一個脈寬調制信號,所以很方便和數(shù)字系統(tǒng)進行接口。只要能產(chǎn)生標準的控制信號的數(shù)字設備都可以用來控制舵機。我們使用單片機產(chǎn)生舵機的控制信號來進行控制的方法,編程語言為C51。單片機有兩個(或兩個以上)內部計數(shù)器,我們就用它來產(chǎn)生周期20 ms 的脈沖信號,根據(jù)需要,改變輸出脈寬。脈沖信號的輸出是靠定時器的溢出中斷函數(shù)來處理,時間很短,因此在精度要求不高的場合可以忽略。因此如果忽略中斷時間,從另一個角度來講就是主程序和脈沖輸出是并行的,因此,只需要在主程序中按要求改變A值,例如讓A從500 變化到2500,就可以讓舵機從0 度變化到180

9、 度。另外舵機的轉動需要時間的,因此,程序中A值的變化不能太快,不然舵機跟不上程序。根據(jù)需要,選擇合適的延時,用一個遞增循環(huán),可以讓舵機很流暢的轉動,而不會產(chǎn)生像步進電機一樣的脈動。這些還需要實踐中具體體會。舵機的速度決定于你給它的信號脈寬的變化速度。一般來講,舵機最大轉動速度在4.8V 時為0.23s/60 度,也就是說,如果你要求的速度比這個快的話,舵機就反應不過來了;如果要求速度比這個慢,可以將脈寬變化值線性到你要求的時間內,做一個循環(huán),逐漸的增加脈寬值,就可以控制舵機的速度了。當然,具體這個量到底是多少,就需要做試驗了,不然的話,不合適的話,舵機就會向步進電機一樣一跳一跳的轉動了。還有

10、一點很重要,就是舵機在每一次脈寬值改變的時候總會有一個轉速由零增加再減速為零的過程,這就是舵機會產(chǎn)生像步進電機一樣運動的原因。如果系統(tǒng)中需要控制幾個舵機的準確轉動,可以用單片機和計數(shù)器進行脈沖計數(shù)產(chǎn)生P W M 信號。脈沖計數(shù)可以利用51 單片機的內部計數(shù)器來實現(xiàn),由于時間及專業(yè)限制,我們暫時使用這種方法。當系統(tǒng)的主要工作任務就是控制多個舵機的工作,并且使用的舵機工作周期均為20ms 時。要求硬件產(chǎn)生的多路P W M 波的周期也相同。使用51 單片機的內部定時器產(chǎn)生脈沖計數(shù)。一般工作正脈沖寬度小于周期的1/8 。這樣可以在1個周期內分時啟動各路P W M 波的上升沿。再利用定時器中斷T0 確定

11、各路PWM 波的輸出寬度。定時器中斷T1 控制20ms 的基準時間。第1 次定時器中斷T0 按20ms 的1/8(由于數(shù)比較好算,所以用1/8) 設置初值,并設置輸出I/O 口,第1 次T0 定時中斷響應后,將當前輸出I/O 口對應的引腳輸出置高電平,設置該路輸出正脈沖寬度,并啟動第2 次定時器中斷,輸出I/O口指向下一個輸出口。第2 次定時器定時時間結束后,將當前輸出引腳置低電平,設置此中斷周期為20ms 的1/8 減去正脈沖的時間,此路P W M 信號在該周期中輸出完畢,往復輸出。在每次循環(huán)的第16次(2 *8=16)中斷實行關定時中斷T0的操作,最后就可以實現(xiàn)8路(實際上六路就可以完成機

12、械臂的控制)舵機控制信號的輸出。但是從軟件系統(tǒng)的穩(wěn)定性和程序結構的合理性看,宜使用外部的計數(shù)器,還可以提高CPU 的工作效率。采用單片機和8253、8254 這樣的計數(shù)器芯片的PWM 信號產(chǎn)生電路是可靠的?;?253 產(chǎn)生PWM 信號的程序主要包括三方面內容:一是定義8253寄存器的地址,二是控制字的寫入,三是數(shù)據(jù)的寫入軟件。所以當系統(tǒng)需要產(chǎn)生多路P W M 信號時,使用上述方法可以減少電路降低成本,也可以達到較高的精度。調試時注意到由于程序中脈沖寬度的調整是靠調整定時器的初值,中斷程序也被分成了8個狀態(tài)周期,并且需要嚴格的周期循環(huán),而且運行其他中斷程序代碼的時間需要嚴格把握。在實際應用中,

13、采用51單片機簡單方便地實現(xiàn)了舵機控制需要的P W M 信號,對機器人舵機控制的測試表明舵機控制系統(tǒng)工作穩(wěn)定,P W M 占空比(0.52.5ms 的正脈沖寬度)和舵機的轉角(-90 90 )線性度較好。4、上位機上位機是指人可以直接發(fā)出控制命令的計算機,一般是PC。下位機是直接控制設備獲取設備狀況的計算機,一般是PLC/單片機之類的。上位機發(fā)出的命令首先給下位機,下位機再根據(jù)此命令解釋成相應時序信號直接控制相應設備。下位機不時讀取設備狀態(tài)數(shù)據(jù)(一般為模擬量),轉換成數(shù)字信號反饋給上位機。為了在短時間內完成上位機編程,我們使用C#來制作串口通訊上位機。C#(C Sharp)是微軟為.NET F

14、ramework量身訂做的程序語言,C#擁有C/C+的強大功能以及Visual Basic簡易使用的特性,是第一個組件導向的程序語言,和C+與Java一樣亦為對象導向程序語言。四、調試中遇到問題及解決方法在進行串口調試過程中,我們發(fā)現(xiàn)電腦經(jīng)常出現(xiàn)找不到串口的情況,無論重新安裝驅動,還是重新啟動,都只是維持很短暫的時間,然后又出現(xiàn)上述情況。經(jīng)檢查應該是硬件的問題,我們估計是單片機學習板的串口連接脫焊導致的。我們還發(fā)現(xiàn)學習板的P0及P5口被其他的原件占用,無法直接從這兩個口輸出PWM信號,所以控制機械臂的接口只能跳過這兩個,選用其他的。 在調試控制舵機時,因為最開始用的舵機已經(jīng)壞了,所以無論怎么調

15、試,舵機都無法轉動。拿到新的舵機后,我們最先用信號發(fā)生器產(chǎn)生脈沖信號,測試舵機轉動角度的范圍,發(fā)現(xiàn)并不是0-180,而是150度。雖然角度小了些,但還是能正常轉動的。作為初期的練習控制舵機,基本滿足要求,所以就沒再換新的。由于機械臂的配合及機械物件連接不連貫,經(jīng)常出現(xiàn)卡殼的狀況,我們經(jīng)過擰緊螺絲后,有所改善,但還是不夠理想,希望以后可以買到更好的硬件。在調試的過程中,發(fā)現(xiàn)舵機的扭矩不是很大,可能是因為舵機過多,電流太小,無法達到額定扭矩,所以電路最好是制作一個驅動電路,以提高機械臂性能。在進行程序調試時經(jīng)常會出現(xiàn)問題,這與我們對程序的學習不夠,有著直接的關系。在經(jīng)過我們組成員一個學期的努力下,

16、終于把程序完成,并不斷改進。五、個人體會及心得本學期我們組在進行項目研究方面花費了很長時間,同時也遇到了很多困難,也學到了很多。由于專業(yè)的差異,我們研究的范圍注定只局限于項目之內,即使這樣我們的進度也是不盡如人意。主要原因還是在編程方面,雖然我們組成員都過了二級,但是還缺乏實際的動手編程經(jīng)驗,還需要加強這方面的能力。和以前做作業(yè)不同,本學期的項目需要每個隊員的合作。有明確的分工,才會有效率,不能只等著別人。希望在下學期的努力學習下,能夠將我們組的項目成功的完成,學習到一些感興趣的知識,不給自己留下遺憾。單片機控制8路舵機程序:; T1 serial port to high T2 pwmPWM

17、OUT0BITP0.0PWMOUT1BITP0.1PWMOUT2BITP0.2PWMOUT3BITP0.3PWMOUT4BITP0.4PWMOUT5BITP0.5PWMOUT6BITP0.6PWMOUT7BITP0.7T2CONDATA0C8HTF2BITT2CON.7EXF2BITT2CON.6RCLKBITT2CON.5TCLKBITT2CON.4EXEN2BITT2CON.3TR2BITT2CON.2C_T2BITT2CON.1CP_RL2BITT2CON.0T2BITP1.0T2EXBITP1.1RCAP2LDATA0CAHRCAP2HDATA0CBHTL2DATA0CCHTH2DAT

18、A0CDHET2BITIE.5PT2BITIP.5/PWMWIDEQU048H; 16048H05FH ; First low 8bits then high 8bitschannelEQU032H;phaEQU033H;/ORG0000HLJMPMAINORG000BHLJMPT0_ISRORG002BHLJMPT2_ISRORG0100HMAIN:MOVSP, 60HMOV96H, #00HMOV8EH, #00H; InitSETB EA; enable interruptSETBET2CLR TCLKCLR RCLKMOV SCON, #050H; 8bit serialMOV TL2

19、, #000H MOV TH2, #000HMOV RCAP2L, #03CH; 2.5msMOV RCAP2H, #0F6HCLRTF2SETBTR2CLR ES; disable serial interruptCLR TI; clear serial FLAGMOV TMOD, #21HMOVTH0, #000H; make time for T0_ISR to runCLR TF0SETB ET0CLR TR0MOVTL1,#0F3HMOVTH1,#0F3HSETBTR1CLR AMOV pha,AMOVA, #035HMOVPWMWID+00H, AMOVPWMWID+02H, AM

20、OVPWMWID+04H, AMOVPWMWID+06H, AMOVPWMWID+08H, AMOVPWMWID+0AH, AMOVPWMWID+0CH, AMOVPWMWID+0EH, AMOVA, #0FAHMOVPWMWID+01H, AMOVPWMWID+03H, AMOVPWMWID+05H, AMOVPWMWID+07H, AMOVPWMWID+09H, AMOVPWMWID+0BH, AMOVPWMWID+0DH, AMOVPWMWID+0FH, A; CommunicationCOMMU:JNB RI, COMMUCLR RIMOV channel,SBUFMOV SBUF,c

21、hannelMOV A,channelJNB ACC.7, COMMUJBACC.6, COMMUJNB RI, $ANL channel, #07FHMOV A, #PWMWIDADD A, channelADDA, channelMOV R0, AMOVR1, SBUFCLRCMOVA, #0FFHSUBBA, R1; ADDCA, #12HMOVSBUF, AMOV R0, ACLRRIJNBRI, $MOVR1, SBUFMOVA, #0FFHSUBBA, R1INCR0MOVSBUF, AMOVR0, ACLR RISJMP COMMUT0_ISR:PUSHACCCLRTR0MOVA

22、,phaRLAMOVDPTR, #TABLEJMPA+DPTRTABLE:SJMPS0SJMPS1SJMPS2SJMPS3SJMPS4SJMPS5SJMPS6SJMPS7S0:CLRPWMOUT0POPACCRETIS1:CLRPWMOUT1POPACCRETIS2:CLRPWMOUT2POPACCRETIS3:CLRPWMOUT3POPACCRETIS4:CLRPWMOUT4POPACCRETIS5:CLRPWMOUT5POPACCRETIS6:CLRPWMOUT6POPACCRETIS7:CLRPWMOUT7POPACCRETIT2_ISR:CLRTF2PUSH ACCINC phaANL

23、pha, #07HMOVA,phaRLAMOVDPTR,#TABLE2JMPA+DPTRTABLE2:SJMPSS0SJMPSS1SJMPSS2SJMPSS3SJMPSS4SJMPSS5SJMPSS6SJMPSS7SS0:MOVTH0,PWMWID+01HMOVTL0,PWMWID+00HSETBPWMOUT0SETBTR0POPACCRETISS1:MOVTH0,PWMWID+03HMOVTL0,PWMWID+02HSETBPWMOUT1SETBTR0POPACCRETISS2:MOVTH0,PWMWID+05HMOVTL0,PWMWID+04HSETBPWMOUT2SETBTR0POPAC

24、CRETISS3:MOVTH0,PWMWID+07HMOVTL0,PWMWID+06HSETBPWMOUT3SETBTR0POPACCRETISS4:MOV TH0, PWMWID+09HMOV TL0, PWMWID+08HSETBPWMOUT4SETBTR0POPACCRETISS5:MOV TH0, PWMWID+0BHMOV TL0, PWMWID+0AHSETBPWMOUT5SETBTR0POPACCRETISS6:MOV TH0, PWMWID+0DHMOV TL0, PWMWID+0CHSETBPWMOUT6SETBTR0POPACCRETISS7:MOVTH0,PWMWID+0

25、FHMOVTL0,PWMWID+0EHSETBPWMOUT7SETBTR0POPACCRETIEND上位機程序(C#):using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Text;using System.Windows.Forms;namespace Cois public partial class Cois : Form private byte P = new byte4; private byte checker; pu

26、blic Cois() InitializeComponent(); private void Form1_Load(object sender, EventArgs e) init(); private void Message() throw new NotImplementedException(); private void init() GetPortName(); this.CBx_baud.Text = global:Cois.Properties.Settings.Default.BaudRate; private void GetPortName() string portN

27、ames = System.IO.Ports.SerialPort.GetPortNames(); CBx_port.Items.Clear(); foreach (string name in portNames) CBx_port.Items.Add(name); if (!CBx_port.Items.Contains(CBx_port.Text) try this.CBx_port.Text = (string)CBx_port.Items0; catch this.CBx_port.Text = global:Cois.Properties.Settings.Default.Port

28、Name; private void CBx_port_SelectedIndexChanged(object sender, EventArgs e) serialPort.PortName = CBx_port.Text; private void CBx_baud_SelectedIndexChanged(object sender, EventArgs e) serialPort.BaudRate =Convert.ToInt32( CBx_baud.Text); private void write(int number) byte CMD = new byte3; CMD0 = (

29、byte)number; CMD0 |= (byte)0x80; switch(number) case 0: CMD1 = (byte) (Servo0.Value+17)%256); CMD2 = (byte)(Servo0.Value +17)/ 256); serialPort.Write(CMD, 0, 3); break; case 1: CMD1 = (byte)(Servo1.Value+17)%256); CMD2 = (byte)(Servo1.Value+17) / 256); serialPort.Write(CMD, 0, 3); break; case 2: CMD

30、1 = (byte)(Servo2.Value+17)%256); CMD2 = (byte)(Servo2.Value +17)/ 256); serialPort.Write(CMD, 0, 3); break; case 3: CMD1 = (byte)(Servo3.Value+17)%256); CMD2 = (byte)(Servo3.Value+17) / 256); serialPort.Write(CMD, 0, 3); break; case 4: CMD1 = (byte)(Servo4.Value+17)%256); CMD2 = (byte)(Servo4.Value

31、+17) / 256); serialPort.Write(CMD, 0, 3); break; case 5: CMD1 = (byte)(Servo5.Value+17)%256); CMD2 = (byte)(Servo5.Value+17) / 256); serialPort.Write(CMD, 0, 3); break; case 6: CMD1 = (byte)(Servo6.Value+17)%256); CMD2 = (byte)(Servo6.Value+17) / 256); serialPort.Write(CMD, 0, 3); break; case 7: CMD

32、1 = (byte)(Servo7.Value+17)%256); CMD2 = (byte)(Servo7.Value+17) / 256); serialPort.Write(CMD, 0, 3); break; private void Btn_connect_Click(object sender, EventArgs e) if (serialPort.IsOpen) Btn_connect.Text = Unconnected; Btn_connect.CheckState = System.Windows.Forms.CheckState.Unchecked; serialPor

33、t.Close(); else try serialPort.Open(); catch Btn_connect.CheckState = System.Windows.Forms.CheckState.Unchecked; if (serialPort.IsOpen) Btn_connect.Text = Connected; Btn_connect.CheckState = System.Windows.Forms.CheckState.Checked; write(0); write(1); write(2); write(3); write(4); write(5); write(6)

34、; write(7); private void CBx_port_DropDown(object sender, EventArgs e) GetPortName(); private void Servo0_MouseUp(object sender, MouseEventArgs e) /if (serialPort.IsOpen) write(0); private void Servo1_MouseUp(object sender, MouseEventArgs e) /if (serialPort.IsOpen) write(1); private void Servo2_MouseUp(object sender, MouseEventArgs e) /if (serialPort.IsOpen) write(2); private void Servo3_MouseUp(object sender, MouseEventArgs e) /if (seria

溫馨提示

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

最新文檔

評論

0/150

提交評論