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