【文章內(nèi)容簡介】
9對(duì)輸入的電壓進(jìn)行采樣、保持、量化、編碼最后輸出為8位二進(jìn)制數(shù),然后送入FPGA進(jìn)行數(shù)據(jù)處理。同時(shí)ALE、ENABLE、START、CLOCK接FPGA,F(xiàn)PGA為ADC0809提供地址鎖存信號(hào)、輸出允許控制信號(hào)、啟動(dòng)控制信號(hào)和時(shí)鐘信號(hào)。由于危險(xiǎn)情況下(%),所以經(jīng)過AD轉(zhuǎn)換得此時(shí)ADC0809的輸出為10111001。 無線傳輸模塊設(shè)計(jì) 本文中的無線數(shù)據(jù)傳輸模塊采用PTR2000,因?yàn)樗悄壳凹啥容^高的無線收發(fā)產(chǎn)品,其接受和發(fā)送合為一體,具有兩個(gè)頻道,可滿足多信道工作的場(chǎng)合。 其硬件結(jié)構(gòu)框圖如圖35所示。 圖35 無線數(shù)據(jù)傳輸模塊硬件結(jié)構(gòu)框圖 其工作模式包括工作頻道的設(shè)置和發(fā)送、接收、待機(jī)狀態(tài),由TXEN、CS、PWR引腳共同決定,其工作模式設(shè)置如表31所示。 表31 PTR2000工作模式設(shè)置 引腳引入電平 模塊工作狀態(tài)TXENCS PWR工作頻道工作狀態(tài)0011接收0112 接收1011 發(fā)射1112 發(fā)射XX0發(fā)射由上圖得:由于模塊不同的工作模式,可以設(shè)置不同的引腳輸入電平得到不同的工作模式,可以由此設(shè)置讓PTR2000無線傳輸模塊工作于接收或放射狀態(tài)。PTR2000模塊的TXEN=1,接到VCC上,PTR2000出于發(fā)射狀態(tài);如果TXEN=0,接到GND上,PTR2000出于接收狀態(tài)。PTR2000的CS引腳和GND連接,即使固定通訊頻道為頻道1。PTR2000的PWR引腳連接到VCC上,使PTR2000的固定工作在正常狀態(tài)。具體的連接圖如圖36和圖37所示。 圖36 接收端PTR2000連接圖 圖37 發(fā)射端PTR2000連接圖 LED顯示電路設(shè)計(jì)發(fā)光二極一般是砷化鎵半導(dǎo)體二極管,在發(fā)光二極管兩端加上正向電壓,則發(fā)光二極管發(fā)光。數(shù)碼管是由若干發(fā)光二極管組合而成的,有共陰極和共陰極兩種結(jié)構(gòu)形。8段共陰極數(shù)碼管由a、b、c、d、e、f、g、d、g這8個(gè)發(fā)光二極管組成。把8個(gè)發(fā)光二極管的陰極連接在一起構(gòu)成共陰極端,接進(jìn)電路時(shí),共陰極端接地,給要發(fā)光顯示的二極管的陽極端接高電平可使該二極管導(dǎo)通點(diǎn)亮。如圖38所示。 圖38 LED顯示電路 報(bào)警電路設(shè)計(jì)采用電磁式蜂鳴器作為聲音報(bào)警的發(fā)聲器件,其工作原理為:電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動(dòng)膜片及外殼等組成。接通電源后,振蕩器產(chǎn)生的音頻信號(hào)電流通過電磁線圈,使電磁線圈產(chǎn)生磁場(chǎng)。振動(dòng)膜片在電磁線圈和磁鐵的相互作用下,周期地振動(dòng)發(fā)聲,當(dāng)瓦斯?jié)舛瘸^閾值時(shí),F(xiàn)PGA輸出低電平使PNP型三極管導(dǎo)通,蜂鳴器兩端腳產(chǎn)生壓差,從而發(fā)出聲音報(bào)警信號(hào)。其具體連接方法如圖39所示。 圖39 報(bào)警電路 4 系統(tǒng)軟件設(shè)計(jì)軟件部分的總體設(shè)計(jì)流程圖如下: 開始 系統(tǒng)初始化 調(diào)用A/D轉(zhuǎn)換子程序 數(shù)據(jù)處理 超過閾值PTR2000模塊發(fā)送數(shù)據(jù)接收PTR2000數(shù)據(jù) 顯示濃度 數(shù)據(jù)處理NY 報(bào)警 結(jié)束 圖41 軟件設(shè)計(jì)流程圖 工作原理:當(dāng)傳感器完成預(yù)熱后,調(diào)用A/D轉(zhuǎn)換子程序進(jìn)行數(shù)據(jù)采集,然后進(jìn)行數(shù)據(jù)處理,當(dāng)數(shù)據(jù)處理完畢后,就進(jìn)行串口通信,將數(shù)據(jù)通過串口送出,最后送至PTR2000無線傳輸模塊進(jìn)行發(fā)射,然后再次進(jìn)行串口通信,接收來自無線接收模塊PTR2000的數(shù)據(jù),然后將數(shù)據(jù)送入FPGA進(jìn)行數(shù)據(jù)處理,經(jīng)處理后,將瓦斯?jié)舛蕊@示在數(shù)碼管上,比較瓦斯?jié)舛?,確定是否大于設(shè)定的濃度閾值,若大于,則進(jìn)行報(bào)警,否則返回執(zhí)行。 PTR2000無線傳輸模塊 無線傳輸?shù)能浖O(shè)計(jì)包括發(fā)射端和接收端兩部分,兩部分軟件相互配合,設(shè)置各自的 PTR2000模塊的工作狀態(tài)。 PTR2000模塊程序設(shè)計(jì)發(fā)射端和接收端軟件配合設(shè)置PTR2000的狀態(tài)(發(fā)射或接收),選擇固定的通信頻道1(CS=0), 并讓PTR2000模塊一直處于正常工作狀態(tài)(PWM=1)。無線傳輸實(shí)現(xiàn)過程如下:(1)發(fā)送在發(fā)送數(shù)據(jù)之前,應(yīng)將PTR2000模塊置于發(fā)射模式,即TXEN=1。然后等待至少后5ms(接收到發(fā)射的切換時(shí)間)才可發(fā)射數(shù)據(jù)。發(fā)送結(jié)束后,應(yīng)將模塊置于接收狀態(tài),即TXEN=0;(2)接收應(yīng)將PTR2000置于接收模式,即TXEN=0。當(dāng)發(fā)射端發(fā)送時(shí),接收端應(yīng)為接收。 串行無線傳輸協(xié)議設(shè)計(jì) 無線通信中,由于外部環(huán)境的干擾,通常誤碼率較高,因此通信協(xié)議的設(shè)計(jì)對(duì)保證通信的可靠性十分重要。協(xié)議的設(shè)計(jì)主要是幀結(jié)構(gòu)的設(shè)計(jì),在該無線通信系統(tǒng)中,存在指令幀和數(shù)據(jù)幀。 數(shù)據(jù)幀的內(nèi)容包括起始字節(jié)、數(shù)據(jù)長度字節(jié)、數(shù)據(jù)字節(jié)、結(jié)束字節(jié)和校驗(yàn)和字節(jié),如表41所示。表41 數(shù)據(jù)幀設(shè)置起始字節(jié)數(shù)據(jù)長度字節(jié)數(shù)據(jù)字節(jié)校驗(yàn)和字節(jié)接收字節(jié)1字節(jié) 1字節(jié)N字節(jié)1字節(jié)1字節(jié)采用校驗(yàn)和的方法進(jìn)行幀的校驗(yàn),將所有字節(jié)相加,然后將結(jié)果截短到所需的位長。發(fā)射端對(duì)待發(fā)送的數(shù)據(jù)進(jìn)行校驗(yàn)和計(jì)算,將校驗(yàn)和值放在數(shù)據(jù)后一起發(fā)送;在接收端,對(duì)接收到的數(shù)據(jù) 進(jìn)行校驗(yàn)和計(jì)算,然后與收到的校驗(yàn)和字節(jié)比較,進(jìn)行誤碼判斷[13]。程序流程圖如圖42所示。 圖42 PTR2000無線傳輸流程圖 發(fā)射端程序設(shè)計(jì) 圖43 發(fā)射端模塊 此模塊是模擬PTR2000發(fā)射端的。CS、txen和pwm三個(gè)引腳控制其工作狀態(tài)。當(dāng)CS=0,pwr=1,txen=1時(shí)處于發(fā)射狀態(tài)。由于數(shù)據(jù)輸入是并行輸入,輸出是串行輸出,所以需要編寫一個(gè)并行轉(zhuǎn)串行的程序。txmit_over是發(fā)送結(jié)束標(biāo)志,發(fā)送結(jié)束后txmit_over=1。程序如下:LIBRARY IEEE。USE 。use 。ENTITY fashe_module IS PORT(clk,reset:IN STD_LOGIC。 clock and reset txd_data: IN STD_LOGIC_VECTOR(7 DOWNTO 0)。parell data input a:IN STD_LOGIC。start fasong cs,txen,pwm:out std_logic。 txd:OUT STD_LOGIC。serial output txmit_over:OUT STD_LOGIC )。zhishi:fasong wanbi END fashe_module 。ARCHITECTURE rtl OF fashe_module IS TYPE state IS (start, trans_state, trans_done)。 SIGNAL current_state:state:=start。 signal clk_co:std_logic。5fenpin shuchu SIGNAL start_trans:STD_LOGIC。 kaishi chuanshu SIGNAL counter,clk_1x_counter,clk_2x_counter:INTEGER RANGE 0 TO 15。 SIGNAL clk_2x:std_logic_vector(2 downto 0)。 SIGNAL clk_1x:STD_LOGIC。 SIGNAL txd_counter:INTEGER RANGE 0 TO 15。 SIGNAL txd_over:STD_LOGIC。 SIGNAL zancun_data:STD_LOGIC_VECTOR(7 DOWNTO 0)。BEGIN 16fenpin clock_fenpin_16: PROCESS(clk)clock process BEGIN IF clk39。EVENT AND clk=39。139。 THEN IF clk_1x_counter8 THEN clk_1x_counter=clk_1x_counter+1。 ELSE clk_1x_counter=0。 clk_1x=NOT clk_1x。 END IF。 END IF。 END PROCESS clock_fenpin_16。5fenpin clock_fenpin_5: PROCESS(clk)clock process BEGIN if a=39。139。 then clk_co=39。039。clk_2x=000。 ELSE IF clk39。EVENT AND clk=39。139。 THEN IF clk_2x100 THEN clk_2x=clk_2x+1。 clk_co=39。039。 ELSE clk_co=39。139。 END IF。 END IF。 END IF。 END PROCESS clock_fenpin_5。PROCESS(clk_1x,start_trans) BEGIN IF start_trans=39。039。 THEN txd_counter=0。 txd_over=39。039。 ELSIF CLK_CO=39。139。 THEN IF(clk_1x39。EVENT AND clk_1x=39。139。 ) THEN IF txd_counter10 THEN txd_counter=txd_counter+1。 ELSE txd_over=39。139。 txd_counter=0。 END IF。END IF。END IF。END PROCESS。 PROCESS(txd_counter) BEGIN CASE txd_counter IS WHEN 0=txd=39。139。 WHEN 1=txd=39。039。begin bit WHEN 2=txd=zancun_data(0)。data follow WHEN 3=txd=zancun_data(1)。 WHEN 4=txd=zancun_data(2)。 WHEN 5=txd=zancun_data(3)。 WHEN 6=tx