摘 要: 介紹了基于DSP的并聯(lián)有源濾波器與上位機的RS-232串口通信設計,給出了DSP串行通信的硬件接口電路和通信協(xié)議,并完成了串口通信的軟件編程。下位機使用C語言和匯編語言混合編程,上位機采用Visual C++設計界面,并用串口控件MSComm編寫串口程序,實現(xiàn)上位機對有源濾波器數(shù)據(jù)的采集、顯示、處理和存儲。調(diào)試結(jié)果表明,該串口通信設計可以實現(xiàn)上位機對有源濾波器的監(jiān)控。
關鍵詞: 有源濾波器;串口通信;Visual C++;MSComm
在工礦企業(yè)中,非線性電力負荷的大量增加使電網(wǎng)諧波污染日益加劇。而有源濾波器APF(Active Power Filter)能夠有效地濾除電網(wǎng)諧波,提高電能質(zhì)量,已成為諧波補償?shù)囊环N發(fā)展趨勢。隨著電網(wǎng)智能化的提高,僅僅完成諧波的濾除是不夠的,還需要將有源濾波器所處理監(jiān)控的一些動態(tài)參數(shù)(如電壓、電流、諧波等)上傳給上位機,以實現(xiàn)電網(wǎng)數(shù)據(jù)的實時監(jiān)測、分析和處理。串口通信是上位機與下位機數(shù)據(jù)交換常使用的方法之一,它具有數(shù)據(jù)傳輸可靠、連線少、成本低和抗干擾強等優(yōu)點[1]。因此,在本監(jiān)控系統(tǒng)中本文采用RS-232串行通信方式完成上下位機的數(shù)據(jù)交換。如果需要長距離傳輸,可以加Modem使用電話網(wǎng)或是直接使用無線通信網(wǎng)絡。
1 有源濾波器與上位機通信的硬件設計
有源濾波器設計采用并聯(lián)型拓撲結(jié)構(gòu),電網(wǎng)電流經(jīng)電流互感器按比例轉(zhuǎn)換成低電流,經(jīng)A/D轉(zhuǎn)換器采樣后讀入DSP控制模塊,DSP運用瞬時無功功率理論計算出補償電流的指令信號,再利用該信號和實際的補償電流設計滯環(huán)比較器,產(chǎn)生PWM信號控制主電路生成合適的補償電流回饋給電網(wǎng),以消除電網(wǎng)諧波。
為了完成數(shù)據(jù)的實時傳輸,DSP控制模塊通過擴展異步通信芯片TL16C750實現(xiàn)系統(tǒng)的高速串行通信。TL16C750具有集成度高、使用方便及兼容性好等特點,可由軟件設定16 B或64 B的FIFO,波特率最高可達1 Mb/s,具有可編程的串行數(shù)據(jù)發(fā)送格式[2]。它的片內(nèi)寄存器選擇信號線A0~A2和數(shù)據(jù)線D0~D7直接與DSP相連;片選信號、讀寫信號、接收準備好和發(fā)送準備好信號等控制信號通過CPLD邏輯電路與DSP相連,以便完成對TL16C750的控制。TL16C750接收上位機傳來的命令,并將下位機并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù)上傳給上位機。
由于RS-232端口的電氣特性規(guī)定邏輯1是-3 V~ -15 V,邏輯0是+3 V~+15 V,與TTL電平不兼容。因此,本設計采用電平轉(zhuǎn)換芯片MAX3232,完成TTL電平到RS-232電平的轉(zhuǎn)換。然后將MAX3232的T1out和R1in接到PC的串口上。有源濾波器與上位機通信的硬件原理框圖如圖1所示。
2 通信協(xié)議設計
通信協(xié)議是指通信雙方的一種約定,它規(guī)定了數(shù)據(jù)接收方和數(shù)據(jù)發(fā)送方需共同遵守的某種數(shù)據(jù)格式、同步方式、傳送速度、糾錯方式等,是串口通信的基礎[3]。本設計采用主從式、半雙工通信方式,波特率選擇9 600 b/s,1 bit偶校驗,8 bit數(shù)據(jù)位,1 bit停止位,并采用十六進制數(shù)據(jù)格式來表示指令代碼和數(shù)據(jù),格式如下:
起始字節(jié) 地址碼 功能碼 參數(shù)代號 操作數(shù) 結(jié)束字節(jié)
指令代碼和數(shù)據(jù)都采用定長格式,起始字節(jié)為A5,結(jié)束字節(jié)為5A,沒有參數(shù)的字節(jié)用FF填充。其中,操作數(shù)為2 B,其他為1 B。
地址碼為1 B,在多機通信中,每個下位機有唯一的地址碼,以響應與該地址相應的數(shù)據(jù)信息。由于本機還處于試驗調(diào)試階段,本文采用最簡單的單機通信,即只有一臺下位機,該下位機地址碼為01H。
功能碼包括查詢命令、讀命令和寫命令,每個功能碼是1 B,由上位機發(fā)送給下位機,告訴下位機執(zhí)行何種動作。本通信中查詢命令、讀命令和寫命令功能碼分別為25H、26H和27H,分別告訴下位機執(zhí)行查詢從機、讀數(shù)據(jù)和寫數(shù)據(jù)操作。
首先,上位機向下位機發(fā)送查詢從機命令,命令格式為:A5+地址碼+查詢命令(25H)+FF FF FF 5A。下位機接收到命令后,上傳特定數(shù)據(jù)給上位機,以完成上下位機的握手。
通信指令包括一條讀指令和一條寫指令。
讀指令格式為:A5+地址碼+讀命令(26H)+FF FF FF 5A。
返回數(shù)據(jù)為電壓、電流、諧波電流、小數(shù)點位置。
寫指令格式為:A5+地址碼+寫命令(27H)+參數(shù)代號+被寫入?yún)?shù)值+5A。
當上位機將讀指令發(fā)送給下位機時,下位機將采集的電壓、電流、諧波電流和小數(shù)點位置上傳給上位機。小數(shù)點位置用1 B表示,其他參數(shù)由2 B組成,低字節(jié)在前,高字節(jié)在后。
寫指令中的參數(shù)代號是指有源濾波器中需要修改的參數(shù),如01H表示波特率,02H表示小數(shù)點位置。被寫入?yún)?shù)值用2 B表示,低字節(jié)在前,高字節(jié)在后。比如,寫指令為A5 01 27 01 80 25 5A,則表示要將下位機的波特率改為9 600 b/s。第一個01H表示從機地址,27H表示寫命令,第二個01H表示需要修改波特率,要修改成的數(shù)據(jù)是2580H,十進制為9 600。
3 串行通信軟件設計
串口通信軟件設計包括下位機的DSP串口編程和上位機的程序設計兩部分。下位機的串口編程主要由串口初始化和通信協(xié)議組成,它接收上位機傳來的指令,并根據(jù)指令作出相應處理。上位機軟件設計主要包括串口配置和后續(xù)數(shù)據(jù)處理,它向下位機發(fā)送命令,并將接收到的數(shù)據(jù)進行處理、運算和保存。
3.1 下位機串口軟件設計
下位機的串口編程首先要完成串口的初始化,也就是設置操作所需要的參數(shù),如設定串行通信中字符的格式、波特率和工作方式等。在本系統(tǒng)中,異步通信芯片采用TL16C750,它內(nèi)部有11個寄存器,占用7個I/O口地址。DSP工作在微處理器模式,選擇TL16C750端口地址為4000H~4006H(A15=0,A14=1),并通過控制地址線A0、A1、A2和線路控制寄存器的除數(shù)寄存器選通位D7來選通不同寄存器,以便進行讀寫操作。
在異步串行通信中,一方的發(fā)送數(shù)據(jù)波特率一定要和對方的接收數(shù)據(jù)波特率相同[4],本系統(tǒng)設置波特率為9 600 b/s,又因TL16C750的晶振是14.745 6 MHz,根據(jù)“發(fā)送波特率=輸入時鐘頻率÷除數(shù)寄存器內(nèi)容÷16”可得波特率除數(shù)寄存器(低位地址是4000H,高位地址是4001H,選擇該地址時,線路控制寄存器的D7=1)內(nèi)容為96,轉(zhuǎn)化成十六進制是0060H。
線路控制寄存器地址為4003H,它既是可寫的也是可讀的,該寄存器中的內(nèi)容規(guī)定了通信中一幀的格式。本系統(tǒng)選擇通信格式為8 bit數(shù)據(jù)位,1 bit停止位,1 bit偶校驗,因此線路控制寄存器的值為1B。
系統(tǒng)工作在中斷方式下,允許接收錯、發(fā)送寄存器空和接收數(shù)據(jù)就緒中斷,因此中斷允許寄存器(地址為4001H,選擇該地址時線路控制寄存器的D7=0)的值為07H。
將TL16C750的接收準備好信號(RXRDY)和發(fā)送準備好信號(TXRDY)與DSP系統(tǒng)的外部中斷1(INT1)和中斷3(INT3)相連。當DSP接到串口中斷時,先屏蔽掉系統(tǒng)的其他中斷請求,然后將RXREADY賦值為1,以便用來判斷DSP是否完成了此中斷響應。如果鍵盤沒有終止串口通信,則將存入緩沖存儲器組的數(shù)據(jù)上傳給上位機。串口通信的中斷子程序流程圖如圖2所示。
3.2 上位機串口通信軟件設計
上位機程序使用Visual C++作為軟件開發(fā)環(huán)境。Visual C++在串口通信方面功能很強,不僅操作簡單、代碼執(zhí)行速度快,而且界面設計比較好[5]。使用Visual C++進行串口開發(fā)有多種方法,如Windows API通信函數(shù)、MSComm ActiveX串行通信控件、Visual C++運行庫函數(shù),第三方編寫通信類都可以實現(xiàn)串口編程。本設計采用MSComm ActiveX串行通信控件來編寫通信程序。
MSComm ActiveX串行通信控件是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件[6]。它提供了事件驅(qū)動方式和查詢方式兩種處理通信的方式。查詢方式是通過檢查CommEvent屬性值來查詢事件和錯誤,然后進行相應的處理;而事件驅(qū)動方式是在串口發(fā)生事件或錯誤時,產(chǎn)生OnComm事件進行相應的處理,它響應及時,可靠性高,因此本文選用事件驅(qū)動方式。
首先在VC中建立一個基于對話框的應用程序,在該MFC項目中插入Microsoft Communication Control控件。在使用該控件前,先要對其進行初始化設置,主要包括選擇COM口以及設置輸入方式、波特率、數(shù)據(jù)位、檢驗位、停止位、發(fā)送緩沖區(qū)大小和接收緩沖區(qū)大小等。當然不要忘記打開串口,因為在32 bit Windows中,串口和其他通信設備都被作為文件進行處理,在使用前必須先將其打開。部分初始化程序如下:
m_ctrlComm.SetCommPort(1); //選擇COM1
m_ctrlComm.SetInputMode(1);//輸入方式為二進制方式
m_ctrlComm.SetInBufferSize(1024);
//設置輸入緩沖區(qū)大小
m_ctrlComm.SetOutBufferSize(1024);
//設置輸出緩沖區(qū)大小
m_ctrlComm.SetSettings(bc1); //設置波特率、校驗位、數(shù)據(jù)位、停止位。其中bc1是從串口參數(shù)設置組合框中得到并經(jīng)sprintf()函數(shù)格式化后的字符串
if(!m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);//打開串口
m_ctrlComm.SetRThreshold(1); //參數(shù)1表示每當串口接收緩沖區(qū)中有多于或等于1個字符時將引發(fā)一個接收數(shù)據(jù)的OnComm事件
m_ctrlComm.SetSThreshold(1);//參數(shù)1表示當傳輸緩沖區(qū)完全空時將引發(fā)一個接收數(shù)據(jù)的OnComm事件
m_ctrlComm.SetInputLen(0);
//設置當前接收區(qū)數(shù)據(jù)長度為0
m_ctrlComm.GetInput();
//先預讀緩沖區(qū)以清除殘留數(shù)據(jù)
初始化完成后,按照通信協(xié)議在查詢設備和開始采集按鈕所對應的函數(shù)Oncheck()和Onstart()中編寫發(fā)送命令的字符串。為了定時發(fā)送讀指令,在Onstart()函數(shù)中添加計時器函數(shù)SetTimer(),當采集結(jié)束時,一定要清除該計時器。函數(shù)如下:
SetTimer(1,1000,NULL);
//創(chuàng)建一個計時器,每秒發(fā)送一次讀指令
KillTimer(1); //銷毀該計時器
當接收緩沖器中有數(shù)據(jù)時,將會觸發(fā)OnComm事件,因此要在MSComm控件相應的消息響應函數(shù)OnOnCommMscomm1()中編寫數(shù)據(jù)處理程序。由于串口通信接收和發(fā)送數(shù)據(jù)類型只能是VARIANT,因此要將數(shù)據(jù)進行格式轉(zhuǎn)換。將接收到的數(shù)據(jù)轉(zhuǎn)化成CString類,處理后將其保存到與之相連接的SQL Server 2000數(shù)據(jù)庫的表中,以便在主界面中進行顯示和相應數(shù)據(jù)的處理。
4 串口調(diào)試
串口屬性設計完成后,運行主界面,單擊串口設置按鈕,進入串口通信界面,運行界面如圖3所示。
首先單擊串口參數(shù)設置按鈕,設置串口通信的波特率、檢驗位、數(shù)據(jù)位和停止位。波特率選擇9 600 b/s,1 bit偶校驗,8 bit數(shù)據(jù)位,1 bit停止位。設置完成后單擊設備查詢,上位機將會向下位機發(fā)送設備查詢命令,下位機收到查詢命令后,將返回相同的數(shù)據(jù),如圖3中的a5 01 25 ff ff ff 5a,就是下位機返回給上位機的數(shù)據(jù)。上位機接收到該數(shù)據(jù),說明上下位機完成握手,數(shù)據(jù)能在兩者之間進行實時傳送。
單擊開始采集按鈕,上位機定時向下位機發(fā)送讀指令,下位機接收到讀命令后,將相關數(shù)據(jù)上傳給上位機。為了更加清楚地查看數(shù)據(jù)的傳輸過程,本文在串口對話框中加一個編輯框,用來顯示下位機傳給上位機的數(shù)據(jù),如圖3中的98 08 22 00 09 00 01就是下位機上傳的數(shù)據(jù)。其中,0898是電壓值,0022是電流值,0009是諧波電流值,01表示保留一位小數(shù),因此轉(zhuǎn)換成十進制電壓是220 V,電流是3.4 A,諧波電流是0.9 A。
當需要修改下位機相關參數(shù)時,將寫命令填寫到圖3最下邊的編輯框中,然后單擊寫命令按鈕,即會向下位機發(fā)送修改命令。
為了實現(xiàn)上位機對有源濾波器的監(jiān)控,本文設計了有源濾波器與上位機的RS-232串口通信,并詳細介紹了串口通信的硬件電路、通信協(xié)議和軟件編程。下位機使用C和匯編語言混合編程,上位機使用Visual C++完成界面設計,并編寫MSComm通信控件。通過串口調(diào)試可知,該設計能夠完成上位機對有源濾波器的實時監(jiān)控。
參考文獻
[1] 曹衛(wèi)彬.C/C++串口通信典型應用實例編程實踐[M].北京:電子工業(yè)出版社,2009.
[2] TL16C750 data sheet[DB/OL].[2011-12-16].http://www.icpdf.com/partnoview.asp?id=733855_128973.
[3] 王曉麗.基于串口通信的摩托車前照燈檢測[J].小型內(nèi)燃機與摩托車,2009,38(2):66-68.
[4] 劉樂善,歐陽星明,劉學清.微型計算機接口技術及應用[M].武漢:華中科技大學出版社,2000.
[5] 龔建偉,熊光明.Visual C++/Turbo C串口通信編程實踐[M].北京:電子工業(yè)出版社,2008.
[6] 王春曉,劉海.基于VB和MSComm的APF監(jiān)控系統(tǒng)設計[J].工業(yè)控制計算機,2010,23(12):20-21.