<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)在小型自控飛艇的舵機(jī)控制系統(tǒng)中的重要性介紹

          單片機(jī)在小型自控飛艇的舵機(jī)控制系統(tǒng)中的重要性介紹

          作者: 時(shí)間:2013-01-18 來源:網(wǎng)絡(luò) 收藏

            本文采用了中斷服務(wù)程序就地幀識(shí)別技術(shù),即省掉緩沖區(qū),數(shù)據(jù)接收、幀識(shí)別均由中斷服務(wù)程序完成,之后在主程序的循環(huán)中完成數(shù)據(jù)的提取和處理。就地幀識(shí)別技術(shù)的實(shí)現(xiàn)機(jī)理如下:把中斷服務(wù)程序看作是一個(gè)處理機(jī),串行數(shù)據(jù)逐字節(jié)到來,程序先從數(shù)據(jù)序列中等到第一個(gè)幀頭,寫入該幀的存儲(chǔ)數(shù)組,同時(shí)置標(biāo)志位 flag1,接收狀態(tài)推進(jìn)一步;再判斷下一次中斷時(shí),來到的數(shù)據(jù)是否符合第二個(gè)幀頭的特征。如果符合則存入相應(yīng)數(shù)組,并置相應(yīng)的標(biāo)志位flag2,接收狀態(tài)繼續(xù)推進(jìn);如果幀頭兩個(gè)字節(jié)均符合,則將后面來到的數(shù)據(jù)依次存入指定數(shù)組;根據(jù)已接收到的字節(jié)數(shù)判斷,當(dāng)符合該幀的數(shù)據(jù)部分接收完畢后,判斷下一字節(jié)是否為幀尾的第一個(gè)字節(jié),如果是則置標(biāo)志位flag3;之后依據(jù)同樣的方法判斷幀尾第二個(gè)字節(jié)是否來到,如果已接收到,則置該幀數(shù)據(jù)已完整接收到標(biāo)志 flag4,同時(shí)接收狀態(tài)歸零,重新開始等待幀頭字符。在幀頭幀尾判斷期間,一旦有一項(xiàng)不符合要求,則將接收狀態(tài)歸零,以重新開始等待幀頭。主程序每循環(huán)一次便對(duì)“幀完整接收到”標(biāo)志進(jìn)行一次判斷,若為真則調(diào)用相應(yīng)的數(shù)據(jù)提取子程序,并清flag4。

            串行中斷服務(wù)程序流程如圖2所示。采用中斷服務(wù)程序就地幀識(shí)別技術(shù)的優(yōu)點(diǎn)在于數(shù)據(jù)接收后立即進(jìn)行幀識(shí)別,省去了對(duì)緩沖區(qū)的管理工作,減少了存取次數(shù),因而節(jié)省了大量的時(shí)間,極大地提高了接收程序的實(shí)時(shí)性。同時(shí)錯(cuò)幀和斷幀被自動(dòng)丟棄,不再占用資源。

           串行中斷服務(wù)程序流程

            圖2中各標(biāo)志位含義為:

            flag1——接收到幀頭Head1標(biāo)志;

            flag2——接收到完整幀頭標(biāo)志;

            flag3——接收到幀尾End1標(biāo)志;

            flag4——接收到完整幀標(biāo)志。

            (2)多機(jī)通訊

            在舵控系統(tǒng)設(shè)計(jì)中,各部分間的通訊是設(shè)計(jì)的重要內(nèi)容,其中主要包括與上位PC機(jī)間的通訊和與單片機(jī)之間的通訊。在舵控系統(tǒng)中,主單片機(jī)1與上位PC機(jī)通訊是通過單片機(jī)自帶的一路異步串行通訊接口完成的;而主單片機(jī)1通過其P1口向主單片機(jī)2傳輸數(shù)據(jù),這里不再贅述,重點(diǎn)介紹主單片機(jī)2如何通過其一路串口分別向下位的多個(gè)舵控單片機(jī)傳送指令。

            此系統(tǒng)中,主單片機(jī)2作為主機(jī),m個(gè)舵控單片機(jī)作為從機(jī),在主機(jī)與從機(jī)的通訊過程中,串口控制寄存器中SCON中的SM2位發(fā)揮了重要作用。當(dāng)其中一個(gè)舵控單片機(jī)(89C2051)的SM2位為1時(shí),該單片機(jī)只接收地址幀,對(duì)數(shù)據(jù)幀不理睬;而當(dāng)SM2位為0時(shí),該單片機(jī)接收所有發(fā)來的消息。具體通信過程如下:

            ①首先將主、從單片機(jī)工作方式選為模式3,所有從機(jī)的SM2位開始置1,處于只接收地址幀狀態(tài)。

           ?、谥鳈C(jī)接收主單片機(jī)1發(fā)來的數(shù)據(jù)幀,從中提出數(shù)據(jù)部分(m個(gè)字節(jié)的指令對(duì)應(yīng)m個(gè)舵控單片機(jī)),根據(jù)序號(hào)在控制指令字節(jié)前加上一個(gè)字節(jié)的地址信息。然后主機(jī)依次通過串口向下發(fā)送各舵控單片機(jī)的地址字節(jié)和數(shù)據(jù)字節(jié)。發(fā)送一幀地址信息,包含8位地址,第9位為1,表示發(fā)送的幀為地址幀。

           ?、蹚臋C(jī)接收地址幀后,進(jìn)入中斷,將發(fā)來的地址與自身比較;地址一致的從機(jī)就是被尋址的從機(jī),它清除SM2位,接收主機(jī)發(fā)來的所有后續(xù)幀信息(數(shù)據(jù)信息)。未尋址的所有其他從機(jī)仍維持SM2=1,對(duì)主機(jī)發(fā)來的數(shù)據(jù)幀不理睬,直到發(fā)來新地址幀;之后在下一次中斷時(shí)被尋址的從機(jī)接收主機(jī)發(fā)來的數(shù)據(jù)信息(第9位為 0)。

            需要注意的是,如果對(duì)已經(jīng)尋址的從機(jī)再發(fā)送地址幀,則該從機(jī)SM2=1,恢復(fù)初始狀態(tài),和其他從機(jī)競(jìng)爭(zhēng)。

            3.2 軟件設(shè)計(jì)中的關(guān)鍵問題

            (1)數(shù)據(jù)幀的串口接收及識(shí)別技術(shù)

            在舵控系統(tǒng)中,數(shù)據(jù)以二進(jìn)制信息幀的格式進(jìn)行傳遞。每個(gè)信息幀從標(biāo)題開始都有固定的幀頭、幀尾,且長(zhǎng)度固定,其基本數(shù)據(jù)格式如表1所示。

          單片機(jī)在小型自控飛艇的舵機(jī)控制系統(tǒng)中的重要性介紹

            在該舵控系統(tǒng)的設(shè)計(jì)中,串行通訊占有很重要的地位,如艇載計(jì)算機(jī)與主單片機(jī)1之間的通訊過程。下面以主單片機(jī)1的串口接收程序?yàn)槔?,?duì)串行通訊的實(shí)現(xiàn)過程加以說明。

            在串行通信中,接收程序的任務(wù)是數(shù)據(jù)接收、幀識(shí)別和信息提取。常規(guī)的設(shè)計(jì)方法是設(shè)置一個(gè)比較大的緩沖區(qū)。串行接收中斷服務(wù)程序負(fù)責(zé)把接收到的數(shù)據(jù)壓入緩沖區(qū),當(dāng)緩沖區(qū)的數(shù)據(jù)足夠多時(shí),再由主程序調(diào)用一個(gè)幀識(shí)別和解碼子程序?qū)彌_區(qū)中的數(shù)據(jù)進(jìn)行處理。這種方法的好處是中斷服務(wù)程序比較短,不足之處為從一幀數(shù)據(jù)接收完畢到解碼時(shí)間較長(zhǎng),另外對(duì)緩沖區(qū)進(jìn)行管理需要占用大量的的CPU時(shí)間,因而實(shí)時(shí)性較差,此處不宜使用。



          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();