許德成,林 陽,李驊芮
(吉林師范大學 信息技術(shù)學院,吉林 四平 136000)
在新工科的背景下,電子信息類專業(yè)的實驗設(shè)計更偏向于綜合性、實踐性和創(chuàng)新性.電能參數(shù)測量是電能質(zhì)量監(jiān)控的一個關(guān)鍵環(huán)節(jié),工頻交流電參數(shù)的測量在工業(yè)控制、電力系統(tǒng)、電氣測量及各種機電一體化裝置中具有重要的意義[1-2].FPGA即現(xiàn)場可編程門陣列是在PAL、GAL、CPLD等可編程器件的基礎(chǔ)上進一步發(fā)展的產(chǎn)物,是作為專用集成電路(ASIC)領(lǐng)域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點.簡而言之,F(xiàn)PGA就是一個可以通過編程來改變內(nèi)部結(jié)構(gòu)的芯片.IM1227單相互感式電能計量模塊是專用測量芯片,能夠完成單相交流電能參數(shù)測量及數(shù)據(jù)的采集傳輸,它采用有效值測量方式,能夠準確測量單相交流電壓、電流、有功功率、有功總電能及功率因數(shù)等電參數(shù),其數(shù)據(jù)傳輸采用RS-485通訊接口[3],遵循MODBUS-RTU規(guī)約,具有極優(yōu)的性價比.
本實驗設(shè)計結(jié)合QUARTUS軟件平臺,應(yīng)用VHDL硬件描述語言完成控制部分設(shè)計,其中實驗包含軟件設(shè)計、功能仿真、硬件測試等環(huán)節(jié).該設(shè)計是一個值得研究且具有實際應(yīng)用意義的實驗課題.
IM1227模塊寄存器數(shù)據(jù)通信遵循MODBUS-RTU規(guī)約,MODBUS協(xié)議是在一根通訊線上采用主從應(yīng)答的通訊連接方式[4].首先,主機的信號尋址到唯一地址的終端設(shè)備(從機),然后終端設(shè)備發(fā)出的應(yīng)答信號以相反的方向傳輸給主機,即在一根單獨的通訊線上信號沿著相反的兩個方向傳輸所有的通訊數(shù)據(jù)流(半雙工的工作模式).MODBUS 協(xié)議只允許在主機和終端設(shè)備之間通訊,而不允許獨立的終端設(shè)備之間的數(shù)據(jù)交換,這樣各終端設(shè)備不會在它們初始化時占據(jù)通訊線路,而僅限于響應(yīng)到達本機的查詢信號[5].MODBUS協(xié)議查詢應(yīng)答數(shù)據(jù)流如圖1所示.
圖1 MODBUS協(xié)議查詢應(yīng)答數(shù)據(jù)流
實驗中設(shè)定數(shù)據(jù)傳輸波特率為9 600 bps.數(shù)據(jù)格式為10位,即起始位+8位數(shù)據(jù)位+停止位.其數(shù)據(jù)幀結(jié)構(gòu)如表1所示,可見一幀數(shù)據(jù)由多個字節(jié)組成,先送地址碼,然后確定要進行的功能操作,接著是要收發(fā)的數(shù)據(jù)段,最后是16位的CRC校驗碼[6].
表1 數(shù)據(jù)幀的結(jié)構(gòu)
實驗中主要是讀取模塊的測量結(jié)果,所以主機發(fā)送讀取命令,主機讀取的數(shù)據(jù)幀和從機回應(yīng)的數(shù)據(jù)幀示例如表2和表3所示.首先主機對01H地址的從機發(fā)送讀數(shù)據(jù)幀命令,確定讀取的起始地址及要讀取的寄存器數(shù),讀取地址從0048H開始,要讀取6個寄存器.這6個寄存器分別存儲的是測量出來的電壓、電流、有功功率、有功總電能高位、有功總電能低位及功率因數(shù).從機接收到命令后校驗CRC碼,如果接收無誤則回應(yīng)數(shù)據(jù),回應(yīng)的即為6個寄存器當中的數(shù)據(jù).每個寄存器中的數(shù)據(jù)均為2個字節(jié).主機取得數(shù)據(jù)后再按固定的公式進行數(shù)據(jù)的轉(zhuǎn)換即可.
表2 主機讀數(shù)據(jù)幀示例
表3 從機回應(yīng)數(shù)據(jù)幀示例
循環(huán)冗余校驗(CRC)是一種用于校驗通信鏈路上數(shù)字傳輸準確性的計算方法[7-8],發(fā)送方使用某公式計算出被傳送數(shù)據(jù)所含信息的一個值,并將此值附在被傳送數(shù)據(jù)后,接收方則對同一數(shù)據(jù)進行相同的計算,應(yīng)該得到相同的結(jié)果.如果這兩個CRC結(jié)果不一致,則說明發(fā)送中出現(xiàn)了差錯,接收方可要求發(fā)送方重新發(fā)送該數(shù)據(jù)[9-10].由于CRC 算法檢驗的檢錯能力極強,且檢測成本較低,因此在對于編碼器和電路的檢測中使用較為廣泛.MODBUS協(xié)議使用的多項式參數(shù)模型為X16+X15+X2+1,CRC碼由兩個字節(jié)構(gòu)成,其CRC值產(chǎn)生方式:在開始時CRC寄存器的每一位都預(yù)置為1,然后把CRC寄存器低八位與第一個字節(jié)數(shù)據(jù)進行異或,之后對CRC寄存器從高到低進行移位,在最高位的位置補零,其移出位如果為1,則把寄存器值與預(yù)定義的多項式碼進行異或,否則無需進行異或.重復上述的由高至低的移位8次,則第一個字節(jié)數(shù)據(jù)處理完畢,用此時CRC寄存器的值與下一個字節(jié)數(shù)據(jù)異或并進行如前一個數(shù)據(jù)似的8次移位.所有的字符處理完成后CRC寄存器內(nèi)的值即為最終的CRC值[11-12].以主機讀數(shù)據(jù)命令為例,由于要對6個字節(jié)進行校驗,因此輸入為48位數(shù)據(jù),其輸出則在6個字節(jié)基礎(chǔ)上添加兩個字節(jié)的校驗位.構(gòu)成了用于傳輸?shù)臄?shù)據(jù)組,設(shè)d為輸入數(shù)據(jù),q為輸出數(shù)據(jù).x為常數(shù)值“1010000000000001”.其VHDL代碼中用于校驗計算的進程為
process(clk,clr)
variable p:std_logic_vector(15 downto 0):=“1111111111111111”;
begin
if clr=‘1’ then p:=(others=>‘1’);
elsif clk’event and clk=‘1’ then
p:=“1111111111111111”;
for m in 6 downto 1 loop
p:=p(15 downto 8) & (d(m*8-1 downto m*8-8) xor p(7 downto 0));
for n in 0 to 7 loop
if p(0)=‘1’ then
p:=‘0’ & p(15 downto 1);
p:=p xor x;
else p:=‘0’ & p(15 downto 1);
end if;
end loop;
end loop;
end if;
q<=d& p;
end process;
校驗的仿真波形如圖2所示,可見當輸入數(shù)據(jù)為“010300480006H”時候,其輸出數(shù)據(jù)在輸入數(shù)據(jù)后附加上了兩個字節(jié)的CRC校驗碼.其校驗碼值為“45DE”.用于檢驗接收數(shù)據(jù)是否有錯誤.
圖2 CRC校驗仿真
數(shù)據(jù)發(fā)送流程如圖3所示,先對待發(fā)送的數(shù)據(jù)進行CRC校驗,得出16位校驗碼附在待發(fā)送數(shù)據(jù)后,然后將每個字節(jié)的8位數(shù)據(jù)附加上起始位和停止位構(gòu)成10位數(shù)據(jù)并存儲在寄存器中.當啟動信號出現(xiàn)有效脈沖后,從寄存器取出數(shù)據(jù)串口發(fā)送出去.發(fā)送的時鐘信號要和器件設(shè)置的波特率匹配.當IM1227模塊設(shè)置的波特率為9 600 bps時,通過分頻器將基準時鐘分頻為9 600 Hz.
圖3 數(shù)據(jù)發(fā)送流程圖
發(fā)送單字節(jié)的仿真如圖4所示,先在要發(fā)送的單字節(jié)數(shù)據(jù)上加上起始位和停止位.例如要發(fā)送數(shù)據(jù)2EH,則加上起始位和停止位后為“1001011100”,構(gòu)成10位數(shù)據(jù).然后在發(fā)送時鐘的驅(qū)動下按照先低位后高位的順序依次送到輸出端口UART_TX上.Send_over為單字節(jié)發(fā)送結(jié)束標志位,每發(fā)送完一個字節(jié)則產(chǎn)生一次高脈沖.
圖4 發(fā)送單字節(jié)數(shù)據(jù)仿真
數(shù)據(jù)發(fā)送模塊整體仿真圖如圖5所示,由仿真圖可以看出,當start出現(xiàn)啟動電平后,在UART_TX端口按照發(fā)送格式依次發(fā)送出主機讀數(shù)據(jù)幀序列01H、03H、00H、48H、00H、06H.一共包含6個字節(jié),每個字節(jié)都由起始位(低電平)、八位數(shù)據(jù)位(低位在前,高位在后)和停止位(高電平)構(gòu)成.先發(fā)送輸入的讀取命令,再發(fā)送校驗碼.
圖5 數(shù)據(jù)發(fā)送模塊仿真
當從機得到讀數(shù)據(jù)命令后,會將測量得到的數(shù)據(jù)送回主機.主機接收相應(yīng)的數(shù)據(jù).對于從機回應(yīng)的數(shù)據(jù)幀.主機接收完畢后先將數(shù)據(jù)進行CRC校驗,如果計算的校驗值和接收到的校驗值相同,則認為接收數(shù)據(jù)正確,這時可將各組測量結(jié)果數(shù)據(jù)存儲進可讀寫存儲器RAM.后期可根據(jù)需要調(diào)出存儲的數(shù)據(jù)進行相應(yīng)的處理.主機接收數(shù)據(jù)流程如圖6所示.
圖6 數(shù)據(jù)接收流程圖
對于單字節(jié)的數(shù)據(jù)接收,先判斷接收端口是否出現(xiàn)起始位(低電平),采用數(shù)據(jù)速率的16倍時鐘信號進行采樣,采樣時鐘連續(xù)采樣到8個低電平信號,可確定該低電平為真正的起始位,從而防止干擾信號產(chǎn)生的假起始位現(xiàn)象的發(fā)生.此后,接收器每隔16個采樣時鐘采樣一次,這樣每次采樣脈沖所對應(yīng)的數(shù)據(jù)波形正好是該位數(shù)據(jù)位波形的正中點,在該處讀寫數(shù)據(jù)是最安全的.依次把采樣到的數(shù)據(jù)以移位方式存入到接收移位寄存器.當接收完8位數(shù)據(jù)后,檢測到停止位(高電平),RX_Valid產(chǎn)生一個上升沿,標志這個字節(jié)接收完成.其接收單字節(jié)數(shù)據(jù)仿真如圖7所示,可見接收端UART_RX接收到數(shù)據(jù)序列,輸出端dataout依次得到了兩組數(shù)據(jù)即為接收的兩個單字節(jié)數(shù)據(jù).
圖7 接收單字節(jié)數(shù)據(jù)仿真
當啟動接收后,隨著串口信號輸入,此時讓存儲器的寫有效,將接收的各字節(jié)數(shù)據(jù)存入存儲器,當接收完成后,對有效數(shù)據(jù)進行CRC校驗處理,得出校驗值.將運算得到的校驗值和接收到的校驗值進行比較,如果相同則存儲數(shù)據(jù)正確,如果不同則重新接收再重新寫入存儲器.數(shù)據(jù)接收模塊的整體仿真如圖8所示,這里接收的數(shù)據(jù)設(shè)為7個字節(jié),分別為01H、03H、04H、57H、E4H、09H、D9H,接收到的從機回應(yīng)數(shù)據(jù)每完成一個字節(jié)的接收就將存儲器寫地址進行加1,接收完畢后經(jīng)運算得出的校驗值和接收的校驗值均為6DBAH,后期當存儲器讀有效時,可將存入的測量數(shù)據(jù)分7個通道輸出.
圖8 數(shù)據(jù)接收模塊仿真
IM1227測量電能參數(shù)寄存器數(shù)據(jù)處理如表4所示,可見當從機回應(yīng)數(shù)據(jù)幀為01H、03H、04H、57H、E4H、09H、D9H時.表明回應(yīng)的數(shù)據(jù)長度為4個字節(jié).即寄存器0048H值為0X57E4,則測量的電壓值為22 500/100=225 V.寄存器0049H值為0X09D9,則測量的電流值為2 521/1 000=2.521 A.測量得到的數(shù)據(jù)經(jīng)過運算處理后可以直接送出顯示.
表4 電能參數(shù)寄存器數(shù)據(jù)處理
本實驗應(yīng)用FPGA器件完成IM1227計量模塊控制電路的設(shè)計,包括數(shù)據(jù)幀的發(fā)送、接收及測量數(shù)據(jù)的運算.整體設(shè)計基于QUARTUS軟件平臺使用VHDL語言完成,采用自頂向下的設(shè)計方式,將整體文件分成不同的功能模塊最后再綜合成頂層文件.本實驗設(shè)計的電路具有較高的實用價值,其整體測量電路可廣泛應(yīng)用于節(jié)能改造、電力、通信、交通、環(huán)保等領(lǐng)域中的監(jiān)測交流設(shè)備的電流和電量消耗情況.