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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于ARM的分布式干擾機控制單元設(shè)計

          基于ARM的分布式干擾機控制單元設(shè)計

          作者: 時間:2016-09-12 來源:網(wǎng)絡(luò) 收藏

          在圖形界面編程中,多數(shù)時候需要對某些“事件”進行處理。例如,當用戶點擊某個按鈕時,應(yīng)用程序便開始執(zhí)行某種操作。在開發(fā)中,通過一種被稱為“信號和槽”的機制來實現(xiàn)對象間的通訊。信號和槽機制,即當一個特定事件發(fā)生時,一個或幾個被指定的信號就被發(fā)射;槽即一個返回值為void的函數(shù),如果存在一個或幾個槽和該信號相連接,那么在該信號被發(fā)射后,這個(些)槽(函數(shù))就會立刻被執(zhí)行。

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

          由于設(shè)計的控制單元采用大尺寸觸摸屏,而觸摸屏性能的調(diào)試是個重要問題,因為電磁噪聲的緣故,觸摸屏容易存在點擊不準確、抖動等問題。因此一般都要移植一個tslib來配合,在用戶層對觸摸屏的數(shù)據(jù)進行濾波和矯正,同時也可給應(yīng)用程序一個統(tǒng)一接口。tslih能為觸摸屏驅(qū)動獲得的采樣提供諸如濾波、去抖、校準等功能,通常作為觸摸屏驅(qū)動的適配層,為上層的應(yīng)用提供了一個統(tǒng)一接口。在PC端的界面設(shè)計完成后,后期修改流程如圖6所示。

          基于ARM的分布式干擾機控制單元設(shè)計

          經(jīng)過上述步驟,將編譯好的可執(zhí)行文件拷貝至開發(fā)板的opt/opia/bin目錄下,將.desktop桌面文件拷貝至opt/opia/apps/Application目錄下。重啟開發(fā)板,就可以在觸屏的桌面應(yīng)用上看到編寫的應(yīng)用程序圖標,點擊運行就可以初步看到效果。

          3 軟件功能設(shè)計

          通過以上工作,可以在開發(fā)板上看到整體的界面效果,但要實現(xiàn)該控制單元的功能,還需要在界面程序中添加和修改代碼。

          3.1 參數(shù)設(shè)置及數(shù)據(jù)的發(fā)送

          首先對所要發(fā)送的數(shù)據(jù)進行采集并打包。在發(fā)送數(shù)據(jù)之前,還需對已開發(fā)成功的做配置。在發(fā)送數(shù)據(jù)時,有4種模式可供選擇:(1)CPOL=0,CPHA=0。(2)CPOL=0,CPH A=1。(3)CPOL=1,CPHA=0。(4)CPOL=1,CPHA=1。4種情況分別為MODE0、MODE1、MODE2、MODE3,其中CPOL指時鐘信號的極性,表示當時鐘信號空閑時,其電平值為低電平0或高電平1。CPOL=0,時鐘空閑時為低電平,所以當時鐘信號有效時,即為高電平;CPOL=1,時鐘空閑時為高電平,所以當時鐘信號有效時,即為低電平。CPHA指時鐘信號的相位,對應(yīng)著數(shù)據(jù)采樣是在第幾個邊沿(edge),是第一個邊沿還是第二個邊沿,0對應(yīng)第一個邊沿,1對應(yīng)第二個邊沿。

          基于ARM的分布式干擾機控制單元設(shè)計

          在本干擾機控制單元通信協(xié)議中,是采用模式MODE3。除了要對發(fā)送數(shù)據(jù)的模式設(shè)置之外,還要設(shè)置SPI模式可寫可讀、SPI的bit/word可寫可讀、SPI的波特率可寫可讀等。將參數(shù)設(shè)置完成后,按照通信協(xié)議的約定,將界面信息對應(yīng)成相應(yīng)的數(shù)據(jù),每8 bit為一組,每個word共16 bit進行發(fā)送即可。

          3.2 SD卡存儲功能的設(shè)計

          在實際使用中,有時需要對設(shè)置的某些重要信息進行保存,所以利用Qt中的兩個易于合并使用的類:QFile和QDataStrcam。QFile對象表示磁盤上可讀取和寫入的文件。QFile是代表多種不同設(shè)備且應(yīng)用更廣的QIODevice類的子類。QDataStream對象用于按順序排列二進制數(shù)據(jù),以便儲存在QIODevice中并供以后檢索。讀取或?qū)懭隥IOD evice就如同打開數(shù)據(jù)流,然后讀取或?qū)懭胍粯雍唵?,只是參?shù)為不同的設(shè)備。

          3.3 定時功能的設(shè)計

          對于實際使用中的干擾機控制單元,需要發(fā)送干擾數(shù)據(jù)時,在界面上進行相應(yīng)設(shè)置,即可直接發(fā)送。但是更多時候需要做的是讀取并顯示干擾機從環(huán)境中測到的數(shù)據(jù),可以通過點擊界面上的更新按鈕,但是無法實時更新,所以這里設(shè)計一個能夠定時自動更新界面信息功能是必要的。定時功能主要利用Qt中的QTimmer類,其核心程序如下:

          基于ARM的分布式干擾機控制單元設(shè)計

          除此之外,在整個程序中的某些功能函數(shù)中,還要加上internalTimer→stop();這行令定時器關(guān)閉的代碼,原因是在有些界面參數(shù)進行設(shè)置后或讀取并顯示后,暫時無需定時讀取功能,所以就需關(guān)閉定時功能,待需要時再通過internalTimer→start(autostartTime)打開定時器即可。

          基于ARM的分布式干擾機控制單元設(shè)計

          當整個程序的功能全部設(shè)計完成后,進行整體測試,流程如圖8所示,開機后,ARM會自動啟動干擾機控制單元界面,并開始計時。當定時時間到,ARM單元會讀取FPGA中的主從裝置標志位并進行顯示,若讀到從機,則將FPGA中的信息顯示到界面中;若為主機,直接讀取FPGA延遲量更新標志位。若為更新,則表示FPGA有新信息,需要點擊設(shè)置將當前界面更新為最新參數(shù),然后開始重新計時。

          3.4 運行測試

          對設(shè)計好的控制單元進行測試,按照與FPGA的通信協(xié)議,ARM界面信息轉(zhuǎn)化為數(shù)據(jù)后,每8位一組,兩組為一個信息單元進行傳送。反之,當FPGA對ARM發(fā)送數(shù)據(jù)時同理對數(shù)據(jù)進行解析。利用FPGA的邏輯分析儀對發(fā)送與接收的數(shù)據(jù)進行采樣,結(jié)果如下圖9所示。

          基于ARM的分布式干擾機控制單元設(shè)計

          圖9中,SCLK_BUF為時鐘信號,每8個時鐘脈沖為一個時鐘周期;SDI為ARM發(fā)送的數(shù)據(jù),SD0為ARM接收的數(shù)據(jù);ADDR_SPI與DATA_SPI為ARM發(fā)送數(shù)據(jù)的低8位與高8位。從圖中可以看出,ARM端發(fā)送的數(shù)據(jù)依次為00h,00h,01h,00h,02h,00h,03h,00h……。在FPGA一端,收到的數(shù)據(jù)同樣是00h,00h,01h,00h,02h,00h,03h,00h……,其中ADDR_ SPI的數(shù)據(jù)就是收到數(shù)據(jù)的奇數(shù)項,其中DATA_SPI的數(shù)據(jù)就是收到數(shù)據(jù)的偶數(shù)項。同時,在第3個有效脈沖周期到達時,ARM控制單元接收到來自FPGA的數(shù)據(jù),這個數(shù)據(jù)解析后反映到ARM界面即為裝置屬性選項,界面會自動響應(yīng)將裝置屬性選項設(shè)置為主裝置。



          關(guān)鍵詞: ARM 分布式干擾機 Fedora SPI Qt

          評論


          相關(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); })();