色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于USB的pH值控制器數(shù)據(jù)通訊的實(shí)現(xiàn)

          基于USB的pH值控制器數(shù)據(jù)通訊的實(shí)現(xiàn)

          作者: 時(shí)間:2011-06-28 來源:網(wǎng)絡(luò) 收藏

          1.引言:   

          在糖提煉過程中,糖廠澄清工段的 PH值控制對(duì)糖的純度和生產(chǎn)成本起著決定性的作用?;?ATMEL公司的 AT91M55800的嵌入式控制器就是自動(dòng)檢測(cè)控制澄清工段的 pH值,克服了以往手工操作 pH值波動(dòng)較大的缺點(diǎn)。

          本文介紹的是 和上位機(jī)在現(xiàn)場的 pH值數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn),采用 通訊方式,主要因?yàn)?具有以下優(yōu)點(diǎn):   

          用戶使用方便。設(shè)備自動(dòng)識(shí)別,自動(dòng)安裝驅(qū)動(dòng)程序和配置。

          應(yīng)用范圍廣。傳輸速率快,總線支持同步和異步傳輸方式。

          靈活。支持不同速率的設(shè)備。

          穩(wěn)定。協(xié)議中包含錯(cuò)誤檢測(cè),支持熱插拔。

          易于與 PC接口。支持即插即用。

          成本低廉。

          選用的 芯片是 PHILIPS公司成熟且價(jià)格低廉的 PDIUSBD12。整套方案要解決的工作主要有三個(gè)部分,一是 AT91M55800上 USB固件程序的設(shè)計(jì);二是上位機(jī) USB驅(qū)動(dòng)程序的編寫;三是上位機(jī)數(shù)據(jù)傳輸應(yīng)用軟件的實(shí)現(xiàn)。圖 2為 PDIUSBD12的硬件連接原理圖。

          2.USB固件程序編寫固件程序的一個(gè)最主要的目的就是讓 Windows可以檢測(cè)和識(shí)別設(shè)備,此外,它還完成數(shù)據(jù)的傳輸和根據(jù)不同的需求而進(jìn)行一些控制和處理的任務(wù)。固件程序主要包括三部分:a)初始化 AT91M55800和所有的外圍電路(包括 PDIUSBD12);b)主循環(huán)部分;c)中斷服務(wù)程序。 PDIUSBD12的固件由中斷驅(qū)動(dòng),當(dāng) CPU處理前臺(tái)任務(wù)時(shí),USB的傳輸可在后臺(tái)進(jìn)行。這確保了最佳的傳輸速率和更好的軟件結(jié)構(gòu),同時(shí)簡化了編程和調(diào)試。后臺(tái) ISR(中斷服務(wù)程序)和前臺(tái)的主程序循環(huán)之間的數(shù)據(jù)交換可以通過事件標(biāo)志和數(shù)據(jù)緩沖區(qū)來實(shí)現(xiàn)。在多路地址 /數(shù)據(jù)總線方式中,單片機(jī)與 PDIUSBD12的通信就像單片機(jī)外擴(kuò)了一片 RAM器件一樣??梢园凑障旅娴某绦蛳?PDIUSBD12發(fā)送數(shù)據(jù)或命令:   void outportb(unsigned int Addr,unsigned char Data)   {   ((unsigned char xdata )Addr)=Data;   }   其中,Addr是 PDIUSBD12的地址,Data是輸出的數(shù)據(jù)和命令。當(dāng) Addr為奇數(shù)時(shí)表示輸出的是命令,Addr為偶數(shù)時(shí)表示輸出的是數(shù)據(jù)。中斷服務(wù)程序處理由 PDIUSBD12產(chǎn)生的中斷,將數(shù)據(jù)從 PDIUSBD12內(nèi)部讀取到 CPU的存儲(chǔ)器,并建立正確的事件標(biāo)志,以通知主循環(huán)程序進(jìn)行處理。程序首先讀取 PDIUSBD12的中斷寄存器來決定中斷源,然后轉(zhuǎn)入相應(yīng)的子程序進(jìn)行處理??刂贫它c(diǎn)的輸入/輸出能夠完成設(shè)備的枚舉操作。端點(diǎn) 1和端點(diǎn) 2定義為普通端點(diǎn),可以實(shí)現(xiàn)中斷傳輸或批量傳輸?shù)取?/P>

          3.上位機(jī) USB驅(qū)動(dòng)   

          采用 DriverStudio來開發(fā) USB的 WDM驅(qū)動(dòng)。WDM(Windows Driver Model)是微軟公司全新的驅(qū)動(dòng)程序模式,支持即插即用、電源管理和 WMI技術(shù)。

          DriverStudio中的 DriverWorks提供了 USB驅(qū)動(dòng)程序設(shè)計(jì)向?qū)?,只要按照向?qū)瓿上鄳?yīng)的操作和設(shè)置就可以設(shè)計(jì)出一個(gè)簡單的 USB驅(qū)動(dòng)程序。

          在進(jìn)行 USB數(shù)據(jù)采集系統(tǒng)驅(qū)動(dòng)程序開發(fā)之前首先要明確 USB設(shè)備的配置和驅(qū)動(dòng)程序?qū)崿F(xiàn)的功能,在我們的數(shù)據(jù)采集系統(tǒng)中,共用到三個(gè) USB端口,分別為:   控制端口 0   IN端口 1   OUT端口 2 設(shè)計(jì)的驅(qū)動(dòng)程序主要功能是:簡單的實(shí)現(xiàn)對(duì)兩個(gè)端口的讀寫操作。知道這些后就可以著手進(jìn)行 USB驅(qū)動(dòng)程序開發(fā)工作了。

          DriverStudio是嵌入在 VC6.0中的,所以開發(fā) WDM驅(qū)動(dòng)和用 VC開發(fā)一個(gè)可視化工程的情況類似。DriverWizard會(huì)一步步的根據(jù)我們的設(shè)定給出一個(gè) WDM驅(qū)動(dòng)的大體框架,我們要做的就是在其中加入我們所要實(shí)現(xiàn)的 USB端口 1和端口 2的讀寫功能代碼。

          在向?qū)н^程中有一步很重要,這一步提示用戶選擇總線類型,該驅(qū)動(dòng)程序?yàn)?USB總線功能驅(qū)動(dòng)程序,所以選擇 USB總線。USB設(shè)備的 Vendor ID和 Product ID應(yīng)該對(duì)應(yīng)芯片,否則驅(qū)動(dòng)程序不會(huì)被正確識(shí)別。這里 PDIUSBD12對(duì)應(yīng)的 Vendor ID為 0471,Product ID為 0888。

          向?qū)瓿?,添加完端口讀寫功能代碼后,接下來的工作是編譯驅(qū)動(dòng)程序工程文件,生成需要的 USB功能驅(qū)動(dòng)程序。

          4.上位機(jī)應(yīng)用軟件   

          要實(shí)現(xiàn)的是通過自己編寫的應(yīng)用程序和 進(jìn)行數(shù)據(jù)的批量傳輸。當(dāng)點(diǎn)擊[數(shù)據(jù)發(fā)送]按鈕時(shí),將數(shù)據(jù)發(fā)送框中的命令數(shù)據(jù)發(fā)送到 。而點(diǎn)擊 [數(shù)據(jù)接收]按鈕,將從 pH值控制器接收到的 pH值數(shù)據(jù)在數(shù)據(jù)接收框中顯示出來。按[退出]按鈕則退出應(yīng)用程序。如圖 3

          USB數(shù)據(jù)采集系統(tǒng)的軟件設(shè)計(jì)的步驟如下:   在應(yīng)用軟件設(shè)計(jì)中,多線程技術(shù)的應(yīng)用會(huì)大大地提高應(yīng)用程序的效率,輔助線程完成后臺(tái)數(shù)據(jù)采集的工作。應(yīng)用程序的界面操作不受后臺(tái)數(shù)據(jù)處理的影響。

          其中讀線程函數(shù)為:   

          UNIT ReadTread(void pParam)   {   Cstting strTemp;   unsigned char iobuf[65];   unsigned long nBytes=0;   CUSB_softDlg pDlg=(CUSB_softDlg)pParam;   //使[接收]按鈕變灰   pDlg->GetDlgItem(IDC_RECEIVE_BUTTON)->EnableWindow(FALSE);   for(int i=0;i65;i++)   {   iobuf[i]=0;   }   //進(jìn)行讀操作,如果讀不到數(shù)據(jù)則無限期等待   if(!ReadFile(pDlg->m_hRead,iobuf,64,nBytes,NULL))   {   AfxMessageBox(“讀取數(shù)據(jù)失?。 ?MB_ICONWARNING|MB_OK);   }   iobuf[nBytes]=’