摘 要: 針對所設(shè)計(jì)的絕對值編碼器讀出電路板,用Verilog HDL設(shè)計(jì)了一種絕對值編碼器實(shí)時讀出程序??梢詫⒕幋a器數(shù)據(jù)讀入FPGA,并將編碼器輸出的普通二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為角度值,最后驅(qū)動液晶顯示屏實(shí)時讀出角度值。經(jīng)過測試,該程序能夠穩(wěn)定運(yùn)行在電路板上,完全滿足編碼器數(shù)據(jù)在液晶顯示屏上的實(shí)時讀出。本程序基于模塊化設(shè)計(jì),易于移植。
關(guān)鍵詞: 線性變換;編碼器;液晶顯示屏驅(qū)動;Verilog HDL
光電編碼器是通過光電轉(zhuǎn)換將輸出軸上的機(jī)械幾何位移量轉(zhuǎn)換成一串脈沖或數(shù)字量的傳感器。在電機(jī)伺服控制系統(tǒng)中,它與電機(jī)同軸連接,常用來測量電機(jī)轉(zhuǎn)子的速度和位置[1]。近年來,隨著研究室小批量軍工生產(chǎn)的開展,需要批量采購部分絕對值編碼器等外協(xié)器件。為方便檢驗(yàn)采購的編碼器,保障生產(chǎn)任務(wù)的按時完成,設(shè)計(jì)了一個單圈絕對值編碼器實(shí)時讀出電路板,其結(jié)構(gòu)如圖1所示?;诖穗娐钒?,開發(fā)出了一個程序,它能夠?qū)崿F(xiàn)將絕對值編碼器的數(shù)據(jù)讀入FPGA,并將數(shù)據(jù)轉(zhuǎn)換為角度值,最終驅(qū)動液晶顯示屏實(shí)時輸出角度值。這使得不需要將編碼器數(shù)據(jù)輸入到計(jì)算機(jī)就可以處理轉(zhuǎn)化為角度值,使用更加方便。程序中用到了線性變換思想,可以應(yīng)用到其他程序中。電路板中用到的絕對值編碼器是BEI-IDEACOD公司的CHO5系列。液晶顯示屏為3.3 V供電的1602型LCD,F(xiàn)PGA采用的是Xilinx的Spartan-6系列。
1 數(shù)據(jù)讀入及去抖動
本文所采用的絕對值編碼器是BEI-IDEACOD公司的CHO5系列,它采用并行輸出模式,有13 bit數(shù)據(jù)(Data[0]~Data[12]),讀出速度快。由于電動機(jī)的旋轉(zhuǎn)或機(jī)械設(shè)備的震動,會使編碼器輸出脈沖抖動[2],因此首先對編碼器脈沖進(jìn)行了去抖動處理。下面的程序?qū)崿F(xiàn)了數(shù)據(jù)讀入,并在去抖動后被鎖存在Gray_data中。
always@(posedge clk_50M)
begin
D0<={D0[1:0],Data[0]};
D1<={D1[1:0],Data[1]};
......
D11<={D11[1:0],Data[11]};
D12<={D12[1:0],Data[12]};
end
always@(posedge clk_50M)
begin
Gray_data[0]<=D0[2]&D[1]&D[0];
Gray_data[1]<=D1[2]&D[1]&D[0];
......
Gray_data[11]<=D11[2]&D[1]&D[0];
Gray_data[12]<=D12[2]&D[1]&D[0];
end
2 二進(jìn)制格雷碼轉(zhuǎn)普通格雷碼
上面得到數(shù)據(jù)Gray_data還是格雷碼,因?yàn)榻^對值編碼器(并行輸出)采用的是格雷碼二進(jìn)制輸出。格雷碼的特點(diǎn)是任意兩個相鄰位其輸出格雷碼值只有一位不同[3],這提高了數(shù)據(jù)輸出的穩(wěn)定性。假設(shè)二進(jìn)制格雷碼為Gn-1 Gn-2…G2G1G0,其所對應(yīng)的普通二進(jìn)制為Bn-1Bn-2…B2B1B0。那么它們最高位之間的對應(yīng)關(guān)系如式(1)所示,其他各位的對應(yīng)關(guān)系如式(2)所示。
Bn-1=Gn-1(1)
Bi-1=Gi-1^Bi, i=1,2,…,n-1(2)
根據(jù)式(1)和式(2),格雷碼二進(jìn)制轉(zhuǎn)化為普通二進(jìn)制的Verilog HDL代碼如下:
always@(posedge Clk_50M)
begin
Binary_data[12]=Gray_data[12];
Binary_data[11]=Binary_data[12]^Gray_data[11];
Binary_data[10]=Binary_data[11]^Gray_data[10];
......
Binary_data[1]=Binary_data[2]^Gray_data[1];
Binary_data[0]=Binary_data[1]^Gray_data[0];
end
該程序?qū)崿F(xiàn)了由格雷碼二進(jìn)制Gray_data向普通二進(jìn)制Binary_data的轉(zhuǎn)換。
3 將二進(jìn)制轉(zhuǎn)為角度值
絕對值編碼器的最小精度是由最低位決定的。因?yàn)樗玫慕^對值器是13 bit數(shù)據(jù)輸出,絕對值編碼器的最低位為1時,對應(yīng)的角度值如式(3)所示:
因此,絕對值編碼器的最小精度為min=0.043 945 312 5°。也就是說二進(jìn)制編碼每加1,度數(shù)就應(yīng)該增加0.043 945 312 5°。為方便在Verilog HDL中進(jìn)行處理,對這種十進(jìn)制數(shù)進(jìn)行一個線性變換,將其最小精度值對應(yīng)二進(jìn)制min_degree=2′b000000000000011010001100011000010111000101,其實(shí)就是十進(jìn)制數(shù)439 453 125對應(yīng)的二進(jìn)制數(shù)。相對于編碼器輸出的二進(jìn)制數(shù),將這個二進(jìn)制數(shù)稱為編碼二進(jìn)制。這樣就對每一個編碼器輸出的13 bit二進(jìn)制進(jìn)行了一個線性變化,轉(zhuǎn)化為對應(yīng)的編碼二進(jìn)制Now_degree。其對應(yīng)關(guān)系如式(4)所示,其中的“<<”是左移位運(yùn)算符。
Now_degree=Binary_data[0]min_degree+Binary_data[1](min_degree<<1)++Binary_data[11](min_degree<<11)+ Binary_data[12](min_degree<<12) (4)
為了得出在每一數(shù)據(jù)位(百位、十位、一直到小數(shù)點(diǎn)后10位)上需要輸出什么數(shù)據(jù),需要求出每個數(shù)據(jù)位權(quán)值(即次位數(shù)據(jù)為1時的值)對應(yīng)的編碼二進(jìn)制,數(shù)據(jù)位權(quán)值對應(yīng)的編碼二進(jìn)制如表1所示。其中Decimal10_degree指的是小數(shù)點(diǎn)后第10位權(quán)值所對應(yīng)的編碼二進(jìn)制,以此類推,Hundred_degree是百位上權(quán)值所對應(yīng)的編碼二進(jìn)制。
通過將Now_degree與各位對應(yīng)的編碼二進(jìn)制一一比較,使用狀態(tài)機(jī)得出具體實(shí)現(xiàn)各數(shù)據(jù)位上的數(shù)值:Decimal1Decimal1、Single、Ten、Hundred。具體Verilog HDL代碼如下所示:
always@(posedge Clk_50M)
begin
4′b0000:
begin
if(Buf_degree>=Hundred_degree)
begin
Buf_degree=Buf_degree-Hundred_degree;
Temp_Hundred=Temp_Hundred+1;
Sta=4′b0000;
end
else
begin
Sta=4′b0010;
end
end
4′b0001:
begin
if(Buf_degree>=Ten_degree)
begin
Buf_degree=Buf_degree-Ten_degree;
Temp_Ten=Temp_Ten+1;
Sta=4′b0001;
end
else
begin
Sta=4′b0010;
end
end
4′b1100:
begin
if(Buf_degree>=Decimal10_degree)
begin
Buf_degree=Buf_degree-Decimal10_degree;
Temp_Decimal10=Temp_Decimal10+1;
Sta=4′b1101;
end
else
begin
Sta=4′b1101;
end
end
4′b1101:begin
Hundred=Temp_Hundred;
Ten=Temp_Ten;
Single=Temp_Single;
Decimal1=Temp_Decimal1;
Decimal2=Temp_Decimal2;
Decimal3=Temp_Decimal3;
Decimal4=Temp_Decimal4;
Decimal5=Temp_Decimal5;
Decimal6=Temp_Decimal6;
Decimal7=Temp_Decimal7;
Decimal8=Temp_Decimal8;
Decimal9=Temp_Decimal9;
Decimal10=Temp_Decimal10;
Sta=4′b0000;
end
default:begin
Sta=4′b0000;
end
endcase
end
該程序最終實(shí)現(xiàn)了將絕對值編碼器輸出的普通二進(jìn)制數(shù)轉(zhuǎn)化為角度值。例如,一個普通二進(jìn)制數(shù)0100100110010先通過式(3)運(yùn)算,轉(zhuǎn)化為Now_degree,然后再通過上述代碼就可以被轉(zhuǎn)化為103447265625(依次為從百位上的值到小數(shù)點(diǎn)后第10位上的值)。這樣就得到了角度值103.447 265 625°。
4 液晶顯示屏驅(qū)動
LCD1602是一個16行2列的液晶顯示屏,因?yàn)樗枰臄?shù)據(jù)位(算上小數(shù)點(diǎn))總共14位,所以完全滿足角度值輸出要求。LCD1602內(nèi)置192種字符,顯示字符時,要先輸入顯示字符地址,即告訴模塊在哪里顯示字符[4]。由于只需要顯示角度,因此只需要知道數(shù)字0~9和小數(shù)點(diǎn)(.)的地址就可以了,如表2所示。從表2中可以看出,數(shù)字地址的前4位都是0011,而后4位正好是數(shù)字的二進(jìn)制表示,這給編寫驅(qū)動液晶屏的編碼帶來了很大方便,可以直接采用類似下面的語句輸出:
Lcd_data<={4′b0011,Hundred};
這樣就將從百位上的值Hundred到小數(shù)點(diǎn)后10位上的值Decimal10依次輸?shù)揭壕э@示屏上了。其中的Lcd_data是接LCD1602的8 bit數(shù)據(jù)位。上面并不是程序中的真正代碼,因?yàn)橐壕э@示屏驅(qū)動需要初始化,且需要嚴(yán)格時序控制,程序較長,這里就不給出具體代碼了。
把程序下載到開發(fā)板后,程序運(yùn)行正常,角度值被寫到了液晶顯示屏第一行上,如圖3所示。液晶屏動態(tài)刷新顯示,程序中設(shè)計(jì)每隔900 ns讀入一個字符,讀入16個字符共需0.014 4 ms。顯示所有的8 192個狀態(tài)(即旋轉(zhuǎn)一周)最短需要117.964 8 ms,因此能夠?qū)崿F(xiàn)實(shí)時顯示。通過檢驗(yàn),該系統(tǒng)運(yùn)行穩(wěn)定,能夠獲得穩(wěn)定的角度值輸出。
本文用Verilog HDL設(shè)計(jì)了一種絕對值編碼器實(shí)時讀出程序,仿真和在電路板上的測試表明,該絕對值編碼器運(yùn)行正常。程序采用模塊化編程,一致性較好。其中,在二進(jìn)制數(shù)轉(zhuǎn)角度值時用到了線性變換的思想,解決了在用Verilog HDL處理角度值輸出問題。使編碼器數(shù)據(jù)不傳入計(jì)算機(jī)也可以得到處理,具有較大實(shí)用性。
參考文獻(xiàn)
[1] 陳赟,趙興國.基于PCI總線的單圈絕對式光電軸角編碼器實(shí)時數(shù)據(jù)采集系統(tǒng)[J].光子學(xué)報,2007,36(3):421-424.
[2] 夏冬梅,孫林.基于CPLD的增量式旋轉(zhuǎn)編碼器接口電路模塊設(shè)計(jì)[J].機(jī)械制造與自動化,2009(5):156-157,160.
[3] 周政,李菊芬.絕對值編碼器在高爐料車控制中的應(yīng)用[J].南鋼科技與管理,2006(2):47-48.
[4] 于志贛,劉國平,張旭斌.液晶LCD1602模塊的應(yīng)用[J].機(jī)電技術(shù),2009(3):58-59.