《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于有源濾波器的串口通信設(shè)計(jì)與實(shí)現(xiàn)
基于有源濾波器的串口通信設(shè)計(jì)與實(shí)現(xiàn)
來(lái)源:微型機(jī)與應(yīng)用2012年第9期
藺海艷1,,劉 海1,王銀照2
(1.山東大學(xué)威海分校,,山東 威海 264209,; 2.山東濱州供電公司,山東 濱州 256610)
摘要: 介紹了基于DSP的并聯(lián)有源濾波器與上位機(jī)的RS-232串口通信設(shè)計(jì),,給出了DSP串行通信的硬件接口電路和通信協(xié)議,,并完成了串口通信的軟件編程,。下位機(jī)使用C語(yǔ)言和匯編語(yǔ)言混合編程,,上位機(jī)采用Visual C++設(shè)計(jì)界面,并用串口控件MSComm編寫串口程序,,實(shí)現(xiàn)上位機(jī)對(duì)有源濾波器數(shù)據(jù)的采集,、顯示、處理和存儲(chǔ),。調(diào)試結(jié)果表明,,該串口通信設(shè)計(jì)可以實(shí)現(xiàn)上位機(jī)對(duì)有源濾波器的監(jiān)控。
Abstract:
Key words :

摘  要: 介紹了基于DSP的并聯(lián)有源濾波器與上位機(jī)的RS-232串口通信設(shè)計(jì),,給出了DSP串行通信的硬件接口電路和通信協(xié)議,,并完成了串口通信的軟件編程。下位機(jī)使用C語(yǔ)言和匯編語(yǔ)言混合編程,,上位機(jī)采用Visual C++設(shè)計(jì)界面,,并用串口控件MSComm編寫串口程序,實(shí)現(xiàn)上位機(jī)對(duì)有源濾波器數(shù)據(jù)的采集,、顯示,、處理和存儲(chǔ)。調(diào)試結(jié)果表明,,該串口通信設(shè)計(jì)可以實(shí)現(xiàn)上位機(jī)對(duì)有源濾波器的監(jiān)控,。
關(guān)鍵詞: 有源濾波器;串口通信,;Visual C++,;MSComm

 在工礦企業(yè)中,,非線性電力負(fù)荷的大量增加使電網(wǎng)諧波污染日益加劇。而有源濾波器APF(Active Power Filter)能夠有效地濾除電網(wǎng)諧波,,提高電能質(zhì)量,,已成為諧波補(bǔ)償?shù)囊环N發(fā)展趨勢(shì)。隨著電網(wǎng)智能化的提高,,僅僅完成諧波的濾除是不夠的,,還需要將有源濾波器所處理監(jiān)控的一些動(dòng)態(tài)參數(shù)(如電壓、電流,、諧波等)上傳給上位機(jī),,以實(shí)現(xiàn)電網(wǎng)數(shù)據(jù)的實(shí)時(shí)監(jiān)測(cè)、分析和處理,。串口通信是上位機(jī)與下位機(jī)數(shù)據(jù)交換常使用的方法之一,,它具有數(shù)據(jù)傳輸可靠、連線少,、成本低和抗干擾強(qiáng)等優(yōu)點(diǎn)[1],。因此,在本監(jiān)控系統(tǒng)中本文采用RS-232串行通信方式完成上下位機(jī)的數(shù)據(jù)交換,。如果需要長(zhǎng)距離傳輸,,可以加Modem使用電話網(wǎng)或是直接使用無(wú)線通信網(wǎng)絡(luò)。
1 有源濾波器與上位機(jī)通信的硬件設(shè)計(jì)
 有源濾波器設(shè)計(jì)采用并聯(lián)型拓?fù)浣Y(jié)構(gòu),,電網(wǎng)電流經(jīng)電流互感器按比例轉(zhuǎn)換成低電流,,經(jīng)A/D轉(zhuǎn)換器采樣后讀入DSP控制模塊,DSP運(yùn)用瞬時(shí)無(wú)功功率理論計(jì)算出補(bǔ)償電流的指令信號(hào),,再利用該信號(hào)和實(shí)際的補(bǔ)償電流設(shè)計(jì)滯環(huán)比較器,,產(chǎn)生PWM信號(hào)控制主電路生成合適的補(bǔ)償電流回饋給電網(wǎng),以消除電網(wǎng)諧波,。
