蔣雪昀
(青島工學(xué)院機(jī)電工程學(xué)院,山東青島 266300)
隨著現(xiàn)代工業(yè)不斷向信息化和規(guī)?;姆较蛑饾u發(fā)展,工業(yè)控制系統(tǒng)需要采集的控制信息越來越多,對系統(tǒng)數(shù)據(jù)采集的速度和精度要求也越來越高。傳統(tǒng)的數(shù)據(jù)采集方法無法滿足在實際中的要求,作為應(yīng)用新的數(shù)據(jù)采集技術(shù)的單片機(jī)應(yīng)運而生。隨著單片機(jī)技術(shù)的不斷發(fā)展,搭建可靠性高,成本低廉,部署快速的數(shù)據(jù)采集模塊就顯得很有必要。復(fù)雜電磁環(huán)境,須使用有較高抗電磁輻射干擾能力的模塊。總線傳輸模塊RS485 由于具有較強(qiáng)的抗電磁干擾能力而被發(fā)現(xiàn)和使用。基于該模塊構(gòu)建的數(shù)據(jù)信息傳輸系統(tǒng),也就具有了較好的抗電磁干擾能力,呈現(xiàn)出可靠的穩(wěn)定性[1]。
原理:由于RS485 總線具有平衡差分傳輸?shù)奶匦?,其抗干擾能力強(qiáng),傳輸距離遠(yuǎn),具有很強(qiáng)的級聯(lián)能力。它可以實現(xiàn)遠(yuǎn)程多站的通信,成本低,組網(wǎng)方便,并已廣泛應(yīng)用于工業(yè)控制領(lǐng)域。這里的上位機(jī)選擇“組態(tài)王”,下位機(jī)選擇芯片與單片機(jī)?;赗S485 總線的遠(yuǎn)程數(shù)據(jù)采集模塊的連接圖如圖1所示。
圖1 基于RS485 總線的遠(yuǎn)程數(shù)據(jù)采集模塊的連接圖
A/D 轉(zhuǎn)換模塊由單片機(jī)進(jìn)行控制,單片機(jī)讀取A/D 轉(zhuǎn)換芯片的數(shù)據(jù),并通過RS485 總線將數(shù)據(jù)傳輸至組態(tài)王。工作時,模塊作為從設(shè)備,等待組態(tài)王發(fā)送數(shù)據(jù)查詢命令,命令中包括數(shù)據(jù)類型及所通信的設(shè)備地址,單片機(jī)與程序內(nèi)部中的地址相比較,若相同,則建立點對點的連接,通過485 接口電路,將TTL 電平轉(zhuǎn)化為RS485 電平進(jìn)行數(shù)據(jù)發(fā)送。
通過使用RS485 總線,可以使其進(jìn)行遠(yuǎn)距離傳輸。總體結(jié)構(gòu)如圖2所示。
圖2 遠(yuǎn)程數(shù)據(jù)采集模塊總體結(jié)構(gòu)圖
由圖2可以看出,系統(tǒng)主電路采用的是以AT89C52 為核心,以ADC0808 作為模擬量采集端口,MAX487 芯片將TTL電平轉(zhuǎn)換為RS485 電平。傳感器檢測到的物理量經(jīng)過信號調(diào)理電路轉(zhuǎn)變?yōu)?~5 V 的標(biāo)準(zhǔn)信號、由A/D 采樣后將數(shù)字量傳送到單片機(jī)系統(tǒng)中,單片機(jī)根據(jù)與上位機(jī)通信協(xié)議來傳輸送數(shù)據(jù),并把測量數(shù)據(jù)傳送到組態(tài)王從而實現(xiàn)實時監(jiān)控。
本設(shè)計中A/D 轉(zhuǎn)換模塊,需要8 個IO 口,3 位數(shù)據(jù)地址選擇控制端A、B、C,A/D 轉(zhuǎn)換采用循環(huán)查詢轉(zhuǎn)換方式,需要串行通信接口。單片機(jī)AT89C52 系統(tǒng)的資源完全可以滿足系統(tǒng)設(shè)計的資源要求,所以設(shè)計中單片機(jī)采用AT89C52。
3.1.1 單片機(jī)的微結(jié)構(gòu)
AT89C52 單片機(jī)最小系統(tǒng)包括數(shù)個晶體振蕩器、回(復(fù))位電路,開關(guān)電路,其中晶振方式采用內(nèi)部時鐘方式,外接石英晶體振蕩器,接電容C1 和C2 分別為30 pF,人工復(fù)位方式為按鍵復(fù)位,即單片機(jī)復(fù)位端RST 通過100 Ω 的電阻與VCC電源連接,按下開關(guān)后RST 變高,開關(guān)彈起后RST 端經(jīng)1 kΩ電阻后接地,從而實現(xiàn)復(fù)位[2]。具體連接如圖3所示。
圖3 單片機(jī)的最小系統(tǒng)圖
在圖3中,晶體振蕩器X1 的頻率為11.059 2 MHz,選用這個晶振頻率是為了產(chǎn)生各種標(biāo)準(zhǔn)的波特率發(fā)生頻率為11.059 2 MHz。電阻R2 和C3 電容的電路組成單片機(jī)的上電復(fù)位電路。在單片機(jī)通電的過程中,R2 和C3 在上電時產(chǎn)生一個負(fù)脈沖通過RST 引腳復(fù)位。復(fù)位時復(fù)位信號要使用大于2 個機(jī)器周期的高電平,R2 和C3 分別是100 Ω 和22 uF,滿足時鐘寬度要求,按鍵用于人工復(fù)位。EA 為1 時,CPU 訪問內(nèi)部程序存儲器。
3.1.2 單片機(jī)的資源分配
對于數(shù)據(jù)采集模塊,需要一個串口進(jìn)行通信,需要定時器來產(chǎn)生相應(yīng)的波特率,需要8 位數(shù)據(jù)輸出端AD0~AD7,3位數(shù)據(jù)地址選擇控制端A、B、C,地址鎖存允許ALE 經(jīng)分頻后輸給ADC0808 作為時鐘信號,AT89C52 的資源完全可以滿足要求。
3.2.1 A/D 轉(zhuǎn)換器原理
ADC0808 是CMOS 單片型逐次逼近式A/D 轉(zhuǎn)換器,內(nèi)部結(jié)構(gòu)如圖4所示。
圖4 ADC0808 內(nèi)部結(jié)構(gòu)圖
首先輸入3 位地址,并拉高ALE,將地址鎖入地址鎖存器中。此地址經(jīng)譯碼后選通8 路模擬輸入之一到A/D 轉(zhuǎn)換器。START 接收到上升沿時將逐次逼近寄存器復(fù)位。下降沿便啟動A/D 轉(zhuǎn)換,之后EOC 被拉低,說明A/D 轉(zhuǎn)換正在進(jìn)行。A/D 轉(zhuǎn)換完成之后,EOC 被拉高,說明A/D 轉(zhuǎn)換已經(jīng)完成,數(shù)據(jù)已存入內(nèi)部的鎖存器,需等待三態(tài)門打開才會輸出數(shù)據(jù),這個信號可以作為中斷申請[3]。當(dāng)OE 輸入“1”時,輸出三態(tài)門打開,轉(zhuǎn)換結(jié)果的數(shù)字量輸出到數(shù)據(jù)總線上。
3.2.2 轉(zhuǎn)換芯片硬件連接
圖5為ADC0808 連接圖。
圖5 ADC0808 連接圖
由于ADC0808 可以與AT89C52 單片機(jī)直接相連。初始化時,使START 和OE 信號全為低電平。轉(zhuǎn)換通道的地址要連接到ADD A、ADD B、ADD C 端口上。當(dāng)要開始轉(zhuǎn)換時,先將地址輸出到ADC0808 的ABC 端,再將ALE 拉高,鎖定地址,START 接收到一個正脈沖,啟動A/D 轉(zhuǎn)換。啟動轉(zhuǎn)換后的一段時間,單片機(jī)去讀取數(shù)據(jù),并發(fā)送到上位機(jī),完成一次數(shù)據(jù)采集。ALE 輸出頻率為晶振的1/6,約為1.9 MHz,再經(jīng)過四分頻電路后可以得到480 kHz 的脈沖,可以滿足ADC0808 的工作要求。模擬信號輸入通道的選擇與地址選擇輸入端的對應(yīng)為:通道IN0 對應(yīng)輸入地址ADD A:0(字節(jié)),ADD B:0(字節(jié)),ADD C:0(字節(jié));通道IN1 對應(yīng)輸入地址ADD A:1(字節(jié)),ADD B:0(字節(jié)),ADD C:0(字節(jié));通道IN2 對應(yīng)輸入地址ADD A:0(字節(jié)),ADD B(字節(jié)):1,ADD C:0(字節(jié));通道IN3對應(yīng)輸入地址ADD A(字節(jié)):1,ADD B:1(字節(jié)),ADD C:0(字節(jié));通道IN4 對應(yīng)輸入地址ADD A:0(字節(jié)),ADD B:0(字節(jié)),ADD C:1(字節(jié));通道IN5 對應(yīng)輸入地址ADD A:1(字節(jié)),ADD B:0(字節(jié)),ADD C:1(字節(jié));通道IN6 對應(yīng)輸入地址ADD A:0(字節(jié)),ADD B:1(字節(jié)),ADD C:1(字節(jié));通道IN7 對應(yīng)輸入地址ADD A:1(字節(jié)),ADD B:1(字節(jié)),ADD C:1(字節(jié))。
3.3.1 RS485 簡介
采用差分信號負(fù)邏輯,邏輯低電平以兩線間的電壓差為+2 V~+6 V 表示。邏輯高電平以兩線間的電壓差為-2 V~-6 V表示。RS-232-C 比接口信號電平高,就不易損壞接口電路的芯片,RS-485 接口是采用平衡驅(qū)動器和差分,接收器的組合,抗共模干擾能力增強(qiáng),即抗噪聲干擾性好。連接RS-485 通信鏈路時用一對雙絞線將各個接口的A、B 端連接起來[4]。
3.3.2 RS485 電平與TTL 電平的轉(zhuǎn)換
在RS485 中規(guī)定:接口兩端(設(shè)為A、B)的電壓差高于+2V 時為邏輯1,低于-2 V 伏時為邏輯0。工作電源為+5 V,額定電流為300 μA,采用半雙工通訊方式的MAX487 完成將TTL 電平轉(zhuǎn)換為RS485 電平的功能。MAX487 引腳結(jié)構(gòu)如圖6所示。
圖6 MAX487 引腳結(jié)構(gòu)
從圖6中能看出MAX487 的內(nèi)部是由驅(qū)動器和接收器組成的。與單片機(jī)連接時只需RO 和DI 分別與單片機(jī)的RXD 和TXD 相連即可,RO 是接收器的輸出,DI 是驅(qū)動器的輸入端,/RE 是接收使能端DE 是發(fā)送使能端,A 端和B 端分別為接收和發(fā)送的差分信號端。同時,A 和B 端加上阻值約為120 Ω 的匹配電阻。單片機(jī)與芯片連接圖見圖7。
圖7 單片機(jī)與MAX487 連接圖
程序主體主要分3 個部分:命令接收部分、命令分析部分以及A/D 轉(zhuǎn)換部分。其中通信程序中的接收部分的優(yōu)先級最高,A/D 轉(zhuǎn)換部分優(yōu)先級最低。其總體流程如圖8所示。
圖8 總體流程圖
為了支持RS-485 通信,需要對單片機(jī)的串行口進(jìn)行設(shè)置。通信串行口的工作由串行口控制寄存器SCON 和電源管理寄存器PCON 控制。
串行口控制寄存器SCON 用以設(shè)定串行口的工作方式、多級通信控制、接收/發(fā)送狀態(tài),發(fā)送/接受中斷狀態(tài)。由于數(shù)據(jù)采集系統(tǒng)傳送的數(shù)據(jù)是由10 位二進(jìn)制數(shù)組成的,所以選擇串行口工作方式1,即SM0、SM1 設(shè)置為“01”,波特率由單片機(jī)定時器設(shè)置,單片機(jī)時鐘晶振選為11.059 2 MHz,波特率選為19 200 bit/s,所以設(shè)置SMOD=0,RCAP2H=0xff;RCAP2L=0xee[5]。
串口初始化程序如下:
void serial_init () {
ctrl=0;
SCON= 0x50;
C_T2=0;
RCLK=1;
TCLK=1;
TMOD=0x20;
RCAP2H=0xff;
RCAP2L=0xee;
TR2=1;/*enable Timer2 run*/
ES=1; REN=1; EA=1; SM2=1; /*SM2=1 時收到的第9 位為1 才置位RI 標(biāo)志*/
}
對于A/D 轉(zhuǎn)換模塊,當(dāng)要對其讀取數(shù)據(jù)時,先將ADC0808 的START 和ALE 引腳拉低,此時可以將通道選擇地址輸入ADC0808 的ABC 地址端口。流程見圖9。
圖9 A/D 轉(zhuǎn)換流程圖
對應(yīng)程序如下:
start=0; //使0808 復(fù)位
oe=0; //數(shù)據(jù)三態(tài)門不允許輸出
adca=0;adcb=0;adcc=0;start=1;//鎖定地址
start=0;oe=1;for(i=0;i<=40;i++) {} d[1]=P0;//啟動AD 轉(zhuǎn)換,并將轉(zhuǎn)換后的數(shù)據(jù)放入P0
for(i=0;i<=40;i++) {} start=0; oe=0; //復(fù)位,準(zhǔn)備下次轉(zhuǎn)換
adca=1;adcb=0;adcc=0;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[2]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;
adca=0;adcb=1;adcc=0;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[3]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;
adca=1;adcb=1;adcc=0;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[4]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;
adca=0;adcb=0;adcc=1;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[5]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;
adca=1;adcb=0;adcc=1;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[6]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;
adca=0;adcb=1;adcc=1;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[7]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;
adca=1;adcb=1;adcc=1;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[8]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;
地址鎖存之后,延時一段再將START 拉高,便啟動了A/D轉(zhuǎn)換。延時一小段時間后,便可以向A/D 轉(zhuǎn)換芯片讀取數(shù)據(jù)。單片機(jī)控制A/D 轉(zhuǎn)換芯片循環(huán)采集每一路的數(shù)據(jù),并且存放于數(shù)組中。當(dāng)組態(tài)王發(fā)來查詢指令時,根據(jù)數(shù)據(jù)包中的地址來尋找數(shù)組中相應(yīng)的數(shù)據(jù),并將其發(fā)送到上位機(jī)。
①通訊口使用RS-485 通訊方式。
上位機(jī)所設(shè)置的參數(shù)必須與單片機(jī)中的通訊參數(shù)一致,例如,波特率、奇偶校驗等。
②設(shè)備地址的格式。
格式:**.*。
前面的兩個字符是設(shè)備地址,范圍為0~255,此地址是由單片機(jī)中的程序決定。
后面的一個字符是用戶設(shè)定是否打包,“0”為不打包、“1”為打包,如果用戶在定義設(shè)備沒有確定打包,那么上位機(jī)就不會處理下位機(jī)的時數(shù)打包工作,反之則處理。
③寄存器格式在上位電機(jī)的定義。
寄存器名稱:Xdd;dd 上限:65535;dd 下限:0;數(shù)據(jù)類型:BYTE、UINT、FLOAT。
注意:在上位機(jī)中定義變量時,某一個寄存器根據(jù)所選數(shù)據(jù)類型(如BYTE 占用一個字節(jié),F(xiàn)LOAT 占用四個字節(jié)),不同的數(shù)據(jù)類型會對應(yīng)不同的寄存器地址,同一數(shù)據(jù)區(qū)內(nèi)不可交叉定義不同數(shù)據(jù)類型的變量。BYTE 是單片機(jī)從地址0開始的數(shù)據(jù)類型的變量,相應(yīng)的變量在上位機(jī)中定義的寄存器為X0、X1……每個變量占一個字節(jié)。UINT 是單片機(jī)從地址100 開始的數(shù)據(jù)類型的變量,相應(yīng)的變量的寄存器為X100、X102、X108……每個變量占兩個字節(jié)。FLOAT 是單片機(jī)從地址200 開始的數(shù)據(jù)類型的變量。在上位機(jī)中定義相應(yīng)的變量的寄存器為X200、X212……每個變量占四個字節(jié)。
④上位機(jī)與單片機(jī)通訊的命令格式。
讀寫格式(除字頭、字尾外所有字節(jié)均為ASCII 碼):
字頭:1 字節(jié)1 個ASCII 碼,40H。
設(shè)備地址:1 字節(jié)2 個ASCII 碼,0~255 (即0---0x0ffH)。
CR:0x0d[6]。
標(biāo)志:1 字節(jié)2 個ASCII 碼。
數(shù)據(jù)地址是2 字節(jié)4 個ASCII 碼,0x0000~0xffff。數(shù)據(jù)字節(jié)數(shù)是1 字節(jié)2 個ASCII 碼,1~100,實際讀寫的數(shù)據(jù)的字節(jié)數(shù)。
⑤組態(tài)王發(fā)送讀命令。
下位機(jī)應(yīng)答:若正常:
例如,讀15 號儀表,數(shù)據(jù)地址為15 的數(shù)據(jù)。其中數(shù)據(jù)為100,數(shù)據(jù)類型為字節(jié),不打包。上位機(jī)所發(fā)命令如表1所示。
表1 上位機(jī)所發(fā)數(shù)據(jù)單位:字節(jié)
若正確,則收到表2所示數(shù)據(jù)。
表2 正確數(shù)據(jù)單位:字節(jié)
通訊程序需要完成的功能:接收上位機(jī)傳來的查詢命令,需要解析出所查數(shù)據(jù)類型、變量名、設(shè)備地址、數(shù)據(jù)字節(jié)數(shù),完成校驗功能。接收上位機(jī)命令的流程如圖10 所示。
圖10 接收命令流程圖
當(dāng)接收到組態(tài)王發(fā)來的信息的字頭時,開始接收后面的數(shù)據(jù),并組成一個數(shù)組,用于做校驗及識別組態(tài)王命令。
單片機(jī)在完整接收完組態(tài)王發(fā)來的命令后,便開始分析命令。分析的流程如圖11 所示。
圖11 單片機(jī)分析數(shù)據(jù)流程圖
設(shè)計完采集模塊后,需要對采集模塊進(jìn)行通信測試。COM1 口連接RS232/RS485 轉(zhuǎn)換器,轉(zhuǎn)換器的AB 端分別接到數(shù)據(jù)采集模塊的AB 端。組態(tài)王軟件中支持ASCII 協(xié)議,所以選用組態(tài)王進(jìn)行通信測試。測試之前要對組態(tài)王進(jìn)行設(shè)置,之后設(shè)定不同的模擬量,觀察能否得到正確的A/D 轉(zhuǎn)換結(jié)果。
測試兩個采集模塊,每個采集模塊的AB 端都并聯(lián)起來,接到RS232/RS485 的轉(zhuǎn)換器上即可。
因為是在PC 上讀取下位機(jī)數(shù)據(jù),下位機(jī)與上位機(jī)連接所使用的串口為COM1,因此,在組態(tài)王中要選擇COM1,首先就要對組態(tài)王進(jìn)行設(shè)置,設(shè)置步驟如下:
①首先新建一個工程,在工程瀏覽器中,找到設(shè)備選項見圖12。
圖12 選擇連接串口
②找到COM1,在右邊選擇新建,選擇設(shè)備時,找到單片機(jī)—通用單片機(jī)ASCII—串口,之后選擇下一步,見圖13。
圖13 選擇設(shè)備類型
③給設(shè)備設(shè)置一個名字,之后串口選擇COM1,設(shè)備地址中每一個模塊都要有自己唯一的地址,用以區(qū)分不同的模塊。其余的設(shè)置選擇默認(rèn)即可。見圖14、15。
圖14 選擇設(shè)備所連接的串口
圖15 選擇設(shè)備地址
之后在數(shù)據(jù)詞典中建立相關(guān)變量即可。再按照相同的步驟,建立地址為4.0 的設(shè)備。
對于前四路每個輸入口給定不同的電壓,第一路輸入3 V,第二路輸入0 V,第三路輸入5 V,第四路輸入2.5 V,觀察四路的數(shù)據(jù)。測試結(jié)果見圖16。
圖16 組態(tài)王接收到的數(shù)據(jù)
對于A/D,0 V 對應(yīng)的數(shù)值為0,5 V 對應(yīng)的數(shù)值為255,轉(zhuǎn)換在實際結(jié)果中我們可以看到,在輸入不同的模擬量之后,不同地址的模塊也得到了相同的結(jié)果,結(jié)果見表3、4。至此,數(shù)據(jù)采集模塊的基本功能已經(jīng)實現(xiàn)。
表3 采集模塊地址為3 的數(shù)據(jù)
組態(tài)王開發(fā)監(jiān)控系統(tǒng)軟件,是新型的工業(yè)自動控制系統(tǒng),它以標(biāo)準(zhǔn)的工業(yè)計算機(jī)軟、硬件平臺構(gòu)成的集成系統(tǒng)取代傳統(tǒng)的封閉式系統(tǒng)。對于企業(yè)使用組態(tài)王可以很方便直觀的觀察各個傳感器發(fā)送的數(shù)據(jù),而且軟件靈活度高,功能強(qiáng)大,易于操作,可以省去很多開發(fā)時間,提高效率。因而為配合采集模塊,采用了組態(tài)王作為監(jiān)控軟件。因為其靈活性極高,可以用在大多數(shù)工廠的應(yīng)用場合。
表4 采集模塊地址為4 的數(shù)據(jù)