光電編碼器是通過(guò)光電轉(zhuǎn)換將輸出軸上的機(jī)械幾何位移量轉(zhuǎn)換成一串脈沖或數(shù)字量的傳感器。在電機(jī)伺服控制系統(tǒng)中,它與電機(jī)同軸連接,常用來(lái)測(cè)量電機(jī)轉(zhuǎn)子的速度和位置[1]。近年來(lái),隨著研究室小批量軍工生產(chǎn)的開(kāi)展,需要批量采購(gòu)部分絕對(duì)值編碼器等外協(xié)器件。為方便檢驗(yàn)采購(gòu)的編碼器,保障生產(chǎn)任務(wù)的按時(shí)完成,設(shè)計(jì)了一個(gè)單圈絕對(duì)值編碼器實(shí)時(shí)讀出電路板,其結(jié)構(gòu)如圖1所示。基于此電路板,開(kāi)發(fā)出了一個(gè)程序,它能夠?qū)崿F(xiàn)將絕對(duì)值編碼器的數(shù)據(jù)讀入FPGA,并將數(shù)據(jù)轉(zhuǎn)換為角度值,最終驅(qū)動(dòng)液晶顯示屏實(shí)時(shí)輸出角度值。這使得不需要將編碼器數(shù)據(jù)輸入到計(jì)算機(jī)就可以處理轉(zhuǎn)化為角度值,使用更加方便。程序中用到了線(xiàn)性變換思想,可以應(yīng)用到其他程序中。電路板中用到的絕對(duì)值編碼器是BEI-IDEACOD公司的CHO5系列。液晶顯示屏為3.3 V供電的1602型LCD,F(xiàn)PGA采用的是Xilinx的Spartan-6系列。
1 數(shù)據(jù)讀入及去抖動(dòng)
本文所采用的絕對(duì)值編碼器是BEI-IDEACOD公司的CHO5系列,它采用并行輸出模式,有13 bit數(shù)據(jù)(Data[0]~Data[12]),讀出速度快。由于電動(dòng)機(jī)的旋轉(zhuǎn)或機(jī)械設(shè)備的震動(dòng),會(huì)使編碼器輸出脈沖抖動(dòng)[2],因此首先對(duì)編碼器脈沖進(jìn)行了去抖動(dòng)處理。下面的程序?qū)崿F(xiàn)了數(shù)據(jù)讀入,并在去抖動(dòng)后被鎖存在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)榻^對(duì)值編碼器(并行輸出)采用的是格雷碼二進(jìn)制輸出。格雷碼的特點(diǎn)是任意兩個(gè)相鄰位其輸出格雷碼值只有一位不同[3],這提高了數(shù)據(jù)輸出的穩(wěn)定性。假設(shè)二進(jìn)制格雷碼為Gn-1 Gn-2…G2G1G0,其所對(duì)應(yīng)的普通二進(jìn)制為Bn-1Bn-2…B2B1B0。那么它們最高位之間的對(duì)應(yīng)關(guān)系如式(1)所示,其他各位的對(duì)應(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)為角度值
絕對(duì)值編碼器的最小精度是由最低位決定的。因?yàn)樗玫慕^對(duì)值器是13 bit數(shù)據(jù)輸出,絕對(duì)值編碼器的最低位為1時(shí),對(duì)應(yīng)的角度值如式(3)所示:
因此,絕對(duì)值編碼器的最小精度為min=0.043 945 312 5°。也就是說(shuō)二進(jìn)制編碼每加1,度數(shù)就應(yīng)該增加0.043 945 312 5°。為方便在Verilog HDL中進(jìn)行處理,對(duì)這種十進(jìn)制數(shù)進(jìn)行一個(gè)線(xiàn)性變換,將其最小精度值對(duì)應(yīng)二進(jìn)制min_degree=2′b000000000000011010001100011000010111000101,其實(shí)就是十進(jìn)制數(shù)439 453 125對(duì)應(yīng)的二進(jìn)制數(shù)。相對(duì)于編碼器輸出的二進(jìn)制數(shù),將這個(gè)二進(jìn)制數(shù)稱(chēng)為編碼二進(jìn)制。這樣就對(duì)每一個(gè)編碼器輸出的13 bit二進(jìn)制進(jìn)行了一個(gè)線(xiàn)性變化,轉(zhuǎn)化為對(duì)應(yīng)的編碼二進(jìn)制Now_degree。其對(duì)應(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ù),需要求出每個(gè)數(shù)據(jù)位權(quán)值(即次位數(shù)據(jù)為1時(shí)的值)對(duì)應(yīng)的編碼二進(jìn)制,數(shù)據(jù)位權(quán)值對(duì)應(yīng)的編碼二進(jìn)制如表1所示。其中Decimal10_degree指的是小數(shù)點(diǎn)后第10位權(quán)值所對(duì)應(yīng)的編碼二進(jìn)制,以此類(lèi)推,Hundred_degree是百位上權(quán)值所對(duì)應(yīng)的編碼二進(jìn)制。
通過(guò)將Now_degree與各位對(duì)應(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)了將絕對(duì)值編碼器輸出的普通二進(jìn)制數(shù)轉(zhuǎn)化為角度值。例如,一個(gè)普通二進(jìn)制數(shù)0100100110010先通過(guò)式(3)運(yùn)算,轉(zhuǎn)化為Now_degree,然后再通過(guò)上述代碼就可以被轉(zhuǎn)化為103447265625(依次為從百位上的值到小數(shù)點(diǎn)后第10位上的值)。這樣就得到了角度值103.447 265 625°。
4 液晶顯示屏驅(qū)動(dòng)
LCD1602是一個(gè)16行2列的液晶顯示屏,因?yàn)樗枰臄?shù)據(jù)位(算上小數(shù)點(diǎn))總共14位,所以完全滿(mǎn)足角度值輸出要求。LCD1602內(nèi)置192種字符,顯示字符時(shí),要先輸入顯示字符地址,即告訴模塊在哪里顯示字符[4]。由于只需要顯示角度,因此只需要知道數(shù)字0~9和小數(shù)點(diǎn)(。)的地址就可以了,如表2所示。從表2中可以看出,數(shù)字地址的前4位都是0011,而后4位正好是數(shù)字的二進(jìn)制表示,這給編寫(xiě)驅(qū)動(dòng)液晶屏的編碼帶來(lái)了很大方便,可以直接采用類(lèi)似下面的語(yǔ)句輸出:
Lcd_data《={4′b0011,Hundred};
這樣就將從百位上的值Hundred到小數(shù)點(diǎn)后10位上的值Decimal10依次輸?shù)揭壕э@示屏上了。其中的Lcd_data是接LCD1602的8 bit數(shù)據(jù)位。上面并不是程序中的真正代碼,因?yàn)橐壕э@示屏驅(qū)動(dòng)需要初始化,且需要嚴(yán)格時(shí)序控制,程序較長(zhǎng),這里就不給出具體代碼了。
評(píng)論
查看更多