為了完成數(shù)據(jù)的實(shí)時(shí)傳輸,,DSP控制模塊通過(guò)擴(kuò)展異步通信芯片TL16C750實(shí)現(xiàn)系統(tǒng)的高速串行通信。TL16C750具有集成度高,、使用方便及兼容性好等特點(diǎn),,可由軟件設(shè)定16 B或64 B的FIFO,波特率最高可達(dá)1 Mb/s,,具有可編程的串行數(shù)據(jù)發(fā)送格式[2],。它的片內(nèi)寄存器選擇信號(hào)線A0~A2和數(shù)據(jù)線D0~D7直接與DSP相連;片選信號(hào),、讀寫信號(hào),、接收準(zhǔn)備好和發(fā)送準(zhǔn)備好信號(hào)等控制信號(hào)通過(guò)CPLD邏輯電路與DSP相連,以便完成對(duì)TL16C750的控制,。TL16C750接收上位機(jī)傳來(lái)的命令,,并將下位機(jī)并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù)上傳給上位機(jī)。
 由于RS-232端口的電氣特性規(guī)定邏輯1是-3 V~ -15 V,,邏輯0是+3 V~+15 V,,與TTL電平不兼容。因此,,本設(shè)計(jì)采用電平轉(zhuǎn)換芯片MAX3232,,完成TTL電平到RS-232電平的轉(zhuǎn)換,。然后將MAX3232的T1out和R1in接到PC的串口上。有源濾波器與上位機(jī)通信的硬件原理框圖如圖1所示,。

2 通信協(xié)議設(shè)計(jì)
 通信協(xié)議是指通信雙方的一種約定,,它規(guī)定了數(shù)據(jù)接收方和數(shù)據(jù)發(fā)送方需共同遵守的某種數(shù)據(jù)格式,、同步方式、傳送速度,、糾錯(cuò)方式等,,是串口通信的基礎(chǔ)[3]。本設(shè)計(jì)采用主從式,、半雙工通信方式,波特率選擇9 600 b/s,,1 bit偶校驗(yàn),8 bit數(shù)據(jù)位,,1 bit停止位,,并采用十六進(jìn)制數(shù)據(jù)格式來(lái)表示指令代碼和數(shù)據(jù),格式如下:
 起始字節(jié) 地址碼 功能碼 參數(shù)代號(hào) 操作數(shù) 結(jié)束字節(jié)
 指令代碼和數(shù)據(jù)都采用定長(zhǎng)格式,,起始字節(jié)為A5,,結(jié)束字節(jié)為5A,沒(méi)有參數(shù)的字節(jié)用FF填充,。其中,,操作數(shù)為2 B,其他為1 B,。
 地址碼為1 B,,在多機(jī)通信中,每個(gè)下位機(jī)有唯一的地址碼,,以響應(yīng)與該地址相應(yīng)的數(shù)據(jù)信息,。由于本機(jī)還處于試驗(yàn)調(diào)試階段,本文采用最簡(jiǎn)單的單機(jī)通信,,即只有一臺(tái)下位機(jī),,該下位機(jī)地址碼為01H。
功能碼包括查詢命令,、讀命令和寫命令,,每個(gè)功能碼是1 B,由上位機(jī)發(fā)送給下位機(jī),告訴下位機(jī)執(zhí)行何種動(dòng)作,。本通信中查詢命令,、讀命令和寫命令功能碼分別為25H、26H和27H,,分別告訴下位機(jī)執(zhí)行查詢從機(jī),、讀數(shù)據(jù)和寫數(shù)據(jù)操作,。
 首先,,上位機(jī)向下位機(jī)發(fā)送查詢從機(jī)命令,命令格式為:A5+地址碼+查詢命令(25H)+FF FF FF 5A,。下位機(jī)接收到命令后,,上傳特定數(shù)據(jù)給上位機(jī),以完成上下位機(jī)的握手,。
