新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > AVR單片機(jī)的CAN總線分析儀設(shè)計(jì)

        AVR單片機(jī)的CAN總線分析儀設(shè)計(jì)

        作者: 時(shí)間:2013-11-12 來(lái)源:網(wǎng)絡(luò) 收藏

        AVR單片機(jī)的CAN總線分析儀設(shè)計(jì)

        圖6 自適應(yīng)波特率流程

        3.3 報(bào)文接收

          CAN報(bào)文的接收有2種方式,分別為查詢的方式和中斷的方式。

          查詢的方式是MCU以一定周期讀取CAN控制器的狀態(tài)寄存器,檢查接收緩沖區(qū)狀態(tài)標(biāo)志是否至少接收到1個(gè)報(bào)文。接收緩沖區(qū)狀態(tài)指示為“空”,表示沒(méi)有接收到報(bào)文,MCU繼續(xù)當(dāng)前的任務(wù)。當(dāng)接收緩沖區(qū)狀態(tài)標(biāo)志指示為“滿”,表示已接收至少1個(gè)報(bào)文,MCU從控制器取出報(bào)文,并寫命令釋放接收緩沖區(qū)標(biāo)志。查詢方式的不足是: 查詢周期如果過(guò)短,就會(huì)使MCU大部分時(shí)間運(yùn)行在報(bào)文的接收查詢上,使其效率降低;若查詢周期過(guò)長(zhǎng),由于接收緩沖區(qū)的長(zhǎng)度有限會(huì)造成數(shù)據(jù)溢出,導(dǎo)致系統(tǒng)不能正常工作。

          中斷的方式是主程序在中斷控制的報(bào)文接收之前使能接收中斷和MCU的全局中斷。當(dāng)控制器已接收1個(gè)報(bào)文,該報(bào)文通過(guò)驗(yàn)收濾波器并放入接收緩沖區(qū),則產(chǎn)生接收中斷。這樣MCU能夠立即響應(yīng),處理這個(gè)接收到的報(bào)文,然后釋放接收緩沖區(qū)。整個(gè)接收的過(guò)程可在中斷服務(wù)程序中完成,不需要與主程序發(fā)生交互作用。中斷方式可以避免查詢方式的不足,增強(qiáng)系統(tǒng)的可靠性。所以在設(shè)計(jì)報(bào)文接收時(shí)選擇中斷方式進(jìn)行報(bào)文的接收。圖7為報(bào)文接收流程。

        AVR單片機(jī)的CAN總線分析儀設(shè)計(jì)

        圖7 報(bào)文接收流程

        3.4 總線狀態(tài)計(jì)算

          CAN分析儀主要的功能就是分析CAN總線上的各種總線參數(shù),從而給使用者提供一個(gè)透明的窗口來(lái)觀測(cè)總線的運(yùn)行狀況。CAN 總線協(xié)議屬于較為高級(jí)的現(xiàn)場(chǎng)總線協(xié)議, 工作過(guò)程較為復(fù)雜。從工程實(shí)用的角度看,以下性能參數(shù)具有較高的參考價(jià)值:

          ◆ 總線波特率,也叫做總線位速率,表示每秒鐘傳送信息位的數(shù)量,只有網(wǎng)絡(luò)中各節(jié)點(diǎn)的波特率相一致時(shí)才能夠進(jìn)行正常的報(bào)文收發(fā)。

          ◆ 總線吞吐量,總線單位時(shí)間內(nèi)傳送的報(bào)文總數(shù)。

          ◆ 總線出錯(cuò)率,總線單位時(shí)間的錯(cuò)誤報(bào)文數(shù)。

          ◆ 總線負(fù)載,每秒鐘節(jié)點(diǎn)發(fā)送的位數(shù)與總線波特率之比。

        除此之外,為了更方便地檢查總線狀態(tài),又增添了顯示功能,可以顯示接收?qǐng)?bào)文、狀態(tài)寄存器、報(bào)文總數(shù)、報(bào)文計(jì)數(shù)器、錯(cuò)誤代碼等。總線分析軟件程序中所采用的算法簡(jiǎn)述如下。

          (1) 總線吞吐量的測(cè)試

          首先設(shè)定計(jì)數(shù)器i=0,定時(shí)器時(shí)間t=0,測(cè)量值數(shù)組count[5]={0}。當(dāng)接收到總線上的1個(gè)報(bào)文并釋放接收緩沖區(qū)時(shí)啟動(dòng)定時(shí)器,設(shè)定定時(shí)時(shí)間t=5 s,等待定時(shí)中斷發(fā)生。計(jì)數(shù)器放在接收中斷函數(shù)中,當(dāng)成功接收1幀報(bào)文時(shí),i=i+1。定時(shí)器中斷發(fā)生時(shí),將計(jì)數(shù)器的值i存入count[5]數(shù)組中。之后啟動(dòng)下一次定時(shí),當(dāng)數(shù)組滿時(shí),結(jié)束測(cè)試,對(duì)count數(shù)組進(jìn)行排序,并去除最大和最小值。總線吞吐量V為:

        AVR單片機(jī)的CAN總線分析儀設(shè)計(jì)

        (2) 總線負(fù)載的測(cè)試

          通過(guò)之前的自適應(yīng)波特率程序已經(jīng)檢測(cè)到總線上的波特率為bote,設(shè)定計(jì)數(shù)器j=1,定時(shí)器t=0,報(bào)文位數(shù)設(shè)為c1=0,報(bào)文位數(shù)數(shù)組bit_count[20]={0}。當(dāng)接收到總線上的1個(gè)報(bào)文并釋放接收緩沖區(qū)時(shí)啟動(dòng)定時(shí)器,設(shè)定定時(shí)時(shí)間t=1 s,等待定時(shí)中斷發(fā)生。報(bào)文位數(shù)、報(bào)文位數(shù)數(shù)組和計(jì)數(shù)器放在接收中斷函數(shù)中。當(dāng)成功接收1幀數(shù)據(jù)時(shí),j=j+1,通過(guò)讀取接收幀信息SFF可以判定該幀數(shù)據(jù)有多少位,將位數(shù)寫入c1,并存入bit_count[20]數(shù)組中。定時(shí)時(shí)間到時(shí),拷貝計(jì)數(shù)器值,結(jié)束測(cè)試。總線負(fù)載U為:

        AVR單片機(jī)的CAN總線分析儀設(shè)計(jì)

        3.5 實(shí)驗(yàn)結(jié)果

          為了便于測(cè)試分析儀的有效性和準(zhǔn)確性,取單節(jié)點(diǎn)進(jìn)行實(shí)驗(yàn),即總線上只有1個(gè)節(jié)點(diǎn)在進(jìn)行報(bào)文發(fā)送。分別取波特率5 kbps、10 kbps、50 kbps、100 kbps,發(fā)送報(bào)文時(shí)間間隔100 ms、150 ms、200 ms、250 ms、400 ms、450 ms、500 ms、800 ms,每幀報(bào)文有8字節(jié)數(shù)據(jù)域。實(shí)驗(yàn)得到的結(jié)果如表1所列。

        表1 實(shí)驗(yàn)結(jié)果

        AVR單片機(jī)的CAN總線分析儀設(shè)計(jì)

        從實(shí)驗(yàn)結(jié)果可以看出,當(dāng)每100 ms發(fā)送1幀報(bào)文時(shí),檢測(cè)到的總線吞吐量為10幀/s,即總線每秒傳送的報(bào)文總數(shù)為10幀,與實(shí)際相符。在不同的報(bào)文發(fā)送間隔和不同的總線波特率下,所測(cè)得的總線吞吐量和總線負(fù)載與實(shí)際相吻合。

        4 結(jié)論

          本文設(shè)計(jì)的在實(shí)驗(yàn)室和工業(yè)現(xiàn)場(chǎng)上進(jìn)行了調(diào)試,主要調(diào)試的項(xiàng)目包括自適應(yīng)波特率、液晶顯示和CAN總線通信監(jiān)測(cè)等。實(shí)踐證明該設(shè)計(jì)實(shí)現(xiàn)了對(duì)CAN2.0B標(biāo)準(zhǔn)節(jié)點(diǎn)(并兼容CAN2.0A節(jié)點(diǎn))監(jiān)測(cè)分析的功能,指標(biāo)達(dá)到預(yù)期的效果。為CAN總線的工程開(kāi)發(fā)應(yīng)用和教學(xué)提供了一種簡(jiǎn)潔、高效的調(diào)試和監(jiān)測(cè)手段。


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

        關(guān)鍵詞: AVR單片機(jī) CAN總線分析儀 ATmega64L SJA1000T

        評(píng)論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 三台县| 金湖县| 湖南省| 青浦区| 盘锦市| 江门市| 河间市| 乐陵市| 屯门区| 伊金霍洛旗| 历史| 大安市| 邵东县| 西华县| 湛江市| 全椒县| 东海县| 东乡| 大足县| 淮滨县| 开原市| 三江| 广水市| 东台市| 桓仁| 武冈市| 南通市| 永德县| 全椒县| 城口县| 陈巴尔虎旗| 墨脱县| 武乡县| 清水县| 宜春市| 永川市| 固原市| 通道| 黄骅市| 宣武区| 辽源市|