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

          關(guān) 閉

          新聞中心

          EEPW首頁(yè) > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > 一種多視覺(jué)傳感器控制系統(tǒng)的實(shí)現(xiàn)

          一種多視覺(jué)傳感器控制系統(tǒng)的實(shí)現(xiàn)

          作者: 時(shí)間:2011-09-07 來(lái)源:網(wǎng)絡(luò) 收藏
          5.2 CAN節(jié)點(diǎn)的軟件設(shè)計(jì)

          本文引用地址:http://www.ex-cimer.com/article/161509.htm

            CAN總線智能節(jié)點(diǎn)的軟件設(shè)計(jì)主要包括三個(gè)部分:CAN節(jié)點(diǎn)初始化、報(bào)文發(fā)送和報(bào)文接收。CAN節(jié)點(diǎn)的通訊實(shí)質(zhì)上就是對(duì)CAN控制器內(nèi)部各寄存器進(jìn)行讀寫(xiě),由于這些寄存器或發(fā)送、接收緩沖器均有確定的地址,CPU可通過(guò)外設(shè)訪問(wèn)指令對(duì)它們進(jìn)行讀寫(xiě)操作。系統(tǒng)上電復(fù)位后,CPU對(duì)SJA1000的各個(gè)控制寄存器寫(xiě)入相應(yīng)控制字信息,以完成CAN控制器的初始化。本例中,系統(tǒng)軟件采用結(jié)構(gòu)化程序設(shè)計(jì)方法,程序具有較好的模塊性和可移植性,對(duì)于不同的檢測(cè)系統(tǒng)和應(yīng)用環(huán)境,可以方便地進(jìn)行程序重組。編程語(yǔ)言采用單片機(jī)C語(yǔ)言Keil C51,它具有較高的效率,可讀性好,能夠有效減輕系統(tǒng)軟件編程的工作量。

            CAN總線通訊的成功與否重點(diǎn)是SJA1000的初始化設(shè)置,初始化程序通過(guò)將CAN控制器的寄存器寫(xiě)入控制字,確定CAN的工作方式。用P89C668的P2.7作為片選信號(hào)與SJA1000的CS引腳相連,SJA1000的片內(nèi)寄存器和P89C668單片機(jī)寄存器是重疊編址的,因此SJA1000寄存器尋址時(shí)要定義成片外RAM尋址。下面給出了CAN節(jié)點(diǎn)的初始化程序:

            Init_Can (void)

            { MODE = 0x09; file://進(jìn)入復(fù)位模式,對(duì)SJA1000進(jìn)行初始化;

            CDR = 0x88; file://選擇PeliCan;

            CMR = 0x0C; file://清除數(shù)據(jù)溢出和釋放接收緩沖器;

            IER = 0x03; file://開(kāi)放接收中斷和發(fā)送中斷;

            ACR0 = 0x66;

            ACR1 = 0x66;

            ACR2 = 0x66;

            ACR3 = 0x66; file://根據(jù)具體的協(xié)議定義設(shè)置驗(yàn)收碼寄存器;

            AMR0 = 0xFF;

            AMR1 = 0xFF;

            AMR2 = 0xFF;

            AMR3 = 0xFF; file://根據(jù)具體的協(xié)議定義設(shè)置驗(yàn)收屏蔽寄存器;

            BTR0 = 0x41;

            BTR1 = 0x1B; file://12MHz晶振下,設(shè)置波特率為200kbps;

            OCR = 0XAA;

            EWLR =0x60;

            RBSA = 0x00; file://RX緩存器起始地址寄存器設(shè)置為0;

            TXERR= 0x00; file://發(fā)送錯(cuò)誤接收器設(shè)置為0;

            ECC =0x00; ?

            MODE= 0x08; file://單向?yàn)V波方式,進(jìn)入正常模式,初始化完畢;

            由于測(cè)控系統(tǒng)要進(jìn)行檢測(cè)多為在線檢測(cè),實(shí)時(shí)性要求較強(qiáng),這里各節(jié)點(diǎn)采用中斷接收方式接收上位機(jī)的控制命令,節(jié)點(diǎn)初始化后,當(dāng)一幀信息經(jīng)過(guò)出錯(cuò)檢測(cè)確認(rèn)為正確信息后裝入接收緩沖器,SJA1000的INT腳會(huì)產(chǎn)生中斷信號(hào),該信號(hào)連接到單片機(jī)P89C668的外邊中斷0引腳,在外部中斷0中斷處理程序中判別該信息的標(biāo)志符如果是本節(jié)點(diǎn)地址,便讀出接收緩沖器的數(shù)據(jù)并保存在RAM中,中斷接收程序框圖如下:

            系統(tǒng)中發(fā)送報(bào)文采用查詢方式,節(jié)點(diǎn)在收到主控機(jī)的數(shù)據(jù)請(qǐng)求命令后發(fā)送數(shù)據(jù),發(fā)送模塊首先進(jìn)行狀態(tài)查詢,判定總線是否空閑,如空閑,則將目的節(jié)點(diǎn)地址寫(xiě)入發(fā)送標(biāo)志符寄存器,數(shù)據(jù)寫(xiě)入發(fā)送緩沖器,完成一幀CAN信息發(fā)送。

            CAN信息格式分為信息和數(shù)據(jù)兩部分,頭兩個(gè)字節(jié)是信息部分,其前11位為標(biāo)志符,標(biāo)志符的前八位用作接收判斷,應(yīng)包含本信息包的目的節(jié)點(diǎn)地址,然后是一位RTR位(0為數(shù)據(jù)幀,1為遠(yuǎn)程幀,本例使用數(shù)據(jù)幀),最后是四位的DLC。其余八個(gè)字節(jié)為是數(shù)據(jù)部分,存有實(shí)際要發(fā)送的數(shù)據(jù)。本例中只用到前兩個(gè)數(shù)據(jù),第一個(gè)表示傳感器地址,第二個(gè)字節(jié)表示選擇傳感器里的兩路攝像機(jī)中的哪一路采集圖像。

            CAN節(jié)點(diǎn)之間通訊成功的另一個(gè)關(guān)鍵是波特率的設(shè)置,不僅CAN總線上的各下位機(jī)節(jié)點(diǎn)要設(shè)置相同的波特率,總線與上位PC機(jī)相連的USBCAN接口卡也要有相同的波特率,這樣才能保證通訊暢通。由于USBCAN接口卡內(nèi)的CAN控制器SJA1000用的是16M晶振,而各傳感器節(jié)點(diǎn)內(nèi)的SJA1000與P89C668使用12M晶振,因此對(duì)于不同的通訊速率一定要計(jì)算出兩種晶振都相一致的BTR0、 BTR1來(lái)設(shè)置總線波特率。

            6 結(jié)束語(yǔ)

            本文主要著重于多傳感器的設(shè)計(jì)研究,目前系統(tǒng)軟硬件已初步調(diào)試完成,并能做到各個(gè)視覺(jué)傳感器的快速切換傳輸視頻圖像,且切換是圖像抖動(dòng)較小,效果較好。本系統(tǒng)的精度主要由硬件決定,選用高精度、高分辨力的CCD攝像機(jī)和激光器,激光器投射出的線結(jié)構(gòu)光越細(xì)光強(qiáng)分布越均勻,則測(cè)量精度越高。


          上一頁(yè) 1 2 3 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(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); })();