通信指令包括一條讀指令和一條寫指令,。
 讀指令格式為:A5+地址碼+讀命令(26H)+FF FF FF 5A。
 返回?cái)?shù)據(jù)為電壓,、電流,、諧波電流、小數(shù)點(diǎn)位置,。
 寫指令格式為:A5+地址碼+寫命令(27H)+參數(shù)代號(hào)+被寫入?yún)?shù)值+5A,。
 當(dāng)上位機(jī)將讀指令發(fā)送給下位機(jī)時(shí),下位機(jī)將采集的電壓,、電流,、諧波電流和小數(shù)點(diǎn)位置上傳給上位機(jī)。小數(shù)點(diǎn)位置用1 B表示,,其他參數(shù)由2 B組成,,低字節(jié)在前,高字節(jié)在后,。
 寫指令中的參數(shù)代號(hào)是指有源濾波器中需要修改的參數(shù),,如01H表示波特率,02H表示小數(shù)點(diǎn)位置,。被寫入?yún)?shù)值用2 B表示,,低字節(jié)在前,高字節(jié)在后,。比如,,寫指令為A5 01 27 01 80 25 5A,則表示要將下位機(jī)的波特率改為9 600 b/s,。第一個(gè)01H表示從機(jī)地址,,27H表示寫命令,第二個(gè)01H表示需要修改波特率,,要修改成的數(shù)據(jù)是2580H,,十進(jìn)制為9 600,。
3 串行通信軟件設(shè)計(jì)
 串口通信軟件設(shè)計(jì)包括下位機(jī)的DSP串口編程和上位機(jī)的程序設(shè)計(jì)兩部分。下位機(jī)的串口編程主要由串口初始化和通信協(xié)議組成,,它接收上位機(jī)傳來(lái)的指令,,并根據(jù)指令作出相應(yīng)處理。上位機(jī)軟件設(shè)計(jì)主要包括串口配置和后續(xù)數(shù)據(jù)處理,,它向下位機(jī)發(fā)送命令,,并將接收到的數(shù)據(jù)進(jìn)行處理、運(yùn)算和保存,。
3.1 下位機(jī)串口軟件設(shè)計(jì)
 下位機(jī)的串口編程首先要完成串口的初始化,,也就是設(shè)置操作所需要的參數(shù),如設(shè)定串行通信中字符的格式,、波特率和工作方式等,。在本系統(tǒng)中,異步通信芯片采用TL16C750,,它內(nèi)部有11個(gè)寄存器,,占用7個(gè)I/O口地址。DSP工作在微處理器模式,,選擇TL16C750端口地址為4000H~4006H(A15=0,,A14=1),并通過(guò)控制地址線A0,、A1,、A2和線路控制寄存器的除數(shù)寄存器選通位D7來(lái)選通不同寄存器,以便進(jìn)行讀寫操作,。
在異步串行通信中,,一方的發(fā)送數(shù)據(jù)波特率一定要和對(duì)方的接收數(shù)據(jù)波特率相同[4],本系統(tǒng)設(shè)置波特率為9 600 b/s,,又因TL16C750的晶振是14.745 6 MHz,,根據(jù)“發(fā)送波特率=輸入時(shí)鐘頻率÷除數(shù)寄存器內(nèi)容÷16”可得波特率除數(shù)寄存器(低位地址是4000H,高位地址是4001H,,選擇該地址時(shí),,線路控制寄存器的D7=1)內(nèi)容為96,轉(zhuǎn)化成十六進(jìn)制是0060H,。
 線路控制寄存器地址為4003H,,它既是可寫的也是可讀的,該寄存器中的內(nèi)容規(guī)定了通信中一幀的格式,。本系統(tǒng)選擇通信格式為8 bit數(shù)據(jù)位,,1 bit停止位,1 bit偶校驗(yàn),因此線路控制寄存器的值為1B,。
 系統(tǒng)工作在中斷方式下,,允許接收錯(cuò)、發(fā)送寄存器空和接收數(shù)據(jù)就緒中斷,,因此中斷允許寄存器(地址為4001H,,選擇該地址時(shí)線路控制寄存器的D7=0)的值為07H。
 將TL16C750的接收準(zhǔn)備好信號(hào)(RXRDY)和發(fā)送準(zhǔn)備好信號(hào)(TXRDY)與DSP系統(tǒng)的外部中斷1(INT1)和中斷3(INT3)相連,。當(dāng)DSP接到串口中斷時(shí),,先屏蔽掉系統(tǒng)的其他中斷請(qǐng)求,然后將RXREADY賦值為1,,以便用來(lái)判斷DSP是否完成了此中斷響應(yīng),。如果鍵盤沒(méi)有終止串口通信,,則將存入緩沖存儲(chǔ)器組的數(shù)據(jù)上傳給上位機(jī),。串口通信的中斷子程序流程圖如圖2所示。

3.2 上位機(jī)串口通信軟件設(shè)計(jì)
 上位機(jī)程序使用Visual C++作為軟件開(kāi)發(fā)環(huán)境,。Visual C++在串口通信方面功能很強(qiáng),,不僅操作簡(jiǎn)單、代碼執(zhí)行速度快,,而且界面設(shè)計(jì)比較好[5],。使用Visual C++進(jìn)行串口開(kāi)發(fā)有多種方法,如Windows API通信函數(shù),、MSComm ActiveX串行通信控件,、Visual C++運(yùn)行庫(kù)函數(shù),第三方編寫通信類都可以實(shí)現(xiàn)串口編程,。本設(shè)計(jì)采用MSComm ActiveX串行通信控件來(lái)編寫通信程序,。
 MSComm ActiveX串行通信控件是Microsoft公司提供的簡(jiǎn)化Windows下串行通信編程的ActiveX控件[6]。它提供了事件驅(qū)動(dòng)方式和查詢方式兩種處理通信的方式,。查詢方式是通過(guò)檢查CommEvent屬性值來(lái)查詢事件和錯(cuò)誤,,然后進(jìn)行相應(yīng)的處理;而事件驅(qū)動(dòng)方式是在串口發(fā)生事件或錯(cuò)誤時(shí),,產(chǎn)生OnComm事件進(jìn)行相應(yīng)的處理,,它響應(yīng)及時(shí),可靠性高,,因此本文選用事件驅(qū)動(dòng)方式,。
 首先在VC中建立一個(gè)基于對(duì)話框的應(yīng)用程序,在該MFC項(xiàng)目中插入Microsoft Communication Control控件,。在使用該控件前,,先要對(duì)其進(jìn)行初始化設(shè)置,主要包括選擇COM口以及設(shè)置輸入方式、波特率,、數(shù)據(jù)位,、檢驗(yàn)位、停止位,、發(fā)送緩沖區(qū)大小和接收緩沖區(qū)大小等,。當(dāng)然不要忘記打開(kāi)串口,因?yàn)樵?2 bit Windows中,,串口和其他通信設(shè)備都被作為文件進(jìn)行處理,,在使用前必須先將其打開(kāi)。部分初始化程序如下:
    m_ctrlComm.SetCommPort(1),;   //選擇COM1
    m_ctrlComm.SetInputMode(1),;//輸入方式為二進(jìn)制方式
    m_ctrlComm.SetInBufferSize(1024);
//設(shè)置輸入緩沖區(qū)大小
    m_ctrlComm.SetOutBufferSize(1024),;
//設(shè)置輸出緩沖區(qū)大小
    m_ctrlComm.SetSettings(bc1),; //設(shè)置波特率、校驗(yàn)位,、數(shù)據(jù)位,、停止位。其中bc1是從串口參數(shù)設(shè)置組合框中得到并經(jīng)sprintf()函數(shù)格式化后的字符串
    if(!m_ctrlComm.GetPortOpen())
        m_ctrlComm.SetPortOpen(TRUE),;//打開(kāi)串口
    m_ctrlComm.SetRThreshold(1),; //參數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個(gè)字符時(shí)將引發(fā)一個(gè)接收數(shù)據(jù)的OnComm事件
    m_ctrlComm.SetSThreshold(1);//參數(shù)1表示當(dāng)傳輸緩沖區(qū)完全空時(shí)將引發(fā)一個(gè)接收數(shù)據(jù)的OnComm事件
    m_ctrlComm.SetInputLen(0),;
//設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長(zhǎng)度為0
    m_ctrlComm.GetInput(),;  
//先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)
 初始化完成后,按照通信協(xié)議在查詢?cè)O(shè)備和開(kāi)始采集按鈕所對(duì)應(yīng)的函數(shù)Oncheck()和Onstart()中編寫發(fā)送命令的字符串,。為了定時(shí)發(fā)送讀指令,,在Onstart()函數(shù)中添加計(jì)時(shí)器函數(shù)SetTimer(),當(dāng)采集結(jié)束時(shí),,一定要清除該計(jì)時(shí)器,。函數(shù)如下:
SetTimer(1,1000,,NULL),;
//創(chuàng)建一個(gè)計(jì)時(shí)器,每秒發(fā)送一次讀指令
KillTimer(1),; //銷毀該計(jì)時(shí)器
 當(dāng)接收緩沖器中有數(shù)據(jù)時(shí),,將會(huì)觸發(fā)OnComm事件,因此要在MSComm控件相應(yīng)的消息響應(yīng)函數(shù)OnOnCommMscomm1()中編寫數(shù)據(jù)處理程序,。由于串口通信接收和發(fā)送數(shù)據(jù)類型只能是VARIANT,,因此要將數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換,。將接收到的數(shù)據(jù)轉(zhuǎn)化成CString類,處理后將其保存到與之相連接的SQL Server 2000數(shù)據(jù)庫(kù)的表中,,以便在主界面中進(jìn)行顯示和相應(yīng)數(shù)據(jù)的處理,。
4 串口調(diào)試
 串口屬性設(shè)計(jì)完成后,運(yùn)行主界面,,單擊串口設(shè)置按鈕,,進(jìn)入串口通信界面,運(yùn)行界面如圖3所示,。
首先單擊串口參數(shù)設(shè)置按鈕,,設(shè)置串口通信的波特率、檢驗(yàn)位,、數(shù)據(jù)位和停止位,。波特率選擇9 600 b/s,1 bit偶校驗(yàn),,8 bit數(shù)據(jù)位,,1 bit停止位。設(shè)置完成后單擊設(shè)備查詢,,上位機(jī)將會(huì)向下位機(jī)發(fā)送設(shè)備查詢命令,,下位機(jī)收到查詢命令后,將返回相同的數(shù)據(jù),,如圖3中的a5 01 25 ff ff ff 5a,就是下位機(jī)返回給上位機(jī)的數(shù)據(jù),。上位機(jī)接收到該數(shù)據(jù),,說(shuō)明上下位機(jī)完成握手,數(shù)據(jù)能在兩者之間進(jìn)行實(shí)時(shí)傳送,。

 

 

 單擊開(kāi)始采集按鈕,,上位機(jī)定時(shí)向下位機(jī)發(fā)送讀指令,下位機(jī)接收到讀命令后,,將相關(guān)數(shù)據(jù)上傳給上位機(jī),。為了更加清楚地查看數(shù)據(jù)的傳輸過(guò)程,本文在串口對(duì)話框中加一個(gè)編輯框,,用來(lái)顯示下位機(jī)傳給上位機(jī)的數(shù)據(jù),,如圖3中的98 08 22 00 09 00 01就是下位機(jī)上傳的數(shù)據(jù)。其中,,0898是電壓值,,0022是電流值,0009是諧波電流值,,01表示保留一位小數(shù),,因此轉(zhuǎn)換成十進(jìn)制電壓是220 V,,電流是3.4 A,諧波電流是0.9 A,。
 當(dāng)需要修改下位機(jī)相關(guān)參數(shù)時(shí),,將寫命令填寫到圖3最下邊的編輯框中,然后單擊寫命令按鈕,,即會(huì)向下位機(jī)發(fā)送修改命令,。
 為了實(shí)現(xiàn)上位機(jī)對(duì)有源濾波器的監(jiān)控,本文設(shè)計(jì)了有源濾波器與上位機(jī)的RS-232串口通信,,并詳細(xì)介紹了串口通信的硬件電路,、通信協(xié)議和軟件編程。下位機(jī)使用C和匯編語(yǔ)言混合編程,,上位機(jī)使用Visual C++完成界面設(shè)計(jì),,并編寫MSComm通信控件。通過(guò)串口調(diào)試可知,,該設(shè)計(jì)能夠完成上位機(jī)對(duì)有源濾波器的實(shí)時(shí)監(jiān)控,。
參考文獻(xiàn)
[1] 曹衛(wèi)彬.C/C++串口通信典型應(yīng)用實(shí)例編程實(shí)踐[M].北京:電子工業(yè)出版社,2009.
[2] TL16C750 data sheet[DB/OL].[2011-12-16].http://www.icpdf.com/partnoview.asp,?id=733855_128973.
[3] 王曉麗.基于串口通信的摩托車前照燈檢測(cè)[J].小型內(nèi)燃機(jī)與摩托車,,2009,38(2):66-68.
[4] 劉樂(lè)善,,歐陽(yáng)星明,,劉學(xué)清.微型計(jì)算機(jī)接口技術(shù)及應(yīng)用[M].武漢:華中科技大學(xué)出版社,2000.
[5] 龔建偉,,熊光明.Visual C++/Turbo C串口通信編程實(shí)踐[M].北京:電子工業(yè)出版社,,2008.
[6] 王春曉,劉海.基于VB和MSComm的APF監(jiān)控系統(tǒng)設(shè)計(jì)[J].工業(yè)控制計(jì)算機(jī),,2010,,23(12):20-21.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載,。